<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://fire.station.wiki.shizainc.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mr.+Samuel</id>
	<title>FIRE STATION WIKI - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://fire.station.wiki.shizainc.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mr.+Samuel"/>
	<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Mr._Samuel"/>
	<updated>2026-05-07T15:42:29Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D1%8B%D0%B5_%D1%80%D0%BE%D0%BB%D0%B8&amp;diff=18082</id>
		<title>Игровые роли</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D1%8B%D0%B5_%D1%80%D0%BE%D0%BB%D0%B8&amp;diff=18082"/>
		<updated>2026-04-11T20:10:11Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ТаблицаРолей&lt;br /&gt;
| Название = Управление учреждения&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(Командование)&lt;br /&gt;
| Цвет_карточки = #465298&lt;br /&gt;
| Цвет_заголовка = #465298&lt;br /&gt;
| Иконка = Cmd dep.png&lt;br /&gt;
| Глава = Директор Участка&lt;br /&gt;
| Связь = :а&lt;br /&gt;
| Руководства = [[Стандартные_Протоколы_(Командование)|Стандартные протоколы]] • [[Цели комплекса]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Директор Участка|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=DC.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный научный сотрудник|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=ДНС.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Начальник службы безопасности|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=Глава Службы Безопасности.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный врач|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=ChiefMedicalOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Квартирмейстер|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=СЛО.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Менеджер по персоналу|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=Глава_Персонала.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ведущий инженер|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=CE.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Комитет по этике&lt;br /&gt;
| Ссылка = Комитет по этике&lt;br /&gt;
| Цвет_карточки = #741b47&lt;br /&gt;
| Цвет_заголовка = #741b47&lt;br /&gt;
| Иконка = Law_dep.png&lt;br /&gt;
| Глава = Председатель Одонго Теджани&lt;br /&gt;
| Связь = :э&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Правовой_кодекс_персонала#Кодекс_Этики|Кодекс Этики]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Представитель Комитета|Цвет_карточки=#741b47|Цвет_заголовка=#741b47|Изображение=ПНТ.png|Фикс_Кривых_Картинок=60px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название = Служба безопасности&lt;br /&gt;
|Цвет_карточки=#770101&lt;br /&gt;
|Цвет_заголовка=#770101&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&lt;br /&gt;
|Содержание=&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Отряд специального назначения Службы безопасности&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(СБ)#Отряд специального назначения&lt;br /&gt;
| Цвет_карточки = #770101&lt;br /&gt;
| Цвет_заголовка = #770101&lt;br /&gt;
| Иконка = Sec_dep.png&lt;br /&gt;
| Глава = Командир ОСН&lt;br /&gt;
| Связь = :о&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Служба_безопасности|Стандартные протоколы]] • [[Инвентарь службы безопасности]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Командир ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityCommander.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Старший офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityCommandant.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Младший офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecuritySoldier.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Комендантский отряд Службы безопасности&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(СБ)#Комендантский отряд&lt;br /&gt;
| Цвет_карточки = #999999&lt;br /&gt;
| Цвет_заголовка = #999999&lt;br /&gt;
| Иконка = Esd_dep.png&lt;br /&gt;
| Глава = Главный комендант&lt;br /&gt;
| Связь = :к&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Служба_безопасности|Стандартные протоколы]] • [[Инвентарь службы безопасности]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=SecurityWarden.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Старший комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=ExternalSecurityCommandant.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Амнестезиолог|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=Brigmedic.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=CDCSecurityOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Младший комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=CDCSecurityOfficer.png}}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Медицинская служба&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(Медицина)&lt;br /&gt;
| Цвет_карточки = #3b627a&lt;br /&gt;
| Цвет_заголовка = #3b627a&lt;br /&gt;
| Иконка = Med_dep.png&lt;br /&gt;
| Глава = Главный врач&lt;br /&gt;
| Связь = :м&lt;br /&gt;
| Руководства = [[Медицина]] • [[Химия]] • [[Стандартные_Протоколы_(Медицина)|Стандартные протоколы]] • [[Медицинский инвентарь]] • [[Таблица психических заболеваний]] • [[Хирургия]] • [[Амнезиаки]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Главный врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=ChiefMedicalOfficer.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Senior_physician.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Фармацевт&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=WolterWhite.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Врач.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Парапсихолог&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Психолог.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Медицинский ассистент&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Интерн.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Научная служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Наука)&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Иконка=Sci_dep.png&lt;br /&gt;
|Глава=Главный научный сотрудник&lt;br /&gt;
|Связь=:н&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Наука)|Стандартные протоколы]], [[Руководство по исследованию и разработке]], [[Постройка компьютеров и машинерии]], [[Робототехника|Руководство по робототехнике]], [[Руководство по ксеноархеологии]], [[Аномалистика|Руководство по аномалиям]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Главный научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=ДНС.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Ведущий учёный.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Учёный.png&lt;br /&gt;
|Фикс_Кривых_Картинок=73px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Производственный специалист&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Робототехник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=69px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Лаборант-практик&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=ResearchAssistant.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Инженерно-техническая служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Инженерия)&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Иконка=Eng_dep.png&lt;br /&gt;
|Глава=Ведущий инженер&lt;br /&gt;
|Связь=:и&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Инженерия)|Стандартные протоколы]] • [[Электроэнергия]] • [[Строительство]] • [[Руководство по атмосфере]] • [[Руководство по взлому]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Ведущий инженер&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=CE.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший инженер&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Ведущий Инженер.png&lt;br /&gt;
|Фикс_Кривых_Картинок=60px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Электротехник&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Электротехник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Техник&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Инженер.png&lt;br /&gt;
|Фикс_Кривых_Картинок=62px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Техник-стажёр&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Технический ассистент.png&lt;br /&gt;
|Фикс_Кривых_Картинок=62px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Служба логистики&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Снабжение)&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Иконка=Cargo_dep.png&lt;br /&gt;
|Глава=Квартирмейстер&lt;br /&gt;
|Связь=:л&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Снабжение)|Стандартные протоколы]] • [[Инвентарь Службы логистики]] • [[Таблица грузов]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Квартирмейстер&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Изображение=СЛО.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Логист&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Изображение=Грузчик.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Сервисная служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Сервис)&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Иконка=Serv_dep.png&lt;br /&gt;
|Глава=Менеджер по персоналу&lt;br /&gt;
|Связь=:с&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Сервис)|Стандартные протоколы]] • [[Гидропоника]] • [[Напитки]] • Готовка • [[Инвентарь сервисного отдела]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Гастроном&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Шеф-повар.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Ботаник-фитогенетик&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Ботаник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=83px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Обслуживающий персонал&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Обслуживающий персонал.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Персонал класса D&lt;br /&gt;
| Ссылка = Стандартные процедуры персонала класса D#Стандартные процедуры персонала класса D&lt;br /&gt;
| Цвет_карточки = #91381e&lt;br /&gt;
| Цвет_заголовка = #91381e&lt;br /&gt;
| Иконка = DclassDEP.png&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Сотрудник класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=D class.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Уборщик класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassJan.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Повар класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassCock.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ботаник класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassBotan.png}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Административный филиал&lt;br /&gt;
| Ссылка = Руководство Фонда&lt;br /&gt;
| Цвет_карточки = #002f1f&lt;br /&gt;
| Цвет_заголовка = #002f1f&lt;br /&gt;
| Связь = :р, :э&lt;br /&gt;
| Руководства = [[Региональное_управление|Стандартные протоколы]] • [[Бюрократия]] • [[Документация Фонда]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Региональный Директор|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Региональный Директор.png|Фикс_Кривых_Картинок=118px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Оператор РУ|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=CCoperator.png|Фикс_Кривых_Картинок=64px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Штаб О4|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Оператор O4.png|Фикс_Кривых_Картинок=118px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Совет Смотрителей|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Overseer.png|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Комитет по этике|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Ethics.png|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Мобильные оперативные группы&lt;br /&gt;
| Ссылка = Мобильные оперативные группы&lt;br /&gt;
| Цвет_карточки = #12466E&lt;br /&gt;
| Цвет_заголовка = #12466E&lt;br /&gt;
| Связь = :р&lt;br /&gt;
| Руководства = [[Мобильные_оперативные_группы|Стандартные протоколы]] • [[Инструкция по ВУС SCP]] • [[Снаряжение МОГ]] • [[Объекты|Объекты SCP]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Эпсилон-11 &amp;quot;Девятихвостая лиса&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Epsilon11.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ню-7 &amp;quot;Удар молота&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Nu7.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Бета-7 &amp;quot;Шляпные болванчики&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Beta7.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Альфа-1 &amp;quot;Багряная десница&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Alpha1.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Омега-1 &amp;quot;Шуйца Закона&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Omega1.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Отдел по Применению Искусственного Интеллекта&lt;br /&gt;
| Ссылка = Законы синтетиков&lt;br /&gt;
| Цвет_карточки = #1E90FF&lt;br /&gt;
| Цвет_заголовка = #1E90FF&lt;br /&gt;
| Иконка = Cyborg_dep.png&lt;br /&gt;
| Связь = :&amp;lt;&lt;br /&gt;
| Руководства = [[Законы синтетиков]] • [[Документация Фонда]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Рекрут с искусственным интеллектом|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=8b8bit.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Борги|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=Robots+sunrise.gif}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Персональный РИИ|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=PAI.gif}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Связанные Организации&lt;br /&gt;
| Ссылка = Повстанцы Хаоса&lt;br /&gt;
| Цвет_карточки = #770101&lt;br /&gt;
| Цвет_заголовка = #770101&lt;br /&gt;
| Иконка = &lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Повстанцы Хаоса|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=CIRegularOperative.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Агент Повстанцев Хаоса|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ДиверсантыПХ.png|Фикс_Кривых_Картинок=83px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D1%8B%D0%B5_%D1%80%D0%BE%D0%BB%D0%B8&amp;diff=18081</id>
		<title>Игровые роли</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D1%8B%D0%B5_%D1%80%D0%BE%D0%BB%D0%B8&amp;diff=18081"/>
		<updated>2026-04-11T20:09:47Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ТаблицаРолей&lt;br /&gt;
| Название = Управление учреждения&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(Командование)&lt;br /&gt;
| Цвет_карточки = #465298&lt;br /&gt;
| Цвет_заголовка = #465298&lt;br /&gt;
| Иконка = Cmd dep.png&lt;br /&gt;
| Глава = Директор Участка&lt;br /&gt;
| Связь = :а&lt;br /&gt;
| Руководства = [[Стандартные_Протоколы_(Командование)|Стандартные протоколы]] • [[Цели комплекса]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Директор Участка|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=DC.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный научный сотрудник|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=ДНС.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Начальник службы безопасности|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=Глава Службы Безопасности.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный врач|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=ChiefMedicalOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Квартирмейстер|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=СЛО.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Менеджер по персоналу|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=Глава_Персонала.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ведущий инженер|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=CE.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Комитет по этике&lt;br /&gt;
| Ссылка = Комитет по этике&lt;br /&gt;
| Цвет_карточки = #741b47&lt;br /&gt;
| Цвет_заголовка = #741b47&lt;br /&gt;
| Иконка = Law_dep.png&lt;br /&gt;
| Глава = Председатель Одонго Теджани&lt;br /&gt;
| Связь = :э&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Правовой_кодекс_персонала#Кодекс_Этики|Кодекс Этики]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Представитель Комитета|Цвет_карточки=#741b47|Цвет_заголовка=#741b47|Изображение=ПНТ.png|Фикс_Кривых_Картинок=60px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название = Служба безопасности&lt;br /&gt;
|Цвет_карточки=#770101&lt;br /&gt;
|Цвет_заголовка=#770101&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Содержание=&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Отряд специального назначения Службы безопасности&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(СБ)#Отряд специального назначения&lt;br /&gt;
| Цвет_карточки = #770101&lt;br /&gt;
| Цвет_заголовка = #770101&lt;br /&gt;
| Иконка = Sec_dep.png&lt;br /&gt;
| Глава = Командир ОСН&lt;br /&gt;
| Связь = :о&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Служба_безопасности|Стандартные протоколы]] • [[Инвентарь службы безопасности]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Командир ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityCommander.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Старший офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityCommandant.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Младший офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecuritySoldier.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Комендантский отряд Службы безопасности&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(СБ)#Комендантский отряд&lt;br /&gt;
| Цвет_карточки = #999999&lt;br /&gt;
| Цвет_заголовка = #999999&lt;br /&gt;
| Иконка = Esd_dep.png&lt;br /&gt;
| Глава = Главный комендант&lt;br /&gt;
| Связь = :к&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Служба_безопасности|Стандартные протоколы]] • [[Инвентарь службы безопасности]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=SecurityWarden.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Старший комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=ExternalSecurityCommandant.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Амнестезиолог|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=Brigmedic.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=CDCSecurityOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Младший комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=CDCSecurityOfficer.png}}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Медицинская служба&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(Медицина)&lt;br /&gt;
| Цвет_карточки = #3b627a&lt;br /&gt;
| Цвет_заголовка = #3b627a&lt;br /&gt;
| Иконка = Med_dep.png&lt;br /&gt;
| Глава = Главный врач&lt;br /&gt;
| Связь = :м&lt;br /&gt;
| Руководства = [[Медицина]] • [[Химия]] • [[Стандартные_Протоколы_(Медицина)|Стандартные протоколы]] • [[Медицинский инвентарь]] • [[Таблица психических заболеваний]] • [[Хирургия]] • [[Амнезиаки]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Главный врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=ChiefMedicalOfficer.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Senior_physician.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Фармацевт&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=WolterWhite.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Врач.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Парапсихолог&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Психолог.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Медицинский ассистент&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Интерн.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Научная служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Наука)&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Иконка=Sci_dep.png&lt;br /&gt;
|Глава=Главный научный сотрудник&lt;br /&gt;
|Связь=:н&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Наука)|Стандартные протоколы]], [[Руководство по исследованию и разработке]], [[Постройка компьютеров и машинерии]], [[Робототехника|Руководство по робототехнике]], [[Руководство по ксеноархеологии]], [[Аномалистика|Руководство по аномалиям]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Главный научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=ДНС.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Ведущий учёный.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Учёный.png&lt;br /&gt;
|Фикс_Кривых_Картинок=73px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Производственный специалист&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Робототехник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=69px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Лаборант-практик&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=ResearchAssistant.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Инженерно-техническая служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Инженерия)&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Иконка=Eng_dep.png&lt;br /&gt;
|Глава=Ведущий инженер&lt;br /&gt;
|Связь=:и&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Инженерия)|Стандартные протоколы]] • [[Электроэнергия]] • [[Строительство]] • [[Руководство по атмосфере]] • [[Руководство по взлому]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Ведущий инженер&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=CE.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший инженер&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Ведущий Инженер.png&lt;br /&gt;
|Фикс_Кривых_Картинок=60px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Электротехник&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Электротехник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Техник&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Инженер.png&lt;br /&gt;
|Фикс_Кривых_Картинок=62px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Техник-стажёр&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Технический ассистент.png&lt;br /&gt;
|Фикс_Кривых_Картинок=62px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Служба логистики&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Снабжение)&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Иконка=Cargo_dep.png&lt;br /&gt;
|Глава=Квартирмейстер&lt;br /&gt;
|Связь=:л&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Снабжение)|Стандартные протоколы]] • [[Инвентарь Службы логистики]] • [[Таблица грузов]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Квартирмейстер&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Изображение=СЛО.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Логист&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Изображение=Грузчик.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Сервисная служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Сервис)&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Иконка=Serv_dep.png&lt;br /&gt;
|Глава=Менеджер по персоналу&lt;br /&gt;
|Связь=:с&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Сервис)|Стандартные протоколы]] • [[Гидропоника]] • [[Напитки]] • Готовка • [[Инвентарь сервисного отдела]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Гастроном&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Шеф-повар.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Ботаник-фитогенетик&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Ботаник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=83px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Обслуживающий персонал&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Обслуживающий персонал.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Персонал класса D&lt;br /&gt;
| Ссылка = Стандартные процедуры персонала класса D#Стандартные процедуры персонала класса D&lt;br /&gt;
| Цвет_карточки = #91381e&lt;br /&gt;
| Цвет_заголовка = #91381e&lt;br /&gt;
| Иконка = DclassDEP.png&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Сотрудник класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=D class.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Уборщик класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassJan.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Повар класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassCock.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ботаник класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassBotan.png}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Административный филиал&lt;br /&gt;
| Ссылка = Руководство Фонда&lt;br /&gt;
| Цвет_карточки = #002f1f&lt;br /&gt;
| Цвет_заголовка = #002f1f&lt;br /&gt;
| Связь = :р, :э&lt;br /&gt;
| Руководства = [[Региональное_управление|Стандартные протоколы]] • [[Бюрократия]] • [[Документация Фонда]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Региональный Директор|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Региональный Директор.png|Фикс_Кривых_Картинок=118px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Оператор РУ|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=CCoperator.png|Фикс_Кривых_Картинок=64px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Штаб О4|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Оператор O4.png|Фикс_Кривых_Картинок=118px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Совет Смотрителей|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Overseer.png|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Комитет по этике|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Ethics.png|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Мобильные оперативные группы&lt;br /&gt;
| Ссылка = Мобильные оперативные группы&lt;br /&gt;
| Цвет_карточки = #12466E&lt;br /&gt;
| Цвет_заголовка = #12466E&lt;br /&gt;
| Связь = :р&lt;br /&gt;
| Руководства = [[Мобильные_оперативные_группы|Стандартные протоколы]] • [[Инструкция по ВУС SCP]] • [[Снаряжение МОГ]] • [[Объекты|Объекты SCP]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Эпсилон-11 &amp;quot;Девятихвостая лиса&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Epsilon11.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ню-7 &amp;quot;Удар молота&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Nu7.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Бета-7 &amp;quot;Шляпные болванчики&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Beta7.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Альфа-1 &amp;quot;Багряная десница&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Alpha1.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Омега-1 &amp;quot;Шуйца Закона&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Omega1.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Отдел по Применению Искусственного Интеллекта&lt;br /&gt;
| Ссылка = Законы синтетиков&lt;br /&gt;
| Цвет_карточки = #1E90FF&lt;br /&gt;
| Цвет_заголовка = #1E90FF&lt;br /&gt;
| Иконка = Cyborg_dep.png&lt;br /&gt;
| Связь = :&amp;lt;&lt;br /&gt;
| Руководства = [[Законы синтетиков]] • [[Документация Фонда]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Рекрут с искусственным интеллектом|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=8b8bit.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Борги|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=Robots+sunrise.gif}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Персональный РИИ|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=PAI.gif}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Связанные Организации&lt;br /&gt;
| Ссылка = Повстанцы Хаоса&lt;br /&gt;
| Цвет_карточки = #770101&lt;br /&gt;
| Цвет_заголовка = #770101&lt;br /&gt;
| Иконка = &lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Повстанцы Хаоса|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=CIRegularOperative.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Агент Повстанцев Хаоса|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ДиверсантыПХ.png|Фикс_Кривых_Картинок=83px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D1%8B%D0%B5_%D1%80%D0%BE%D0%BB%D0%B8&amp;diff=18080</id>
		<title>Игровые роли</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%98%D0%B3%D1%80%D0%BE%D0%B2%D1%8B%D0%B5_%D1%80%D0%BE%D0%BB%D0%B8&amp;diff=18080"/>
		<updated>2026-04-11T20:08:54Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ТаблицаРолей&lt;br /&gt;
| Название = Управление учреждения&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(Командование)&lt;br /&gt;
| Цвет_карточки = #465298&lt;br /&gt;
| Цвет_заголовка = #465298&lt;br /&gt;
| Иконка = Cmd dep.png&lt;br /&gt;
| Глава = Директор Участка&lt;br /&gt;
| Связь = :а&lt;br /&gt;
| Руководства = [[Стандартные_Протоколы_(Командование)|Стандартные протоколы]] • [[Цели комплекса]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Директор Участка|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=DC.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный научный сотрудник|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=ДНС.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Начальник службы безопасности|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=Глава Службы Безопасности.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный врач|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=ChiefMedicalOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Квартирмейстер|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=СЛО.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Менеджер по персоналу|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=Глава_Персонала.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ведущий инженер|Цвет_карточки=#465298|Цвет_заголовка=#465298|Изображение=CE.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Комитет по этике&lt;br /&gt;
| Ссылка = Комитет по этике&lt;br /&gt;
| Цвет_карточки = #741b47&lt;br /&gt;
| Цвет_заголовка = #741b47&lt;br /&gt;
| Иконка = Law_dep.png&lt;br /&gt;
| Глава = Председатель Одонго Теджани&lt;br /&gt;
| Связь = :э&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Правовой_кодекс_персонала#Кодекс_Этики|Кодекс Этики]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Представитель Комитета|Цвет_карточки=#741b47|Цвет_заголовка=#741b47|Изображение=ПНТ.png|Фикс_Кривых_Картинок=60px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название = Служба безопасности&lt;br /&gt;
|Цвет_карточки=#770101&lt;br /&gt;
|Цвет_заголовка=#770101&lt;br /&gt;
|Содержание=&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Отряд специального назначения Службы безопасности&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(СБ)#Отряд специального назначения&lt;br /&gt;
| Цвет_карточки = #770101&lt;br /&gt;
| Цвет_заголовка = #770101&lt;br /&gt;
| Иконка = Sec_dep.png&lt;br /&gt;
| Глава = Командир ОСН&lt;br /&gt;
| Связь = :о&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Служба_безопасности|Стандартные протоколы]] • [[Инвентарь службы безопасности]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Командир ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityCommander.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Старший офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityCommandant.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecurityOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Младший офицер ОСН|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ExternalSecuritySoldier.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Комендантский отряд Службы безопасности&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(СБ)#Комендантский отряд&lt;br /&gt;
| Цвет_карточки = #999999&lt;br /&gt;
| Цвет_заголовка = #999999&lt;br /&gt;
| Иконка = Esd_dep.png&lt;br /&gt;
| Глава = Главный комендант&lt;br /&gt;
| Связь = :к&lt;br /&gt;
| Руководства = [[Документация Фонда]] • [[Служба_безопасности|Стандартные протоколы]] • [[Инвентарь службы безопасности]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Главный комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=SecurityWarden.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Старший комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=ExternalSecurityCommandant.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Амнестезиолог|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=Brigmedic.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=CDCSecurityOfficer.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Младший комендант|Цвет_карточки=#999999|Цвет_заголовка=#999999|Изображение=CDCSecurityOfficer.png}}&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Медицинская служба&lt;br /&gt;
| Ссылка = Стандартные_Протоколы_(Медицина)&lt;br /&gt;
| Цвет_карточки = #3b627a&lt;br /&gt;
| Цвет_заголовка = #3b627a&lt;br /&gt;
| Иконка = Med_dep.png&lt;br /&gt;
| Глава = Главный врач&lt;br /&gt;
| Связь = :м&lt;br /&gt;
| Руководства = [[Медицина]] • [[Химия]] • [[Стандартные_Протоколы_(Медицина)|Стандартные протоколы]] • [[Медицинский инвентарь]] • [[Таблица психических заболеваний]] • [[Хирургия]] • [[Амнезиаки]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Главный врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=ChiefMedicalOfficer.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Senior_physician.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Фармацевт&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=WolterWhite.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Врач&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Врач.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Парапсихолог&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Психолог.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Медицинский ассистент&lt;br /&gt;
|Цвет_карточки=#3b627a&lt;br /&gt;
|Цвет_заголовка=#3b627a&lt;br /&gt;
|Изображение=Интерн.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Научная служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Наука)&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Иконка=Sci_dep.png&lt;br /&gt;
|Глава=Главный научный сотрудник&lt;br /&gt;
|Связь=:н&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Наука)|Стандартные протоколы]], [[Руководство по исследованию и разработке]], [[Постройка компьютеров и машинерии]], [[Робототехника|Руководство по робототехнике]], [[Руководство по ксеноархеологии]], [[Аномалистика|Руководство по аномалиям]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Главный научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=ДНС.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Ведущий учёный.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Научный сотрудник&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Учёный.png&lt;br /&gt;
|Фикс_Кривых_Картинок=73px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Производственный специалист&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=Робототехник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=69px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Лаборант-практик&lt;br /&gt;
|Цвет_карточки=#43356d&lt;br /&gt;
|Цвет_заголовка=#43356d&lt;br /&gt;
|Изображение=ResearchAssistant.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Инженерно-техническая служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Инженерия)&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Иконка=Eng_dep.png&lt;br /&gt;
|Глава=Ведущий инженер&lt;br /&gt;
|Связь=:и&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Инженерия)|Стандартные протоколы]] • [[Электроэнергия]] • [[Строительство]] • [[Руководство по атмосфере]] • [[Руководство по взлому]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Ведущий инженер&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=CE.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Старший инженер&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Ведущий Инженер.png&lt;br /&gt;
|Фикс_Кривых_Картинок=60px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Электротехник&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Электротехник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Техник&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Инженер.png&lt;br /&gt;
|Фикс_Кривых_Картинок=62px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Техник-стажёр&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=Технический ассистент.png&lt;br /&gt;
|Фикс_Кривых_Картинок=62px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Служба логистики&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Снабжение)&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Иконка=Cargo_dep.png&lt;br /&gt;
|Глава=Квартирмейстер&lt;br /&gt;
|Связь=:л&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Снабжение)|Стандартные протоколы]] • [[Инвентарь Службы логистики]] • [[Таблица грузов]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Квартирмейстер&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Изображение=СЛО.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Логист&lt;br /&gt;
|Цвет_карточки=#9E6A34&lt;br /&gt;
|Цвет_заголовка=#9E6A34&lt;br /&gt;
|Изображение=Грузчик.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
|Название=Сервисная служба&lt;br /&gt;
|Ссылка=Стандартные_Протоколы_(Сервис)&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Иконка=Serv_dep.png&lt;br /&gt;
|Глава=Менеджер по персоналу&lt;br /&gt;
|Связь=:с&lt;br /&gt;
|Руководства=[[Стандартные_Протоколы_(Сервис)|Стандартные протоколы]] • [[Гидропоника]] • [[Напитки]] • Готовка • [[Инвентарь сервисного отдела]]&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Гастроном&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Шеф-повар.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Ботаник-фитогенетик&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Ботаник.png&lt;br /&gt;
|Фикс_Кривых_Картинок=83px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
{{ТаблицаРолей/Роль&lt;br /&gt;
|Название=Обслуживающий персонал&lt;br /&gt;
|Цвет_карточки=#4e7c22&lt;br /&gt;
|Цвет_заголовка=#4e7c22&lt;br /&gt;
|Изображение=Обслуживающий персонал.png&lt;br /&gt;
}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Персонал класса D&lt;br /&gt;
| Ссылка = Стандартные процедуры персонала класса D#Стандартные процедуры персонала класса D&lt;br /&gt;
| Цвет_карточки = #91381e&lt;br /&gt;
| Цвет_заголовка = #91381e&lt;br /&gt;
| Иконка = DclassDEP.png&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Сотрудник класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=D class.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Уборщик класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassJan.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Повар класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassCock.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ботаник класса D|Цвет_карточки=#91381e|Цвет_заголовка=#91381e|Изображение=DclassBotan.png}}&lt;br /&gt;
}}&lt;br /&gt;
{{ТаблицаРолей&lt;br /&gt;
| Название = Административный филиал&lt;br /&gt;
| Ссылка = Руководство Фонда&lt;br /&gt;
| Цвет_карточки = #002f1f&lt;br /&gt;
| Цвет_заголовка = #002f1f&lt;br /&gt;
| Связь = :р, :э&lt;br /&gt;
| Руководства = [[Региональное_управление|Стандартные протоколы]] • [[Бюрократия]] • [[Документация Фонда]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Региональный Директор|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Региональный Директор.png|Фикс_Кривых_Картинок=118px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Оператор РУ|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=CCoperator.png|Фикс_Кривых_Картинок=64px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Штаб О4|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Оператор O4.png|Фикс_Кривых_Картинок=118px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Совет Смотрителей|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Overseer.png|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Комитет по этике|Цвет_карточки=#002f1f|Цвет_заголовка=#002f1f|Изображение=Ethics.png|Фикс_Кривых_Картинок=128px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&amp;lt;!-- ------- --&amp;gt;&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Мобильные оперативные группы&lt;br /&gt;
| Ссылка = Мобильные оперативные группы&lt;br /&gt;
| Цвет_карточки = #12466E&lt;br /&gt;
| Цвет_заголовка = #12466E&lt;br /&gt;
| Связь = :р&lt;br /&gt;
| Руководства = [[Мобильные_оперативные_группы|Стандартные протоколы]] • [[Инструкция по ВУС SCP]] • [[Снаряжение МОГ]] • [[Объекты|Объекты SCP]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Эпсилон-11 &amp;quot;Девятихвостая лиса&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Epsilon11.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Ню-7 &amp;quot;Удар молота&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Nu7.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Бета-7 &amp;quot;Шляпные болванчики&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Beta7.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Альфа-1 &amp;quot;Багряная десница&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Alpha1.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Омега-1 &amp;quot;Шуйца Закона&amp;quot;|Цвет_карточки=#12466E|Цвет_заголовка=#12466E|Изображение=Omega1.png}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Отдел по Применению Искусственного Интеллекта&lt;br /&gt;
| Ссылка = Законы синтетиков&lt;br /&gt;
| Цвет_карточки = #1E90FF&lt;br /&gt;
| Цвет_заголовка = #1E90FF&lt;br /&gt;
| Иконка = Cyborg_dep.png&lt;br /&gt;
| Связь = :&amp;lt;&lt;br /&gt;
| Руководства = [[Законы синтетиков]] • [[Документация Фонда]]&lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Рекрут с искусственным интеллектом|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=8b8bit.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Борги|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=Robots+sunrise.gif}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Персональный РИИ|Цвет_карточки=#1E90FF|Цвет_заголовка=#1E90FF|Изображение=PAI.gif}}&lt;br /&gt;
}}{{ТаблицаРолей&lt;br /&gt;
| Название = Связанные Организации&lt;br /&gt;
| Ссылка = Повстанцы Хаоса&lt;br /&gt;
| Цвет_карточки = #770101&lt;br /&gt;
| Цвет_заголовка = #770101&lt;br /&gt;
| Иконка = &lt;br /&gt;
| Содержание = &amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Повстанцы Хаоса|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=CIRegularOperative.png}}&amp;lt;!-- ------- --&amp;gt;{{ТаблицаРолей/Роль|Название=Агент Повстанцев Хаоса|Цвет_карточки=#770101|Цвет_заголовка=#770101|Изображение=ДиверсантыПХ.png|Фикс_Кривых_Картинок=83px &amp;lt;!-- Необязательный параметр для фикса некоторых картинок --&amp;gt;}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82_SCP-049&amp;diff=18070</id>
		<title>Контракт SCP-049</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82_SCP-049&amp;diff=18070"/>
		<updated>2026-04-10T17:49:27Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данный контракт был подписан Фондом и SCP-049 для установки правил взаимоотношений и Особых Условий Содержания. Его нарушение с обеих сторон недопустимо.&lt;br /&gt;
&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Контракт&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;Контракт&amp;quot; style=&amp;quot;margin-top: 6px;&amp;quot;&amp;gt;Контракт&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Между &#039;&#039;&#039;SCP-049&#039;&#039;&#039; (далее — «Чумной доктор») и &#039;&#039;&#039;SCP Foundation&#039;&#039;&#039; (далее — «Фонд»)&lt;br /&gt;
&lt;br /&gt;
==== 1. ЦЕЛЬ ДОГОВОРА ====&lt;br /&gt;
Настоящий контракт устанавливает правила содержания, взаимодействия и ограничений прав и обязанностей Чумного доктора и персонала Фонда. Документ направлен на обеспечение безопасности персонала, сохранение научной полезности объекта и предотвращение злоупотреблений привилегиями со стороны любой из сторон.&lt;br /&gt;
&lt;br /&gt;
==== 2. СТОРОНЫ И ОПРЕДЕЛЕНИЯ ====&lt;br /&gt;
* &#039;&#039;&#039;[[SCP-049|Чумной доктор]]&#039;&#039;&#039; — объект, идентифицированный под номером SCP-049.&lt;br /&gt;
* &#039;&#039;&#039;Фонд&#039;&#039;&#039; — организация, ответственная за содержание, изучение и контроль SCP-049.&lt;br /&gt;
* &#039;&#039;&#039;[[Роли|Персонал Фонда]]&#039;&#039;&#039; — сотрудники учреждения, которые имеют ключ-карту, показывающую их уровень допуска, и записи об их легитимности в консоли реестра персонала.&lt;br /&gt;
* &#039;&#039;&#039;Экстренная ситуация&#039;&#039;&#039; (ЧС) — событие, представляющее непосредственную угрозу жизни и/или целостности учреждения и/или персонала (прорыв, вооружённое столкновение и т.п.).&lt;br /&gt;
&lt;br /&gt;
==== 3. ОБЩИЕ ПОЛОЖЕНИЯ ====&lt;br /&gt;
* Чумной доктор подписал настоящий контракт и тем самым подтверждает своё понимание и принятие содержащихся в нём условий.&lt;br /&gt;
* Подписание не делает Чумного доктора сотрудником в организационном смысле; SCP-049 остаётся объектом содержания с ограниченными правами, определёнными в данном документе.&lt;br /&gt;
* Права, привилегии и обязанности Чумного доктора ограничены исключительно положениями настоящего контракта и решениями руководства учреждения ([[Директор учреждения|директора учреждения]], [[Главный научный сотрудник]]).&lt;br /&gt;
&lt;br /&gt;
==== 4. ПРАВА ЧУМНОГО ДОКТОРА ====&lt;br /&gt;
* Фонд обязуется обеспечить базовые условия содержания: безопасность, питание, медицинскую поддержку, а также возможность выполнять утверждённые исследовательские сессии под контролем персонала.&lt;br /&gt;
* Чумному доктору разрешается делать письменные и устные заявления персоналу и учёным в пределах, не противоречащих инструкциям персонала компетентного уровня (директор учреждения, глава научной службы, [[Начальник службы безопасности|начальник СБ]]).&lt;br /&gt;
* Прочие привилегии предоставляются лишь с разрешения главного научного сотрудника или директора учреждения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1. ОСОБЫЕ РАЗРЕШЕНИЯ ДЛЯ ЗАПРОСОВ SCP-049 =====&lt;br /&gt;
&#039;&#039;&#039;Право на запросы&#039;&#039;&#039;&lt;br /&gt;
SCP-049 имеет право подавать запросы на предоставление ограниченных предметов и «пациентов» (сотрудников класса D) исключительно через сотрудников уровня допуска 3 и выше.&lt;br /&gt;
&lt;br /&gt;
Разрешённые предметы для медицинских операций:&lt;br /&gt;
* базовые хирургические инструменты (скальпель, ретрактор, перчатки и т.п.);&lt;br /&gt;
* простые медикаменты (наборы для ушибов, мази и т.п.) — строго под контролем ученых или СБ;&lt;br /&gt;
* иные предметы могут быть добавлены в перечень только с письменного разрешения директора учреждения или главного научного сотрудника.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пациенты ([[Сотрудник класса D|класс D]])&#039;&#039;&#039;&lt;br /&gt;
* SCP-049 имеет право запросить предоставление подопытных (класс D) для проведения «операций» или исследований.&lt;br /&gt;
* КоличествоFF одновременно предоставляемых D-классов определяется директором комплекса и не может превышать лимит, установленный внутренними протоколами.&lt;br /&gt;
* Все действия SCP-049 с D-классами происходят исключительно под наблюдением учёных или службы безопасности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ограничения и условия&#039;&#039;&#039;&lt;br /&gt;
* SCP-049 не имеет права самостоятельно выбирать конкретных D-классов или предметы. Решение принимает персонал Фонда, за исключением разрешенных предметов в пункте 4.1 договора.&lt;br /&gt;
* Запросы рассматриваются в рабочем порядке и могут быть отклонены без объяснения причин в случае угрозы безопасности, ЧП, нехватки ресурсов или по усмотрению руководства.&lt;br /&gt;
* Предоставление предметов и пациентов не является правом SCP-049, а лишь возможностью, доступной при условии его соблюдения правил содержания и безопасности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Злоупотребления и нарушения&#039;&#039;&#039;&lt;br /&gt;
* В случае агрессивного или манипулятивного поведения SCP-049 во время подачи запроса он теряет право на дальнейшие заявки на срок, установленный директором учреждения или главный научный сотрудник.&lt;br /&gt;
* При попытке использовать предоставленные предметы или D-классов вне рамок эксперимента — немедленное вмешательство СБ, изъятие предметов и применение мер подавления.&lt;br /&gt;
&lt;br /&gt;
==== 5. ОГРАНИЧЕНИЯ И ОБЯЗАТЕЛЬСТВА ЧУМНОГО ДОКТОРА ====&lt;br /&gt;
* Чумной доктор не имеет права требовать от персонала действий, которые противоречат приказам директора учреждения, главный научный сотрудник или СБ. Его слова не имеют силы приказа.&lt;br /&gt;
* Чумной доктор обязуется не предпринимать действий, ведущих к угрозе для жизни персонала или целостности учреждения.&lt;br /&gt;
* Манипулятивное, агрессивное или демонстративно требовательное поведение со стороны Чумного доктора считается нарушением условий и рассматривается как повод для дисциплинарных мер.&lt;br /&gt;
* В экстренной ситуации приоритет безопасности персонала и учреждения выше удобств Чумного доктора; его запросы и привилегии могут быть временно и безальтернативно приостановлены.&lt;br /&gt;
&lt;br /&gt;
==== 6. ОБЯЗАННОСТИ И ПРАВА ПЕРСОНАЛА ФОНДА ====&lt;br /&gt;
* Персонал обязан обращаться с Чумным доктором уважительно и профессионально, но без предоставления «особого статуса».&lt;br /&gt;
* Персонал обязан соблюдать условия контракта и выполнять защитные инструкции.&lt;br /&gt;
* СБ имеют право применять сдерживающие меры (средства подавления, амнезиаки, изоляция, применение силы) в случаях нарушения контракта либо при угрозе жизни/безопасности.&lt;br /&gt;
* При обнаружении попыток побега или существенного нарушения условий — директор учреждения и главный научный сотрудник имеют приоритет на принятие мер.&lt;br /&gt;
&lt;br /&gt;
==== 7. ПРОЦЕДУРЫ ПРИ ЭКСТРЕННЫХ СИТУАЦИЯХ ====&lt;br /&gt;
* В случае непосредственной угрозы жизни персонала или крупного нарушения — приоритетные действия: локализация угрозы, подавление (летальное, нелетальное по решению директора учреждения или начальника службы безопасности), изоляция объекта, применение амнезиаков и восстановительных процедур.&lt;br /&gt;
* Если Чумной доктор выступает агрессивно, и присутствуют менее двух SCP-049-2, угроза считается контролируемой; при наличии двух и более SCP-049-2 применяются дополнительные протоколы ограничения и применения огня.&lt;br /&gt;
&lt;br /&gt;
==== 8. ИНФОРМАЦИЯ И СВЯЗЬ ====&lt;br /&gt;
&#039;&#039;&#039;Конфиденциальность&#039;&#039;&#039;&lt;br /&gt;
* Вся внутренняя информация Фонда (радиопереговоры, документы, протоколы, личные записи сотрудников, внутренние отчёты) является секретной и предназначена исключительно для персонала с соответствующим уровнем допуска.&lt;br /&gt;
* SCP-049 не имеет правового доступа к данным Фонда, за исключением тех сведений, которые прямо передаются ему в рамках экспериментов или общения с персоналом.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запрет на использование средств связи&#039;&#039;&#039;&lt;br /&gt;
* SCP-049 запрещается владеть или использовать гарнитуры, рации, интеркомы, терминалы или любые другие устройства связи, которые позволяют получать или передавать служебную информацию персонала.&lt;br /&gt;
* Любое устройство связи, найденное у SCP-049 или в его камере содержания, подлежит немедленному изъятию.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Информационная изоляция&#039;&#039;&#039;&lt;br /&gt;
* Персонал обязан контролировать, чтобы SCP-049 не имел доступа к секретной информации.&lt;br /&gt;
* В случае, если SCP-049 случайно стал свидетелем или узнал информацию, не предназначенную для него, данная информация считается не имеющей юридической силы для SCP-049 и не может использоваться им как аргумент в запросах или переговорах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответственность&#039;&#039;&#039;&lt;br /&gt;
* Попытки SCP-049 использовать секретную информацию Фонда (включая шантаж или угрозы) являются нарушением контракта и влекут за собой немедленное применение мер подавления и временную изоляцию.&lt;br /&gt;
* Нарушение конфиденциальности со стороны сотрудников (например, оставленная гарнитура в камере) фиксируется как служебная ошибка, и виновный персонал подлежит дисциплинарному взысканию.&lt;br /&gt;
&lt;br /&gt;
==== 9. ДИСЦИПЛИНАРНЫЕ МЕРЫ И САНКЦИИ ====&lt;br /&gt;
* За нарушение условий контракта Фонд вправе применять одно или несколько следующих мер: устное предупреждение, изоляция, принудительная седация, перевод в режим повышенного содержания, временное или постоянное ограничение привилегий.&lt;br /&gt;
* В случае систематических или грубых нарушений — по решению директора учреждения возможно применение летальных мер.&lt;br /&gt;
&lt;br /&gt;
===== 9.1. НАРУШЕНИЕ СО СТОРОНЫ ФОНДА =====&lt;br /&gt;
В случае если сотрудники Фонда нарушают условия контракта (применяют чрезмерное насилие, лишают SCP-049 прав и привилегий, прямо закреплённых в договоре, или игнорируют установленные договорённости без ЧС), SCP-049 получает право:&lt;br /&gt;
&lt;br /&gt;
* Подать официальное обращение через назначенного куратора (учёный, главный научный сотрудник или уполномоченный сотрудник 3+ уровня допуска).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если нарушение подтверждено:&#039;&#039;&#039;&lt;br /&gt;
* Виновные сотрудники Фонда могут понести дисциплинарные меры (понижение, лишение допуска, перевод в D-класс, внутреннее расследование).&lt;br /&gt;
* SCP-049 получает компенсацию в виде восстановления нарушенных привилегий и дополнительной возможности (например, одна внеплановая исследовательская сессия, больше свободы в запросах мелкого инвентаря).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;В случае систематических нарушений условий договора со стороны персонала Фонда:&#039;&#039;&#039;&lt;br /&gt;
* SCP-049 имеет право временно отказаться от участия в тестах/исследованиях, пока конфликт не будет урегулирован.&lt;br /&gt;
* При этом SCP-049 обязан оставаться в пределах камеры содержания и не предпринимать действий, угрожающих безопасности учреждения.&lt;br /&gt;
* В экстренной ситуации (ЧС) действия Фонда, нарушающие удобства или привилегии SCP-049, не считаются нарушением, если они прямо направлены на спасение жизней персонала или локализацию угрозы.&lt;br /&gt;
&lt;br /&gt;
==== 10. ИЗМЕНЕНИЕ И РАСТОРЖЕНИЕ КОНТРАКТА ====&lt;br /&gt;
* Любые изменения в контракт вносятся только с письменного разрешения директора учреждения и согласования главы научной службы.&lt;br /&gt;
* Контракт может быть расторгнут по решению директора учреждения в случае систематических грубых нарушений со стороны SCP-049 или при изменении статуса объекта.&lt;br /&gt;
* В случае расторжения контракта все привилегии SCP-049 аннулируются, и он переводится на стандартный режим содержания.&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Контракт для копирования&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;pre class=&amp;quot;copyable-text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[head=1]КОНТРАКТ[/head]&lt;br /&gt;
&lt;br /&gt;
Между [bold]SCP-049[/bold] (далее — «Чумной доктор») и [bold]SCP Foundation[/bold] (далее — «Фонд»)&lt;br /&gt;
&lt;br /&gt;
​[head=3]1. ЦЕЛЬ ДОГОВОРА[/head]&lt;br /&gt;
Настоящий контракт устанавливает правила содержания, взаимодействия и ограничений прав и обязанностей Чумного доктора и персонала Фонда. Документ направлен на обеспечение безопасности персонала, сохранение научной полезности объекта и предотвращение злоупотреблений привилегиями со стороны любой из сторон.&lt;br /&gt;
&lt;br /&gt;
​[head=3]2. СТОРОНЫ И ОПРЕДЕЛЕНИЯ[/head]&lt;br /&gt;
​[bullet][bold]Чумной доктор[/bold] — объект, идентифицированный под номером SCP-049.&lt;br /&gt;
[bullet][bold]Фонд[/bold] — организация, ответственная за содержание, изучение и контроль SCP-049.&lt;br /&gt;
​[bullet][bold]Персонал Фонда[/bold] — сотрудники учреждения, которые имеют ключ-карту, показывающую их уровень допуска и имеющие записи о их легитимности в консоли реестра персонала.&lt;br /&gt;
​[bullet][bold]Экстренная ситуация (ЧС)[/bold] — событие, представляющее непосредственную угрозу жизни и/или целостности учреждения и/или персонала (прорыв, вооружённое столкновение и т.п.).&lt;br /&gt;
&lt;br /&gt;
[head=3]3. ОБЩИЕ ПОЛОЖЕНИЯ[/head]&lt;br /&gt;
​[bullet]Чумной доктор подписал настоящий контракт и тем самым подтверждает своё понимание и принятие содержащихся в нём условий.&lt;br /&gt;
[bullet]Подписание не делает Чумного доктора сотрудником в организационном смысле; SCP-049 остаётся объектом содержания с ограниченными правами, определёнными в данном документе.&lt;br /&gt;
[bullet]Права, привилегии и обязанности Чумного доктора ограничены исключительно положениями настоящего контракта и решениями руководства учреждения (директора учреждения, глава научной службы).&lt;br /&gt;
&lt;br /&gt;
​[head=3]4. ПРАВА ЧУМНОГО ДОКТОРА[/head]&lt;br /&gt;
[bullet]Фонд обязуется обеспечить базовые условия содержания: безопасность, питание, медицинскую поддержку, а также возможность выполнять утверждённые исследовательские сессии под контролем персонала.&lt;br /&gt;
​[bullet]Чумному доктору разрешается делать письменные и устные заявления персоналу и учёным в пределах, не противоречащих инструкциям персонала соответствующего уровня (директор учреждения, глава научной службы, начальник СБ).&lt;br /&gt;
​[bullet]Прочие привилегии предоставляются лишь с разрешения главы научной службы или директора учреждения.&lt;br /&gt;
&lt;br /&gt;
​[head=3]4.1. ОСОБЫЕ РАЗРЕШЕНИЯ ДЛЯ ЗАПРОСОВ SCP-049[/head]&lt;br /&gt;
​[bold]Право на запросы[/bold]&lt;br /&gt;
SCP-049 имеет право подавать запросы на предоставление ограниченных предметов и «пациентов» (сотрудников класса D) исключительно через сотрудников уровня допуска 3 и выше.&lt;br /&gt;
&lt;br /&gt;
​Разрешённые предметы для медицинских операций:&lt;br /&gt;
​[bullet]базовые хирургические инструменты (скальпель, ретрактор, перчатки и т.п.);&lt;br /&gt;
​[bullet]простые медикаменты (наборы для ушибов, мази и т.п.) — строго под контролем ученых или СБ;&lt;br /&gt;
​[bullet]иные предметы могут быть добавлены в перечень только с письменного разрешения директора учреждения или главы научной службы.&lt;br /&gt;
&lt;br /&gt;
[bold]Пациенты (класс D)[/bold]&lt;br /&gt;
​[bullet]SCP-049 имеет право запросить предоставление подопытных (класс D) для проведения «операций» или исследований.&lt;br /&gt;
​[bullet]Количество одновременно предоставляемых D-классов определяется директором учреждения и не может превышать лимит, установленный внутренними протоколами.&lt;br /&gt;
​[bullet]Все действия SCP-049 с D-классами происходят исключительно под наблюдением учёных или службы безопасности.&lt;br /&gt;
&lt;br /&gt;
[bold]Ограничения и условия[/bold]&lt;br /&gt;
​[bullet]SCP-049 не имеет права самостоятельно выбирать конкретных D-классов или предметы. Решение принимает персонал Фонда, за исключением разрешенных предметов в пункте 4.1 договора.&lt;br /&gt;
[bullet]Запросы рассматриваются в рабочем порядке и могут быть отклонены без объяснения причин в случае угрозы безопасности, ЧП, нехватки ресурсов или по усмотрению руководства.&lt;br /&gt;
[bullet]Предоставление предметов и пациентов не является правом SCP-049, а лишь возможностью, доступной при условии его соблюдения правил содержания и безопасности.&lt;br /&gt;
&lt;br /&gt;
​[bold]Злоупотребления и нарушения[/bold]&lt;br /&gt;
​[bullet]В случае агрессивного или манипулятивного поведения SCP-049 во время подачи запроса он теряет право на дальнейшие заявки на срок, установленный директором или главой научной службы.&lt;br /&gt;
[bullet]При попытке использовать предоставленные предметы или D-классов вне рамок эксперимента — немедленное вмешательство СБ, изъятие предметов и применение мер подавления.&lt;br /&gt;
&lt;br /&gt;
​[head=3]5. ОГРАНИЧЕНИЯ И ОБЯЗАТЕЛЬСТВА ЧУМНОГО ДОКТОРА[/head]&lt;br /&gt;
[bullet]Чумной доктор не имеет права требовать от персонала действий, которые противоречат приказам директора учреждения, главы научной службы или СБ. Его слова не имеют силы приказа.&lt;br /&gt;
​[bullet]Чумной доктор обязуется не предпринимать действий, ведущих к угрозе для жизни персонала или целостности учреждения.&lt;br /&gt;
​[bullet]Манипулятивное, агрессивное или демонстративно требовательное поведение со стороны Чумного доктора считается нарушением условий и рассматривается как повод для дисциплинарных мер.&lt;br /&gt;
[bullet]В экстренной ситуации приоритет безопасности персонала и учреждения выше удобств Чумного доктора; его запросы и привилегии могут быть временно и безальтернативно приостановлены.&lt;br /&gt;
&lt;br /&gt;
​[head=3]6. ОБЯЗАННОСТИ И ПРАВА ПЕРСОНАЛА ФОНДА[/head]&lt;br /&gt;
​[bullet]Персонал обязан обращаться с Чумным доктором уважительно и профессионально, но без предоставления «особого статуса».&lt;br /&gt;
​[bullet]Персонал обязан соблюдать условия контракта и выполнять защитные инструкции.&lt;br /&gt;
​[bullet]СБ имеют право применять сдерживающие меры (средства подавления, амнезиаки, изоляция, применение силы) в случаях нарушения контракта либо при угрозе жизни/безопасности.&lt;br /&gt;
[bullet]При обнаружении попыток побега или существенного нарушения условий — директор учреждения и глава научной службы имеют приоритет на принятие мер.&lt;br /&gt;
&lt;br /&gt;
​[head=3]7. ПРОЦЕДУРЫ ПРИ ЭКСТРЕННЫХ СИТУАЦИЯХ[/head]&lt;br /&gt;
[bullet]В случае непосредственной угрозы жизни персонала или крупного нарушения — приоритетные действия: локализация угрозы, подавление (летальное, нелетальное по решению директора учреждения или начальника службы безопасности), изоляция объекта, применение амнезиаков и восстановительных процедур.&lt;br /&gt;
​[bullet]Если Чумной доктор выступает агрессивно, и присутствуют менее двух SCP-049-2, угроза считается контролируемой; при наличии двух и более SCP-049-2 применяются дополнительные протоколы ограничения и применения огня.&lt;br /&gt;
&lt;br /&gt;
[head=3]8. ИНФОРМАЦИЯ И СВЯЗЬ[/head]&lt;br /&gt;
​[bold]Конфиденциальность[/bold]&lt;br /&gt;
​[bullet]Вся внутренняя информация Фонда является секретной и предназначена исключительно для персонала с соответствующим уровнем допуска.&lt;br /&gt;
​[bullet]SCP-049 не имеет правового доступа к данным Фонда, за исключением тех сведений, которые прямо передаются ему в рамках экспериментов или общения с персоналом.&lt;br /&gt;
&lt;br /&gt;
​[bold]Запрет на использование средств связи[/bold]&lt;br /&gt;
​[bullet]SCP-049 запрещается владеть или использовать гарнитуры, рации, интеркомы, терминалы или любые другие устройства связи, которые позволяют получать или передавать служебную информацию персонала.&lt;br /&gt;
​[bullet]Любое устройство связи, найденное у SCP-049 или в его камере содержания, подлежит немедленному изъятию.&lt;br /&gt;
&lt;br /&gt;
[bold]Информационная изоляция[/bold]&lt;br /&gt;
​[bullet]Персонал обязан контролировать, чтобы SCP-049 не имел доступа к секретной информации.&lt;br /&gt;
[bullet]В случае, если SCP-049 случайно стал свидетелем или узнал информацию, не предназначенную для него, данная информация считается не имеющей юридической силы для SCP-049 и не может использоваться им как аргумент в запросах или переговорах.&lt;br /&gt;
&lt;br /&gt;
[bold]Ответственность[/bold]&lt;br /&gt;
​[bullet]Попытки SCP-049 использовать секретную информацию Фонда (включая шантаж или угрозы) являются нарушением контракта и влекут за собой немедленное применение мер подавления и временную изоляцию.&lt;br /&gt;
​[bullet]Нарушение конфиденциальности со стороны сотрудников (например, оставленная гарнитура в камере) фиксируется как служебная ошибка, и виновный персонал подлежит дисциплинарному взысканию.&lt;br /&gt;
&lt;br /&gt;
​[head=3]9. ДИСЦИПЛИНАРНЫЕ МЕРЫ И САНКЦИИ[/head]&lt;br /&gt;
​[bullet]За нарушение условий контракта Фонд вправе применять одно или несколько следующих мер: устное предупреждение, изоляция, принудительная седация, перевод в режим повышенного содержания, временное или постоянное ограничение привилегий.&lt;br /&gt;
​[bullet]В случае систематических или грубых нарушений — по решению директора учреждения возможно применение летальных мер.&lt;br /&gt;
&lt;br /&gt;
​[head=3]9.1. НАРУШЕНИЕ СО СТОРОНЫ ФОНДА[/head]&lt;br /&gt;
В случае если сотрудники Фонда нарушают условия контракта (применяют чрезмерное насилие, лишают SCP-049 прав и привилегий, прямо закреплённых в договоре, или игнорируют установленные договорённости без ЧС), SCP-049 получает право:&lt;br /&gt;
&lt;br /&gt;
​[bullet]Подать официальное обращение через назначенного куратора (учёный, глава научной службы или уполномоченный сотрудник 3+ уровня допуска).&lt;br /&gt;
&lt;br /&gt;
[bold]Если нарушение подтверждено:[/bold]&lt;br /&gt;
[bullet]Виновные сотрудники Фонда могут понести дисциплинарные меры (понижение, лишение допуска, перевод в D-класс, внутреннее расследование).&lt;br /&gt;
[bullet]SCP-049 получает компенсацию в виде восстановления нарушенных привилегий и дополнительной возможности (например, одна внеплановая исследовательская сессия, больше свободы в запросах мелкого инвентаря).&lt;br /&gt;
&lt;br /&gt;
​[bold]В случае систематических нарушений условий договора со стороны персонала Фонда:[/bold]&lt;br /&gt;
[bullet]SCP-049 имеет право временно отказаться от участия в тестах/исследованиях, пока конфликт не будет урегулирован.&lt;br /&gt;
[bullet]При этом SCP-049 обязан оставаться в пределах камеры содержания и не предпринимать действий, угрожающих безопасности учреждения.&lt;br /&gt;
​[bullet]В экстренной ситуации (ЧС) действия Фонда, нарушающие удобства или привилегии SCP-049, не считаются нарушением, если они прямо направлены на спасение жизней персонала или локализацию угрозы.&lt;br /&gt;
&lt;br /&gt;
​[head=3]10. ИЗМЕНЕНИЕ И РАСТОРЖЕНИЕ КОНТРАКТА[/head]&lt;br /&gt;
​[bullet]Любые изменения в контракт вносятся только с письменного разрешения директора учреждения и согласования главы научной службы.&lt;br /&gt;
​[bullet]Контракт может быть расторгнут по решению директора учреждения в случае систематических грубых нарушений со стороны SCP-049 или при изменении статуса объекта.&lt;br /&gt;
​[bullet]В случае расторжения контракта все привилегии SCP-049 аннулируются, и он переводится на стандартный режим содержания.                                                                                                                  &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82_SCP-049&amp;diff=18069</id>
		<title>Контракт SCP-049</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%9A%D0%BE%D0%BD%D1%82%D1%80%D0%B0%D0%BA%D1%82_SCP-049&amp;diff=18069"/>
		<updated>2026-04-10T17:46:43Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Данный контракт был подписан Фондом и SCP-049 для установки правил взаимоотношений и Особых Условий Содержания. Его нарушение с обеих сторон недопустимо.&lt;br /&gt;
&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Контракт&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;h2 id=&amp;quot;Контракт&amp;quot; style=&amp;quot;margin-top: 6px;&amp;quot;&amp;gt;Контракт&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Между &#039;&#039;&#039;SCP-049&#039;&#039;&#039; (далее — «Чумной доктор») и &#039;&#039;&#039;SCP Foundation&#039;&#039;&#039; (далее — «Фонд»)&lt;br /&gt;
&lt;br /&gt;
==== 1. ЦЕЛЬ ДОГОВОРА ====&lt;br /&gt;
Настоящий контракт устанавливает правила содержания, взаимодействия и ограничений прав и обязанностей Чумного доктора и персонала Фонда. Документ направлен на обеспечение безопасности персонала, сохранение научной полезности объекта и предотвращение злоупотреблений привилегиями со стороны любой из сторон.&lt;br /&gt;
&lt;br /&gt;
==== 2. СТОРОНЫ И ОПРЕДЕЛЕНИЯ ====&lt;br /&gt;
* &#039;&#039;&#039;[[SCP-049|Чумной доктор]]&#039;&#039;&#039; — объект, идентифицированный под номером SCP-049.&lt;br /&gt;
* &#039;&#039;&#039;Фонд&#039;&#039;&#039; — организация, ответственная за содержание, изучение и контроль SCP-049.&lt;br /&gt;
* &#039;&#039;&#039;[[Роли|Персонал Фонда]]&#039;&#039;&#039; — сотрудники учреждения, которые имеют ключ-карту, показывающую их уровень допуска, и записи об их легитимности в консоли реестра персонала.&lt;br /&gt;
* &#039;&#039;&#039;Экстренная ситуация&#039;&#039;&#039; (ЧС) — событие, представляющее непосредственную угрозу жизни и/или целостности учреждения и/или персонала (прорыв, вооружённое столкновение и т.п.).&lt;br /&gt;
&lt;br /&gt;
==== 3. ОБЩИЕ ПОЛОЖЕНИЯ ====&lt;br /&gt;
* Чумной доктор подписал настоящий контракт и тем самым подтверждает своё понимание и принятие содержащихся в нём условий.&lt;br /&gt;
* Подписание не делает Чумного доктора сотрудником в организационном смысле; SCP-049 остаётся объектом содержания с ограниченными правами, определёнными в данном документе.&lt;br /&gt;
* Права, привилегии и обязанности Чумного доктора ограничены исключительно положениями настоящего контракта и решениями руководства учреждения ([[Директор учреждения|директора учреждения]], [[Главный научный сотрудник]]).&lt;br /&gt;
&lt;br /&gt;
==== 4. ПРАВА ЧУМНОГО ДОКТОРА ====&lt;br /&gt;
* Фонд обязуется обеспечить базовые условия содержания: безопасность, питание, медицинскую поддержку, а также возможность выполнять утверждённые исследовательские сессии под контролем персонала.&lt;br /&gt;
* Чумному доктору разрешается делать письменные и устные заявления персоналу и учёным в пределах, не противоречащих инструкциям персонала компетентного уровня (директор учреждения, глава научной службы, [[Начальник службы безопасности|начальник СБ]]).&lt;br /&gt;
* Прочие привилегии предоставляются лишь с разрешения главного научного сотрудника или директора учреждения.&lt;br /&gt;
&lt;br /&gt;
===== 4.1. ОСОБЫЕ РАЗРЕШЕНИЯ ДЛЯ ЗАПРОСОВ SCP-049 =====&lt;br /&gt;
&#039;&#039;&#039;Право на запросы&#039;&#039;&#039;&lt;br /&gt;
SCP-049 имеет право подавать запросы на предоставление ограниченных предметов и «пациентов» (сотрудников класса D) исключительно через сотрудников уровня допуска 3 и выше.&lt;br /&gt;
&lt;br /&gt;
Разрешённые предметы для медицинских операций:&lt;br /&gt;
* базовые хирургические инструменты (скальпель, ретрактор, перчатки и т.п.);&lt;br /&gt;
* простые медикаменты (наборы для ушибов, мази и т.п.) — строго под контролем ученых или СБ;&lt;br /&gt;
* иные предметы могут быть добавлены в перечень только с письменного разрешения директора учреждения или главного научного сотрудника.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Пациенты ([[Сотрудник класса D|класс D]])&#039;&#039;&#039;&lt;br /&gt;
* SCP-049 имеет право запросить предоставление подопытных (класс D) для проведения «операций» или исследований.&lt;br /&gt;
* КоличествоFF одновременно предоставляемых D-классов определяется директором комплекса и не может превышать лимит, установленный внутренними протоколами.&lt;br /&gt;
* Все действия SCP-049 с D-классами происходят исключительно под наблюдением учёных или службы безопасности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ограничения и условия&#039;&#039;&#039;&lt;br /&gt;
* SCP-049 не имеет права самостоятельно выбирать конкретных D-классов или предметы. Решение принимает персонал Фонда, за исключением разрешенных предметов в пункте 4.1 договора.&lt;br /&gt;
* Запросы рассматриваются в рабочем порядке и могут быть отклонены без объяснения причин в случае угрозы безопасности, ЧП, нехватки ресурсов или по усмотрению руководства.&lt;br /&gt;
* Предоставление предметов и пациентов не является правом SCP-049, а лишь возможностью, доступной при условии его соблюдения правил содержания и безопасности.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Злоупотребления и нарушения&#039;&#039;&#039;&lt;br /&gt;
* В случае агрессивного или манипулятивного поведения SCP-049 во время подачи запроса он теряет право на дальнейшие заявки на срок, установленный директором учреждения или главный научный сотрудник.&lt;br /&gt;
* При попытке использовать предоставленные предметы или D-классов вне рамок эксперимента — немедленное вмешательство СБ, изъятие предметов и применение мер подавления.&lt;br /&gt;
&lt;br /&gt;
==== 5. ОГРАНИЧЕНИЯ И ОБЯЗАТЕЛЬСТВА ЧУМНОГО ДОКТОРА ====&lt;br /&gt;
* Чумной доктор не имеет права требовать от персонала действий, которые противоречат приказам директора учреждения, главный научный сотрудник или СБ. Его слова не имеют силы приказа.&lt;br /&gt;
* Чумной доктор обязуется не предпринимать действий, ведущих к угрозе для жизни персонала или целостности учреждения.&lt;br /&gt;
* Манипулятивное, агрессивное или демонстративно требовательное поведение со стороны Чумного доктора считается нарушением условий и рассматривается как повод для дисциплинарных мер.&lt;br /&gt;
* В экстренной ситуации приоритет безопасности персонала и учреждения выше удобств Чумного доктора; его запросы и привилегии могут быть временно и безальтернативно приостановлены.&lt;br /&gt;
&lt;br /&gt;
==== 6. ОБЯЗАННОСТИ И ПРАВА ПЕРСОНАЛА ФОНДА ====&lt;br /&gt;
* Персонал обязан обращаться с Чумным доктором уважительно и профессионально, но без предоставления «особого статуса».&lt;br /&gt;
* Персонал обязан соблюдать условия контракта и выполнять защитные инструкции.&lt;br /&gt;
* СБ имеют право применять сдерживающие меры (средства подавления, амнезиаки, изоляция, применение силы) в случаях нарушения контракта либо при угрозе жизни/безопасности.&lt;br /&gt;
* При обнаружении попыток побега или существенного нарушения условий — директор учреждения и главный научный сотрудник имеют приоритет на принятие мер.&lt;br /&gt;
&lt;br /&gt;
==== 7. ПРОЦЕДУРЫ ПРИ ЭКСТРЕННЫХ СИТУАЦИЯХ ====&lt;br /&gt;
* В случае непосредственной угрозы жизни персонала или крупного нарушения — приоритетные действия: локализация угрозы, подавление (летальное, нелетальное по решению директора учреждения или начальника службы безопасности), изоляция объекта, применение амнезиаков и восстановительных процедур.&lt;br /&gt;
* Если Чумной доктор выступает агрессивно, и присутствуют менее двух SCP-049-2, угроза считается контролируемой; при наличии двух и более SCP-049-2 применяются дополнительные протоколы ограничения и применения огня.&lt;br /&gt;
&lt;br /&gt;
==== 8. ИНФОРМАЦИЯ И СВЯЗЬ ====&lt;br /&gt;
&#039;&#039;&#039;Конфиденциальность&#039;&#039;&#039;&lt;br /&gt;
* Вся внутренняя информация Фонда (радиопереговоры, документы, протоколы, личные записи сотрудников, внутренние отчёты) является секретной и предназначена исключительно для персонала с соответствующим уровнем допуска.&lt;br /&gt;
* SCP-049 не имеет правового доступа к данным Фонда, за исключением тех сведений, которые прямо передаются ему в рамках экспериментов или общения с персоналом.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запрет на использование средств связи&#039;&#039;&#039;&lt;br /&gt;
* SCP-049 запрещается владеть или использовать гарнитуры, рации, интеркомы, терминалы или любые другие устройства связи, которые позволяют получать или передавать служебную информацию персонала.&lt;br /&gt;
* Любое устройство связи, найденное у SCP-049 или в его камере содержания, подлежит немедленному изъятию.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Информационная изоляция&#039;&#039;&#039;&lt;br /&gt;
* Персонал обязан контролировать, чтобы SCP-049 не имел доступа к секретной информации.&lt;br /&gt;
* В случае, если SCP-049 случайно стал свидетелем или узнал информацию, не предназначенную для него, данная информация считается не имеющей юридической силы для SCP-049 и не может использоваться им как аргумент в запросах или переговорах.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ответственность&#039;&#039;&#039;&lt;br /&gt;
* Попытки SCP-049 использовать секретную информацию Фонда (включая шантаж или угрозы) являются нарушением контракта и влекут за собой немедленное применение мер подавления и временную изоляцию.&lt;br /&gt;
* Нарушение конфиденциальности со стороны сотрудников (например, оставленная гарнитура в камере) фиксируется как служебная ошибка, и виновный персонал подлежит дисциплинарному взысканию.&lt;br /&gt;
&lt;br /&gt;
==== 9. ДИСЦИПЛИНАРНЫЕ МЕРЫ И САНКЦИИ ====&lt;br /&gt;
* За нарушение условий контракта Фонд вправе применять одно или несколько следующих мер: устное предупреждение, изоляция, принудительная седация, перевод в режим повышенного содержания, временное или постоянное ограничение привилегий.&lt;br /&gt;
* В случае систематических или грубых нарушений — по решению директора учреждения возможно применение летальных мер.&lt;br /&gt;
&lt;br /&gt;
===== 9.1. НАРУШЕНИЕ СО СТОРОНЫ ФОНДА =====&lt;br /&gt;
В случае если сотрудники Фонда нарушают условия контракта (применяют чрезмерное насилие, лишают SCP-049 прав и привилегий, прямо закреплённых в договоре, или игнорируют установленные договорённости без ЧС), SCP-049 получает право:&lt;br /&gt;
&lt;br /&gt;
* Подать официальное обращение через назначенного куратора (учёный, главный научный сотрудник или уполномоченный сотрудник 3+ уровня допуска).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Если нарушение подтверждено:&#039;&#039;&#039;&lt;br /&gt;
* Виновные сотрудники Фонда могут понести дисциплинарные меры (понижение, лишение допуска, перевод в D-класс, внутреннее расследование).&lt;br /&gt;
* SCP-049 получает компенсацию в виде восстановления нарушенных привилегий и дополнительной возможности (например, одна внеплановая исследовательская сессия, больше свободы в запросах мелкого инвентаря).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;В случае систематических нарушений условий договора со стороны персонала Фонда:&#039;&#039;&#039;&lt;br /&gt;
* SCP-049 имеет право временно отказаться от участия в тестах/исследованиях, пока конфликт не будет урегулирован.&lt;br /&gt;
* При этом SCP-049 обязан оставаться в пределах камеры содержания и не предпринимать действий, угрожающих безопасности учреждения.&lt;br /&gt;
* В экстренной ситуации (ЧС) действия Фонда, нарушающие удобства или привилегии SCP-049, не считаются нарушением, если они прямо направлены на спасение жизней персонала или локализацию угрозы.&lt;br /&gt;
&lt;br /&gt;
==== 10. ИЗМЕНЕНИЕ И РАСТОРЖЕНИЕ КОНТРАКТА ====&lt;br /&gt;
* Любые изменения в контракт вносятся только с письменного разрешения директора учреждения и согласования главы научной службы.&lt;br /&gt;
* Контракт может быть расторгнут по решению директора учреждения в случае систематических грубых нарушений со стороны SCP-049 или при изменении статуса объекта.&lt;br /&gt;
* В случае расторжения контракта все привилегии SCP-049 аннулируются, и он переводится на стандартный режим содержания.&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Контракт для копирования&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;pre class=&amp;quot;copyable-text&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
​[head=1]КОНТРАКТ[/head]&lt;br /&gt;
&lt;br /&gt;
Между [bold]SCP-049[/bold] (далее — «Чумной доктор») и [bold]SCP Foundation[/bold] (далее — «Фонд»)&lt;br /&gt;
&lt;br /&gt;
​[head=3]1. ЦЕЛЬ ДОГОВОРА[/head]&lt;br /&gt;
Настоящий контракт устанавливает правила содержания, взаимодействия и ограничений прав и обязанностей Чумного доктора и персонала Фонда. Документ направлен на обеспечение безопасности персонала, сохранение научной полезности объекта и предотвращение злоупотреблений привилегиями со стороны любой из сторон.&lt;br /&gt;
&lt;br /&gt;
​[head=3]2. СТОРОНЫ И ОПРЕДЕЛЕНИЯ[/head]&lt;br /&gt;
​[bullet][bold]Чумной доктор[/bold] — объект, идентифицированный под номером SCP-049.&lt;br /&gt;
[bullet][bold]Фонд[/bold] — организация, ответственная за содержание, изучение и контроль SCP-049.&lt;br /&gt;
​[bullet][bold]Персонал Фонда[/bold] — сотрудники учреждения, которые имеют ключ-карту, показывающую их уровень допуска и имеющие записи о их легитимности в консоли реестра персонала.&lt;br /&gt;
​[bullet][bold]Экстренная ситуация (ЧС)[/bold] — событие, представляющее непосредственную угрозу жизни и/или целостности учреждения и/или персонала (прорыв, вооружённое столкновение и т.п.).&lt;br /&gt;
&lt;br /&gt;
[head=3]3. ОБЩИЕ ПОЛОЖЕНИЯ[/head]&lt;br /&gt;
​[bullet]Чумной доктор подписал настоящий контракт и тем самым подтверждает своё понимание и принятие содержащихся в нём условий.&lt;br /&gt;
[bullet]Подписание не делает Чумного доктора сотрудником в организационном смысле; SCP-049 остаётся объектом содержания с ограниченными правами, определёнными в данном документе.&lt;br /&gt;
[bullet]Права, привилегии и обязанности Чумного доктора ограничены исключительно положениями настоящего контракта и решениями руководства учреждения (директора учреждения, глава научной службы).&lt;br /&gt;
&lt;br /&gt;
​[head=3]4. ПРАВА ЧУМНОГО ДОКТОРА[/head]&lt;br /&gt;
[bullet]Фонд обязуется обеспечить базовые условия содержания: безопасность, питание, медицинскую поддержку, а также возможность выполнять утверждённые исследовательские сессии под контролем персонала.&lt;br /&gt;
​[bullet]Чумному доктору разрешается делать письменные и устные заявления персоналу и учёным в пределах, не противоречащих инструкциям персонала соответствующего уровня (директор учреждения, глава научной службы, начальник СБ).&lt;br /&gt;
​[bullet]Прочие привилегии предоставляются лишь с разрешения главы научной службы или директора учреждения.&lt;br /&gt;
&lt;br /&gt;
​[head=3]4.1. ОСОБЫЕ РАЗРЕШЕНИЯ ДЛЯ ЗАПРОСОВ SCP-049[/head]&lt;br /&gt;
​[bold]Право на запросы[/bold]&lt;br /&gt;
SCP-049 имеет право подавать запросы на предоставление ограниченных предметов и «пациентов» (сотрудников класса D) исключительно через сотрудников уровня допуска 3 и выше.&lt;br /&gt;
&lt;br /&gt;
​Разрешённые предметы для медицинских операций:&lt;br /&gt;
​[bullet]базовые хирургические инструменты (скальпель, ретрактор, перчатки и т.п.);&lt;br /&gt;
​[bullet]простые медикаменты (наборы для ушибов, мази и т.п.) — строго под контролем ученых или СБ;&lt;br /&gt;
​[bullet]иные предметы могут быть добавлены в перечень только с письменного разрешения директора учреждения или главы научной службы.&lt;br /&gt;
&lt;br /&gt;
[bold]Пациенты (класс D)[/bold]&lt;br /&gt;
​[bullet]SCP-049 имеет право запросить предоставление подопытных (класс D) для проведения «операций» или исследований.&lt;br /&gt;
​[bullet]Количество одновременно предоставляемых D-классов определяется директором учреждения и не может превышать лимит, установленный внутренними протоколами.&lt;br /&gt;
​[bullet]Все действия SCP-049 с D-классами происходят исключительно под наблюдением учёных или службы безопасности.&lt;br /&gt;
&lt;br /&gt;
[bold]Ограничения и условия[/bold]&lt;br /&gt;
​[bullet]SCP-049 не имеет права самостоятельно выбирать конкретных D-классов или предметы. Решение принимает персонал Фонда, за исключением разрешенных предметов в пункте 4.1 договора.&lt;br /&gt;
[bullet]Запросы рассматриваются в рабочем порядке и могут быть отклонены без объяснения причин в случае угрозы безопасности, ЧП, нехватки ресурсов или по усмотрению руководства.&lt;br /&gt;
[bullet]Предоставление предметов и пациентов не является правом SCP-049, а лишь возможностью, доступной при условии его соблюдения правил содержания и безопасности.&lt;br /&gt;
&lt;br /&gt;
​[bold]Злоупотребления и нарушения[/bold]&lt;br /&gt;
​[bullet]В случае агрессивного или манипулятивного поведения SCP-049 во время подачи запроса он теряет право на дальнейшие заявки на срок, установленный директором или главой научной службы.&lt;br /&gt;
[bullet]При попытке использовать предоставленные предметы или D-классов вне рамок эксперимента — немедленное вмешательство СБ, изъятие предметов и применение мер подавления.&lt;br /&gt;
&lt;br /&gt;
​[head=3]5. ОГРАНИЧЕНИЯ И ОБЯЗАТЕЛЬСТВА ЧУМНОГО ДОКТОРА[/head]&lt;br /&gt;
[bullet]Чумной доктор не имеет права требовать от персонала действий, которые противоречат приказам директора учреждения, главы научной службы или СБ. Его слова не имеют силы приказа.&lt;br /&gt;
​[bullet]Чумной доктор обязуется не предпринимать действий, ведущих к угрозе для жизни персонала или целостности учреждения.&lt;br /&gt;
​[bullet]Манипулятивное, агрессивное или демонстративно требовательное поведение со стороны Чумного доктора считается нарушением условий и рассматривается как повод для дисциплинарных мер.&lt;br /&gt;
[bullet]В экстренной ситуации приоритет безопасности персонала и учреждения выше удобств Чумного доктора; его запросы и привилегии могут быть временно и безальтернативно приостановлены.&lt;br /&gt;
&lt;br /&gt;
​[head=3]6. ОБЯЗАННОСТИ И ПРАВА ПЕРСОНАЛА ФОНДА[/head]&lt;br /&gt;
​[bullet]Персонал обязан обращаться с Чумным доктором уважительно и профессионально, но без предоставления «особого статуса».&lt;br /&gt;
​[bullet]Персонал обязан соблюдать условия контракта и выполнять защитные инструкции.&lt;br /&gt;
​[bullet]СБ имеют право применять сдерживающие меры (средства подавления, амнезиаки, изоляция, применение силы) в случаях нарушения контракта либо при угрозе жизни/безопасности.&lt;br /&gt;
[bullet]При обнаружении попыток побега или существенного нарушения условий — директор учреждения и глава научной службы имеют приоритет на принятие мер.&lt;br /&gt;
&lt;br /&gt;
​[head=3]7. ПРОЦЕДУРЫ ПРИ ЭКСТРЕННЫХ СИТУАЦИЯХ[/head]&lt;br /&gt;
[bullet]В случае непосредственной угрозы жизни персонала или крупного нарушения — приоритетные действия: локализация угрозы, подавление (летальное, нелетальное по решению директора учреждения или начальника службы безопасности), изоляция объекта, применение амнезиаков и восстановительных процедур.&lt;br /&gt;
​[bullet]Если Чумной доктор выступает агрессивно, и присутствуют менее двух SCP-049-2, угроза считается контролируемой; при наличии двух и более SCP-049-2 применяются дополнительные протоколы ограничения и применения огня.&lt;br /&gt;
&lt;br /&gt;
[head=3]8. ИНФОРМАЦИЯ И СВЯЗЬ[/head]&lt;br /&gt;
​[bold]Конфиденциальность[/bold]&lt;br /&gt;
​[bullet]Вся внутренняя информация Фонда (радиопереговоры, документы, протоколы, личные записи сотрудников, внутренние отчёты) является секретной и предназначена исключительно для персонала с соответствующим уровнем допуска.&lt;br /&gt;
​[bullet]SCP-049 не имеет правового доступа к данным Фонда, за исключением тех сведений, которые прямо передаются ему в рамках экспериментов или общения с персоналом.&lt;br /&gt;
&lt;br /&gt;
​[bold]Запрет на использование средств связи[/bold]&lt;br /&gt;
​[bullet]SCP-049 запрещается владеть или использовать гарнитуры, рации, интеркомы, терминалы или любые другие устройства связи, которые позволяют получать или передавать служебную информацию персонала.&lt;br /&gt;
​[bullet]Любое устройство связи, найденное у SCP-049 или в его камере содержания, подлежит немедленному изъятию.&lt;br /&gt;
&lt;br /&gt;
[bold]Информационная изоляция[/bold]&lt;br /&gt;
​[bullet]Персонал обязан контролировать, чтобы SCP-049 не имел доступа к секретной информации.&lt;br /&gt;
[bullet]В случае, если SCP-049 случайно стал свидетелем или узнал информацию, не предназначенную для него, данная информация считается не имеющей юридической силы для SCP-049 и не может использоваться им как аргумент в запросах или переговорах.&lt;br /&gt;
&lt;br /&gt;
[bold]Ответственность[/bold]&lt;br /&gt;
​[bullet]Попытки SCP-049 использовать секретную информацию Фонда (включая шантаж или угрозы) являются нарушением контракта и влекут за собой немедленное применение мер подавления и временную изоляцию.&lt;br /&gt;
​[bullet]Нарушение конфиденциальности со стороны сотрудников (например, оставленная гарнитура в камере) фиксируется как служебная ошибка, и виновный персонал подлежит дисциплинарному взысканию.&lt;br /&gt;
&lt;br /&gt;
​[head=3]9. ДИСЦИПЛИНАРНЫЕ МЕРЫ И САНКЦИИ[/head]&lt;br /&gt;
​[bullet]За нарушение условий контракта Фонд вправе применять одно или несколько следующих мер: устное предупреждение, изоляция, принудительная седация, перевод в режим повышенного содержания, временное или постоянное ограничение привилегий.&lt;br /&gt;
​[bullet]В случае систематических или грубых нарушений — по решению директора учреждения возможно применение летальных мер.&lt;br /&gt;
&lt;br /&gt;
​[head=3]9.1. НАРУШЕНИЕ СО СТОРОНЫ ФОНДА[/head]&lt;br /&gt;
В случае если сотрудники Фонда нарушают условия контракта (применяют чрезмерное насилие, лишают SCP-049 прав и привилегий, прямо закреплённых в договоре, или игнорируют установленные договорённости без ЧС), SCP-049 получает право:&lt;br /&gt;
&lt;br /&gt;
​[bullet]Подать официальное обращение через назначенного куратора (учёный, глава научной службы или уполномоченный сотрудник 3+ уровня допуска).&lt;br /&gt;
&lt;br /&gt;
[bold]Если нарушение подтверждено:[/bold]&lt;br /&gt;
[bullet]Виновные сотрудники Фонда могут понести дисциплинарные меры (понижение, лишение допуска, перевод в D-класс, внутреннее расследование).&lt;br /&gt;
[bullet]SCP-049 получает компенсацию в виде восстановления нарушенных привилегий и дополнительной возможности (например, одна внеплановая исследовательская сессия, больше свободы в запросах мелкого инвентаря).&lt;br /&gt;
&lt;br /&gt;
​[bold]В случае систематических нарушений условий договора со стороны персонала Фонда:[/bold]&lt;br /&gt;
[bullet]SCP-049 имеет право временно отказаться от участия в тестах/исследованиях, пока конфликт не будет урегулирован.&lt;br /&gt;
[bullet]При этом SCP-049 обязан оставаться в пределах камеры содержания и не предпринимать действий, угрожающих безопасности учреждения.&lt;br /&gt;
​[bullet]В экстренной ситуации (ЧС) действия Фонда, нарушающие удобства или привилегии SCP-049, не считаются нарушением, если они прямо направлены на спасение жизней персонала или локализацию угрозы.&lt;br /&gt;
&lt;br /&gt;
​[head=3]10. ИЗМЕНЕНИЕ И РАСТОРЖЕНИЕ КОНТРАКТА[/head]&lt;br /&gt;
​[bullet]Любые изменения в контракт вносятся только с письменного разрешения директора учреждения и согласования главы научной службы.&lt;br /&gt;
​[bullet]Контракт может быть расторгнут по решению директора учреждения в случае систематических грубых нарушений со стороны SCP-049 или при изменении статуса объекта.&lt;br /&gt;
​[bullet]В случае расторжения контракта все привилегии SCP-049 аннулируются, и он переводится на стандартный режим содержания.                                                          &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BE%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%D0%9F%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C/styles.css&amp;diff=18059</id>
		<title>Шаблон:БоковаяПанель/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BE%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%D0%9F%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C/styles.css&amp;diff=18059"/>
		<updated>2026-04-08T07:41:38Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Основной контейнер */&lt;br /&gt;
.боковая-панель {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    max-height: 400px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель.без-скролла {&lt;br /&gt;
	max-height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Контейнер кнопок */&lt;br /&gt;
.боковая-панель-кнопки {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    max-width: 200px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    padding: 3px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель.без-скролла .боковая-панель-кнопки {&lt;br /&gt;
    overflow-y: clip;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Контейнер контента */&lt;br /&gt;
.боковая-панель-контент {&lt;br /&gt;
    flex: 1;&lt;br /&gt;
    padding: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-контент p {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Стили кнопок */&lt;br /&gt;
.боковая-панель-кнопка {&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    min-height: 48px !important;&lt;br /&gt;
    transition: all .3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка:hover {&lt;br /&gt;
	filter: contrast(0.9);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка.active {&lt;br /&gt;
	filter: contrast(0.85);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка .красивая-кнопка-Картинка {&lt;br /&gt;
	min-width: 48px;&lt;br /&gt;
    min-height: 48px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка .красивая-кнопка-Контент {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 18px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Стили разделов */&lt;br /&gt;
.боковая-панель-раздел {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-раздел.default {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-раздел .красивая-кнопка {&lt;br /&gt;
	min-height: 75px;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 800px) {&lt;br /&gt;
	.боковая-панель {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.боковая-панель-кнопки {&lt;br /&gt;
		max-width: 100%;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B%D0%98%D0%B3%D1%80%D1%8B&amp;diff=18058</id>
		<title>Шаблон:ОсновыИгры</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B%D0%98%D0%B3%D1%80%D1%8B&amp;diff=18058"/>
		<updated>2026-04-08T07:40:40Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Шаблон:ОсновыИгры/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер&amp;quot; style=&amp;quot;flex-direction: column; display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-Информация&amp;quot;&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=О игре&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=Space Station 14 вдохновлена культовой классикой [https://spacestation13.com/ Space Station 13] и рассказывает историю о том, как обычная смена на космической станции пошла не по плану.&lt;br /&gt;
Погрузитесь в свою роль, возитесь с проработанными системами и выживайте в хаосе в этой многопользовательской ролевой игре. Ниже наша команда собрала для вас полезные страницы!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Руководства&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Содержимое_отступ=3px&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=&lt;br /&gt;
{{Руководства}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BE%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%D0%9F%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C/styles.css&amp;diff=18057</id>
		<title>Шаблон:БоковаяПанель/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BE%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%D0%9F%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C/styles.css&amp;diff=18057"/>
		<updated>2026-04-08T07:40:15Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Основной контейнер */&lt;br /&gt;
.боковая-панель {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    max-height: 400px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель.без-скролла {&lt;br /&gt;
	max-height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Контейнер кнопок */&lt;br /&gt;
.боковая-панель-кнопки {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    max-width: 200px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    padding: 3px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель.без-скролла .боковая-панель-кнопки {&lt;br /&gt;
    overflow-y: clip;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Контейнер контента */&lt;br /&gt;
.боковая-панель-контент {&lt;br /&gt;
    flex: 1;&lt;br /&gt;
    padding: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-контент p {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Стили кнопок */&lt;br /&gt;
.боковая-панель-кнопка {&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    min-height: 48px !important;&lt;br /&gt;
    transition: all .3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка:hover {&lt;br /&gt;
	filter: contrast(0.9);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка.active {&lt;br /&gt;
	filter: contrast(0.85);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка .красивая-кнопка-Картинка {&lt;br /&gt;
	min-width: 48px;&lt;br /&gt;
    min-height: 48px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка .красивая-кнопка-Контент {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 18px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Стили разделов */&lt;br /&gt;
.боковая-панель-раздел {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-раздел.default {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-раздел .красивая-кнопка {&lt;br /&gt;
	min-height: 75px;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 800px) {&lt;br /&gt;
	.боковая-панель {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.боковая-панель-кнопки {&lt;br /&gt;
		max-width: 100%;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BE%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%D0%9F%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C/styles.css&amp;diff=18056</id>
		<title>Шаблон:БоковаяПанель/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BE%D0%BA%D0%BE%D0%B2%D0%B0%D1%8F%D0%9F%D0%B0%D0%BD%D0%B5%D0%BB%D1%8C/styles.css&amp;diff=18056"/>
		<updated>2026-04-08T07:39:54Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Основной контейнер */&lt;br /&gt;
.боковая-панель {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    max-height: 400px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель.без-скролла {&lt;br /&gt;
	max-height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Контейнер кнопок */&lt;br /&gt;
.боковая-панель-кнопки {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    max-width: 200px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    padding: 3px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель.без-скролла .боковая-панель-кнопки {&lt;br /&gt;
    overflow-y: clip;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Контейнер контента */&lt;br /&gt;
.боковая-панель-контент {&lt;br /&gt;
    flex: 1;&lt;br /&gt;
    padding: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-контент p {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Стили кнопок */&lt;br /&gt;
.боковая-панель-кнопка {&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    min-height: 48px !important;&lt;br /&gt;
    transition: all .3s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка:hover {&lt;br /&gt;
	filter: contrast(0.9);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка.active {&lt;br /&gt;
	filter: contrast(0.85);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка .красивая-кнопка-Картинка {&lt;br /&gt;
	min-width: 48px;&lt;br /&gt;
    min-height: 48px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-кнопка .красивая-кнопка-Контент {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: 18px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Стили разделов */&lt;br /&gt;
.боковая-панель-раздел {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-раздел.default {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    gap: 10px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.боковая-панель-раздел .красивая-кнопка {&lt;br /&gt;
	min-height: 75px;&lt;br /&gt;
	overflow: visible;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 800px) {&lt;br /&gt;
	.боковая-панель {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	.боковая-панель-кнопки {&lt;br /&gt;
		max-width: 100%;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B%D0%98%D0%B3%D1%80%D1%8B&amp;diff=18055</id>
		<title>Шаблон:ОсновыИгры</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B%D0%98%D0%B3%D1%80%D1%8B&amp;diff=18055"/>
		<updated>2026-04-08T07:39:03Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Шаблон:ОсновыИгры/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер&amp;quot; style=&amp;quot;flex-direction: column; display: flex;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-Информация&amp;quot;&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=О игре&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=Space Station 14 вдохновлена культовой классикой [https://spacestation13.com/ Space Station 13] и рассказывает историю о том, как обычная смена на космической станции пошла не по плану.&lt;br /&gt;
Погрузитесь в свою роль, возитесь с проработанными системами и выживайте в хаосе в этой многопользовательской ролевой игре. Ниже наша команда собрала для вас полезные страницы!&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Руководства&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Содержимое_отступ=5px&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=&lt;br /&gt;
{{Руководства}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F&amp;diff=18054</id>
		<title>Шаблон:Заглавная</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F&amp;diff=18054"/>
		<updated>2026-04-08T07:38:15Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Шаблон:Заглавная/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер&amp;quot;&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Основные страницы&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Содержимое_отступ=5px&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-Кнопки&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Правила сервера&lt;br /&gt;
|Подтекст=Необходимая для игры на сервере информация.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Правила.png&lt;br /&gt;
|Ссылка=Правила Сервера&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Объекты SCP&lt;br /&gt;
|Подтекст=Представленные на сервере SCP-объекты.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Объекты.png&lt;br /&gt;
|Ссылка=Объекты&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Отделы и роли&lt;br /&gt;
|Подтекст=Отделы, организации и роли, доступные на сервере.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Роли.png&lt;br /&gt;
|Ссылка=Роли&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Стандартные процедуры&lt;br /&gt;
|Подтекст=Общие регламенты, протоколы и процедуры.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=СП.png&lt;br /&gt;
|Ссылка=Стандартные протоколы&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Правовые кодексы и бюрократия&lt;br /&gt;
|Подтекст=Кодексы, уставы, нормативно-правовые акты Фонда, а также вся бюрократическая работа.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Законы.png&lt;br /&gt;
|Ссылка=Правовой кодекс и Бюрократия&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Руководства&lt;br /&gt;
|Подтекст=Для ознакомления с игровыми механиками и ролевыми нюансами.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Руководства.png&lt;br /&gt;
|Ссылка=Руководства&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-Информация&amp;quot;&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=О сервере&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&lt;br /&gt;
|Содержание=Это сервер в сеттинге таинственного и мрачного Фонда SCP - международной подпольной организации, держащей всё медиа, литературу и общественную осведомлённость железной хваткой. И всё для поддержания вечного блаженного неведения человечества. Организация поставит на содержание Бога. Она уже сделала это, и всем всё равно.&lt;br /&gt;
&lt;br /&gt;
Здесь у вас есть возможность отыграть роль в этом механизме, действующем в строгой иерархии, от исследователя до директора зоны и Смотрителя. Исследовать эзотерические аномалии и пространственные нарушения или сохранять человечество перед лицом хтонических чудовищ и скульпторов реальности -- ваш выбор&lt;br /&gt;
&lt;br /&gt;
Погрузитесь в одно из секретных учреждений Организации, обеспечивающей нормальность на Земле. Здесь всё на грани. Всё время слышен неспешный напев предвкушения, всё время ощущается знание чего-то большего, а конец всё время вне досягаемости. Так что не поднимайте голову и трудитесь не покладая рук. Вас не заставляют любить свою работу, но вы обязаны её выполнять. Если вам начнут сниться сны, обратитесь к психиатру. Если вам станет плохо, не обращайте внимания на кровь. Если вы начнёте терять воспоминания, не беспокойтесь. Так уж здесь заведено.&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать в Фонд.&lt;br /&gt;
&lt;br /&gt;
Нет, это не твой первый день.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F&amp;diff=18053</id>
		<title>Шаблон:Заглавная</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F&amp;diff=18053"/>
		<updated>2026-04-08T07:38:08Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Шаблон:Заглавная/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер&amp;quot;&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Основные страницы&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Содержимое_отступ=10px&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-Кнопки&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Правила сервера&lt;br /&gt;
|Подтекст=Необходимая для игры на сервере информация.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Правила.png&lt;br /&gt;
|Ссылка=Правила Сервера&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Объекты SCP&lt;br /&gt;
|Подтекст=Представленные на сервере SCP-объекты.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Объекты.png&lt;br /&gt;
|Ссылка=Объекты&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Отделы и роли&lt;br /&gt;
|Подтекст=Отделы, организации и роли, доступные на сервере.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Роли.png&lt;br /&gt;
|Ссылка=Роли&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Стандартные процедуры&lt;br /&gt;
|Подтекст=Общие регламенты, протоколы и процедуры.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=СП.png&lt;br /&gt;
|Ссылка=Стандартные протоколы&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Правовые кодексы и бюрократия&lt;br /&gt;
|Подтекст=Кодексы, уставы, нормативно-правовые акты Фонда, а также вся бюрократическая работа.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Законы.png&lt;br /&gt;
|Ссылка=Правовой кодекс и Бюрократия&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/Кнопка&lt;br /&gt;
|Текст=Руководства&lt;br /&gt;
|Подтекст=Для ознакомления с игровыми механиками и ролевыми нюансами.&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Руководства.png&lt;br /&gt;
|Ссылка=Руководства&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-Информация&amp;quot;&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=О сервере&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&lt;br /&gt;
|Содержание=Это сервер в сеттинге таинственного и мрачного Фонда SCP - международной подпольной организации, держащей всё медиа, литературу и общественную осведомлённость железной хваткой. И всё для поддержания вечного блаженного неведения человечества. Организация поставит на содержание Бога. Она уже сделала это, и всем всё равно.&lt;br /&gt;
&lt;br /&gt;
Здесь у вас есть возможность отыграть роль в этом механизме, действующем в строгой иерархии, от исследователя до директора зоны и Смотрителя. Исследовать эзотерические аномалии и пространственные нарушения или сохранять человечество перед лицом хтонических чудовищ и скульпторов реальности -- ваш выбор&lt;br /&gt;
&lt;br /&gt;
Погрузитесь в одно из секретных учреждений Организации, обеспечивающей нормальность на Земле. Здесь всё на грани. Всё время слышен неспешный напев предвкушения, всё время ощущается знание чего-то большего, а конец всё время вне досягаемости. Так что не поднимайте голову и трудитесь не покладая рук. Вас не заставляют любить свою работу, но вы обязаны её выполнять. Если вам начнут сниться сны, обратитесь к психиатру. Если вам станет плохо, не обращайте внимания на кровь. Если вы начнёте терять воспоминания, не беспокойтесь. Так уж здесь заведено.&lt;br /&gt;
&lt;br /&gt;
Добро пожаловать в Фонд.&lt;br /&gt;
&lt;br /&gt;
Нет, это не твой первый день.&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18052</id>
		<title>Шаблон:Заглавная/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18052"/>
		<updated>2026-04-08T07:37:53Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.главная-враппер {&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: 0.85fr 1fr;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки {&lt;br /&gt;
	padding: 2px;&lt;br /&gt;
	margin-top: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки,&lt;br /&gt;
.главная-враппер-Информация {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: repeat(6, minmax(0, 1fr));&lt;br /&gt;
	gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Только кнопки */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
	grid-column: span 2; /* 3 в ряд */&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 2 кнопки (например всего 5) -&amp;gt; по 50% */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:nth-last-of-type(2):nth-of-type(3n + 1),&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 2) {&lt;br /&gt;
	grid-column: span 3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 1 кнопка -&amp;gt; на всю ширину */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 1) {&lt;br /&gt;
	grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 1050px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:nth-last-of-type(2):nth-of-type(3n + 1),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 2),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 1) {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
		grid-column: 1 / -1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	min-width: 24%;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки-Ссылка {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 750px) {&lt;br /&gt;
	.главная-ссылки {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-2 img {&lt;br /&gt;
	image-rendering: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	min-height: 0;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка:hover {&lt;br /&gt;
	opacity: 0.05;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	padding: 4px;&lt;br /&gt;
	height: 88px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка span {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Контент {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	justify-content: center;&lt;br /&gt;
	gap: 4px;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	padding: 6px 10px;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Текст {&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Подтекст {&lt;br /&gt;
	font-size: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: 0;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	left: 0;&lt;br /&gt;
	right: 0;&lt;br /&gt;
	z-index: 3;&lt;br /&gt;
	background-color: #FFFFFF;&lt;br /&gt;
	opacity: 0;&lt;br /&gt;
	transition: all 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.заглавная-кнопка-СоцСеть-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-СоцСеть-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D0%BE%D1%86%D0%A1%D0%B5%D1%82%D0%B8&amp;diff=18051</id>
		<title>Шаблон:СоцСети</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D0%BE%D1%86%D0%A1%D0%B5%D1%82%D0%B8&amp;diff=18051"/>
		<updated>2026-04-08T07:36:41Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Шаблон:Заглавная/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-2&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Сообщества&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Содержимое_отступ=5px&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=&amp;lt;div class=&amp;quot;главная-враппер-сообщества-Кнопки&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=IP сервера&lt;br /&gt;
|Подтекст=ss14s://sunrise14.top/fire/&amp;lt;br&amp;gt;ss14s://mirror.ss14.org/fire&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=SpaceStationLogo.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=Discord&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=DiscordImage.png&lt;br /&gt;
|Ссылка=https://discord.gg/UfFauprc55&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=Boosty&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=BoostyImage.png&lt;br /&gt;
|Ссылка=https://boosty.to/fire-station-ss14&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=GitHub&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=GitHubImage.png&lt;br /&gt;
|Ссылка=https://github.com/space-sunrise/fire-station/&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=SS14 Nexus&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Fire-station-logo.png&lt;br /&gt;
|Ссылка=https://ss14.org/projects/fire_station&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D0%BE%D1%86%D0%A1%D0%B5%D1%82%D0%B8&amp;diff=18050</id>
		<title>Шаблон:СоцСети</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D0%BE%D1%86%D0%A1%D0%B5%D1%82%D0%B8&amp;diff=18050"/>
		<updated>2026-04-08T07:36:34Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Шаблон:Заглавная/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-2&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Сообщества&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=&amp;lt;div class=&amp;quot;главная-враппер-сообщества-Кнопки&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=IP сервера&lt;br /&gt;
|Подтекст=ss14s://sunrise14.top/fire/&amp;lt;br&amp;gt;ss14s://mirror.ss14.org/fire&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=SpaceStationLogo.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=Discord&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=DiscordImage.png&lt;br /&gt;
|Ссылка=https://discord.gg/UfFauprc55&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=Boosty&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=BoostyImage.png&lt;br /&gt;
|Ссылка=https://boosty.to/fire-station-ss14&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=GitHub&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=GitHubImage.png&lt;br /&gt;
|Ссылка=https://github.com/space-sunrise/fire-station/&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=SS14 Nexus&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=Fire-station-logo.png&lt;br /&gt;
|Ссылка=https://ss14.org/projects/fire_station&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D0%BE%D1%86%D0%A1%D0%B5%D1%82%D0%B8&amp;diff=18049</id>
		<title>Шаблон:СоцСети</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D0%BE%D1%86%D0%A1%D0%B5%D1%82%D0%B8&amp;diff=18049"/>
		<updated>2026-04-08T07:36:21Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;templatestyles src=&amp;quot;Шаблон:Заглавная/styles.css&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;главная-враппер-2&amp;gt;&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Сообщества&lt;br /&gt;
|Цвет_карточки=#28282e&lt;br /&gt;
|Цвет_заголовка=#28282e&lt;br /&gt;
|Содержимое_отступ=5px&lt;br /&gt;
|Название_выравнивание=center&lt;br /&gt;
|Скрываемое_содержание=нет&amp;lt;!-- да стоит по умолчанию, ввод параметра не обязателен --&amp;gt;&lt;br /&gt;
|Содержание=&amp;lt;div class=&amp;quot;главная-враппер-сообщества-Кнопки&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=IP сервера&lt;br /&gt;
|Подтекст=ss14s://sunrise14.top/fire/&amp;lt;br&amp;gt;ss14s://mirror.ss14.org/fire&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=SpaceStationLogo.png&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=Discord&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=DiscordImage.png&lt;br /&gt;
|Ссылка=https://discord.gg/UfFauprc55&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=Boosty&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=BoostyImage.png&lt;br /&gt;
|Ссылка=https://boosty.to/fire-station-ss14&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;!-- ----- --&amp;gt;&lt;br /&gt;
{{Заглавная/СоцСеть&lt;br /&gt;
|Текст=GitHub&lt;br /&gt;
|Цвет_кнопки=#35353d&lt;br /&gt;
|Изображение=GitHubImage.png&lt;br /&gt;
|Ссылка=https://github.com/space-sunrise/fire-station/&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18048</id>
		<title>Шаблон:Заглавная/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18048"/>
		<updated>2026-04-08T07:35:26Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.главная-враппер {&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: 0.85fr 1fr;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки {&lt;br /&gt;
	padding: 2px;&lt;br /&gt;
	margin-top: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки,&lt;br /&gt;
.главная-враппер-Информация {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: repeat(6, minmax(0, 1fr));&lt;br /&gt;
	gap: 10px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Только кнопки */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
	grid-column: span 2; /* 3 в ряд */&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 2 кнопки (например всего 5) -&amp;gt; по 50% */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:nth-last-of-type(2):nth-of-type(3n + 1),&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 2) {&lt;br /&gt;
	grid-column: span 3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 1 кнопка -&amp;gt; на всю ширину */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 1) {&lt;br /&gt;
	grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 1050px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:nth-last-of-type(2):nth-of-type(3n + 1),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 2),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 1) {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
		grid-column: 1 / -1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	min-width: 24%;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки-Ссылка {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 750px) {&lt;br /&gt;
	.главная-ссылки {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-2 img {&lt;br /&gt;
	image-rendering: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	min-height: 0;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка:hover {&lt;br /&gt;
	opacity: 0.05;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	padding: 4px;&lt;br /&gt;
	height: 88px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка span {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Контент {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	justify-content: center;&lt;br /&gt;
	gap: 4px;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	padding: 6px 10px;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Текст {&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Подтекст {&lt;br /&gt;
	font-size: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: 0;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	left: 0;&lt;br /&gt;
	right: 0;&lt;br /&gt;
	z-index: 3;&lt;br /&gt;
	background-color: #FFFFFF;&lt;br /&gt;
	opacity: 0;&lt;br /&gt;
	transition: all 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.заглавная-кнопка-СоцСеть-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-СоцСеть-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18047</id>
		<title>Шаблон:Заглавная/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18047"/>
		<updated>2026-04-08T07:27:09Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.главная-враппер {&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: 0.85fr 1fr;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки {&lt;br /&gt;
	padding: 2px;&lt;br /&gt;
	margin-top: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки,&lt;br /&gt;
.главная-враппер-Информация {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: repeat(6, minmax(0, 1fr));&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Только кнопки */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
	grid-column: span 2; /* 3 в ряд */&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 2 кнопки (например всего 5) -&amp;gt; по 50% */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:nth-last-of-type(2):nth-of-type(3n + 1),&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 2) {&lt;br /&gt;
	grid-column: span 3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 1 кнопка -&amp;gt; на всю ширину */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 1) {&lt;br /&gt;
	grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 1050px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:nth-last-of-type(2):nth-of-type(3n + 1),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 2),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка:last-of-type:nth-of-type(3n + 1) {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; .красивая-кнопка {&lt;br /&gt;
		grid-column: 1 / -1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	min-width: 24%;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки-Ссылка {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 750px) {&lt;br /&gt;
	.главная-ссылки {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-2 img {&lt;br /&gt;
	image-rendering: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	min-height: 0;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка:hover {&lt;br /&gt;
	opacity: 0.05;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	padding: 4px;&lt;br /&gt;
	height: 88px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка span {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Контент {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	justify-content: center;&lt;br /&gt;
	gap: 4px;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	padding: 6px 10px;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Текст {&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Подтекст {&lt;br /&gt;
	font-size: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: 0;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	left: 0;&lt;br /&gt;
	right: 0;&lt;br /&gt;
	z-index: 3;&lt;br /&gt;
	background-color: #FFFFFF;&lt;br /&gt;
	opacity: 0;&lt;br /&gt;
	transition: all 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.заглавная-кнопка-СоцСеть-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-СоцСеть-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18046</id>
		<title>Шаблон:Заглавная/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18046"/>
		<updated>2026-04-08T07:25:26Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.главная-враппер {&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: 0.85fr 1fr;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки {&lt;br /&gt;
	padding: 2px;&lt;br /&gt;
	margin-top: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки,&lt;br /&gt;
.главная-враппер-Информация {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: repeat(6, minmax(0, 1fr));&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Базово: 3 элемента в ряд (2/6 колонки на элемент) */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; * {&lt;br /&gt;
	grid-column: span 2;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 2 элемента (например, всего 5) — по половине строки */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :nth-last-child(2):nth-child(3n + 1),&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 2) {&lt;br /&gt;
	grid-column: span 3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 1 элемент — на всю строку */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 1) {&lt;br /&gt;
	grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 1050px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; * {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; :nth-last-child(2):nth-child(3n + 1),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 2),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 1) {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; * {&lt;br /&gt;
		grid-column: 1 / -1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	min-width: 24%;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки-Ссылка {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 750px) {&lt;br /&gt;
	.главная-ссылки {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-2 img {&lt;br /&gt;
	image-rendering: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
	min-height: 0;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка:hover {&lt;br /&gt;
	opacity: 0.05;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	padding: 4px;&lt;br /&gt;
	height: 88px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка span {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Контент {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	justify-content: center;&lt;br /&gt;
	gap: 4px;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	padding: 6px 10px;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Текст {&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Подтекст {&lt;br /&gt;
	font-size: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: 0;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	left: 0;&lt;br /&gt;
	right: 0;&lt;br /&gt;
	z-index: 3;&lt;br /&gt;
	background-color: #FFFFFF;&lt;br /&gt;
	opacity: 0;&lt;br /&gt;
	transition: all 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.заглавная-кнопка-СоцСеть-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-СоцСеть-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18045</id>
		<title>Шаблон:Заглавная/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18045"/>
		<updated>2026-04-08T07:24:26Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.главная-враппер {&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: 0.85fr 1fr;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки {&lt;br /&gt;
	padding: 2px;&lt;br /&gt;
	margin-top: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки,&lt;br /&gt;
.главная-враппер-Информация {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: repeat(6, minmax(0, 1fr));&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Базово: 3 элемента в ряд (каждый занимает 2 из 6 колонок) */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; * {&lt;br /&gt;
	grid-column: span 2;&lt;br /&gt;
	min-width: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 2 элемента (например всего 5) — растягиваем их на всю строку */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :nth-last-child(2):nth-child(3n + 1),&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 2) {&lt;br /&gt;
	grid-column: span 3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Если в последнем ряду 1 элемент — на всю ширину */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 1) {&lt;br /&gt;
	grid-column: 1 / -1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 1050px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: repeat(2, minmax(0, 1fr));&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; * {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; :nth-last-child(2):nth-child(3n + 1),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 2),&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 1) {&lt;br /&gt;
		grid-column: span 1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; * {&lt;br /&gt;
		grid-column: 1 / -1;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	min-width: 24%;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки-Ссылка {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 750px) {&lt;br /&gt;
	.главная-ссылки {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-2 img {&lt;br /&gt;
	image-rendering: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка {&lt;br /&gt;
	height: 88px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка span {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.заглавная-кнопка-СоцСеть-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-СоцСеть-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D1%80%D0%B0%D1%81%D0%B8%D0%B2%D0%B0%D1%8F%D0%9A%D0%BD%D0%BE%D0%BF%D0%BA%D0%B0/styles.css&amp;diff=18044</id>
		<title>Шаблон:КрасиваяКнопка/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D1%80%D0%B0%D1%81%D0%B8%D0%B2%D0%B0%D1%8F%D0%9A%D0%BD%D0%BE%D0%BF%D0%BA%D0%B0/styles.css&amp;diff=18044"/>
		<updated>2026-04-08T07:22:13Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.красивая-кнопка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	min-width: 0;     /* убрали ограничение по минимальной ширине */&lt;br /&gt;
	min-height: 0;    /* убрали ограничение по минимальной высоте */&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	border-radius: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка:hover {&lt;br /&gt;
	opacity: 0.05;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
	padding: 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Контент {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	justify-content: center;&lt;br /&gt;
	gap: 4px;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	padding: 6px 10px;&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	min-width: 0; /* чтобы контент не раздувал flex-элемент */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Текст {&lt;br /&gt;
	line-height: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-контент-Подтекст {&lt;br /&gt;
	font-size: 12px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Ссылка {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: 0;&lt;br /&gt;
	bottom: 0;&lt;br /&gt;
	left: 0;&lt;br /&gt;
	right: 0;&lt;br /&gt;
	z-index: 3;&lt;br /&gt;
	background-color: #FFFFFF;&lt;br /&gt;
	opacity: 0;&lt;br /&gt;
	transition: all 0.2s ease;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18043</id>
		<title>Шаблон:Заглавная/styles.css</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F/styles.css&amp;diff=18043"/>
		<updated>2026-04-08T07:19:38Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.главная-враппер {&lt;br /&gt;
	display: grid;&lt;br /&gt;
	grid-template-columns: 0.85fr 1fr;&lt;br /&gt;
	gap: 8px;&lt;br /&gt;
	margin-bottom: 15px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер {&lt;br /&gt;
		grid-template-columns: 1fr;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки {&lt;br /&gt;
	padding: 2px;&lt;br /&gt;
	margin-top: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-Кнопки,&lt;br /&gt;
.главная-враппер-Информация {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-сообщества-Кнопки {&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	gap: 3px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Максимум 3 элемента в ряд */&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; * {&lt;br /&gt;
	flex: 0 0 calc((100% - 2 * 3px) / 3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :nth-last-child(2):nth-child(3n + 1),&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 2) {&lt;br /&gt;
	flex-basis: calc((100% - 3px) / 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-сообщества-Кнопки &amp;gt; :last-child:nth-child(3n + 1) {&lt;br /&gt;
	flex-basis: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 750px) {&lt;br /&gt;
	.главная-враппер-сообщества-Кнопки &amp;gt; * {&lt;br /&gt;
		flex-basis: 100%;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	min-width: 24%;&lt;br /&gt;
	padding: 3px;&lt;br /&gt;
	gap: 6px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-ссылки-Ссылка {&lt;br /&gt;
	display: flex;&lt;br /&gt;
	flex-direction: column;&lt;br /&gt;
	flex-wrap: wrap;&lt;br /&gt;
	justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 750px) {&lt;br /&gt;
	.главная-ссылки {&lt;br /&gt;
		flex-direction: column;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.главная-враппер-2 img {&lt;br /&gt;
	image-rendering: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка {&lt;br /&gt;
	height: 88px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка span {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.заглавная-кнопка-СоцСеть-Картинка {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: flex;&lt;br /&gt;
	align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.красивая-кнопка-СоцСеть-Картинка img {&lt;br /&gt;
	height: 100%;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A6%D0%B5%D0%BB%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%B0/%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=17833</id>
		<title>Шаблон:Цели комплекса/Рекомендации и примеры выполнения</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A6%D0%B5%D0%BB%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%B0/%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=17833"/>
		<updated>2026-04-03T12:52:36Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Рамка&lt;br /&gt;
|Название=Цель 1&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Цели комплекса/Рекомендации и примеры выполнения/Цель 1}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Цель 2&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Цели комплекса/Рекомендации и примеры выполнения/Цель 2}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Цель 3&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Цели комплекса/Рекомендации и примеры выполнения/Цель 3}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Цель 4&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Цели комплекса/Рекомендации и примеры выполнения/Цель 4}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Цель 5&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Цели комплекса/Рекомендации и примеры выполнения/Цель 5}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Цель 6&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Цели комплекса/Рекомендации и примеры выполнения/Цель 6}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Цель 7&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Цели комплекса/Рекомендации и примеры выполнения/Цель 7}}&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Цель 8&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Цели комплекса/Рекомендации и примеры выполнения/Цель 8}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A6%D0%B5%D0%BB%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%B0/%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F/%D0%A6%D0%B5%D0%BB%D1%8C_6&amp;diff=17832</id>
		<title>Шаблон:Цели комплекса/Рекомендации и примеры выполнения/Цель 6</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A6%D0%B5%D0%BB%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%B0/%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F/%D0%A6%D0%B5%D0%BB%D1%8C_6&amp;diff=17832"/>
		<updated>2026-04-03T12:51:49Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable noresize&amp;quot; style=&amp;quot;text-align:left;width:100%;min-width:500px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width=20%&amp;quot; | Пункт&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width: 40%&amp;quot; | Рекомендации&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width: 40%&amp;quot; | Пример&lt;br /&gt;
|-&lt;br /&gt;
|1. Определить пределы физической активности SCP-939 вне камеры содержания.&lt;br /&gt;
|Замеряйте выносливость, физические параметры, время бодрствование, объекта во время НОУС &lt;br /&gt;
|При НОУС SCP-939, замеряйте скорость реакции, мобильность, силу укуса объекта, время регенерации, устойчивость к повреждениям и внешних факторов, как ультра-звук. Запишите результаты.&lt;br /&gt;
|-&lt;br /&gt;
|2. Провести опыты по изучению агрессии SCP-939 при угрозе его безопасности.&lt;br /&gt;
|Симулируйте угрозу для SCP-939 в его камере содержания, наблюдайте за действиями объекта и сделайте несколько типов угрозы.&lt;br /&gt;
|В камеру к SCP-939, приведите класс Д с оружием разного типа, от звукового до физического, запишите каждый результат поведения объекта при каждом типе угрозы.&lt;br /&gt;
|-&lt;br /&gt;
|3. Разработать стратегию предотвращения побегов SCP-939 через голосовую манипуляцию.&lt;br /&gt;
|Напишите отчёт об новых способах ВОУС SCP-939 через: имитацию голоса, запись голоса.&lt;br /&gt;
|Запишите реплику на устройство для записи звука/используйте готовые записи, при НОУС объекта, поставьте заранее подготовленное устройство, включите его и мониторьте,  как объект реагирует, запишите результаты.&lt;br /&gt;
|-&lt;br /&gt;
|4. Зафиксировать процесс перемещения SCP-106 через коррозионные зоны.&lt;br /&gt;
|Задокументируйте, как объект проходит сквозь твёрдые поверхности (Попробуйте получить у живых свидетелей информацию, запишите её)&lt;br /&gt;
|При НОУС объекта 106, наблюдайте за перемещением объекта сквозь двери/стены/окна. Напишите этапы, время, через которое объект проходит сквозь структуры.&lt;br /&gt;
|-&lt;br /&gt;
|5. Изучить реакцию SCP-082 на различные типы пищи.&lt;br /&gt;
|Отсутствуют&lt;br /&gt;
|Отсутствует&lt;br /&gt;
|-&lt;br /&gt;
|6. Провести серию бесед с SCP-082 для оценки его когнитивных способностей.&lt;br /&gt;
|Отсутствует&lt;br /&gt;
|Отсутствует&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A6%D0%B5%D0%BB%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%B0/%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F/%D0%A6%D0%B5%D0%BB%D1%8C_5&amp;diff=17831</id>
		<title>Шаблон:Цели комплекса/Рекомендации и примеры выполнения/Цель 5</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A6%D0%B5%D0%BB%D0%B8_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BB%D0%B5%D0%BA%D1%81%D0%B0/%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B_%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F/%D0%A6%D0%B5%D0%BB%D1%8C_5&amp;diff=17831"/>
		<updated>2026-04-03T12:49:33Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable noresize&amp;quot; style=&amp;quot;text-align:left;width:100%;min-width:500px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width=20%&amp;quot; | Пункт&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width: 40%&amp;quot; | Рекомендации&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width: 40%&amp;quot; | Пример&lt;br /&gt;
|-&lt;br /&gt;
|1. Задействовать SCP-082 в симуляции взаимодействия с персоналом.&lt;br /&gt;
|Отсутствуют&lt;br /&gt;
|Отсутствует&lt;br /&gt;
|-&lt;br /&gt;
|2. Оценить уровень агрессии SCP-082 при отказе в предоставлении пищи.&lt;br /&gt;
|Отсутствуют&lt;br /&gt;
|Отсутствует&lt;br /&gt;
|-&lt;br /&gt;
|3. Исследовать влияние общения с SCP-082 на моральный дух персонала.&lt;br /&gt;
|Отсутствуют&lt;br /&gt;
|Отсутствует&lt;br /&gt;
|-&lt;br /&gt;
|4. Создать протоколы безопасного взаимодействия с SCP-082 в рамках ролевых экспериментов.&lt;br /&gt;
|Отсутствуют&lt;br /&gt;
|Отсутствует&lt;br /&gt;
|-&lt;br /&gt;
|5. Составить отчёт о поведении SCP-082 в контролируемых условиях.&lt;br /&gt;
|Отсутствуют&lt;br /&gt;
|Отсутствует&lt;br /&gt;
|-&lt;br /&gt;
|6. Зафиксировать продолжительность фазы агрессии SCP-096 в различных условиях.&lt;br /&gt;
|Используйте дистанционную провокацию (осматривание фотографии с SCP-096). Фиксируйте данные автоматически. Ищите корреляции.&lt;br /&gt;
|Провоцируйте SCP-096 с разного расстояния и с разными преградами. Замеряйте время от начала агрессии до успокоения.&lt;br /&gt;
|-&lt;br /&gt;
|7. Создать симуляцию массового наблюдения за SCP-096 для проверки пределов его реакций.&lt;br /&gt;
|Крайне опасно. Используйте Д класс. Офицеры ОСН должны быть готовы произвести процедуру восстановления условий содержания.&lt;br /&gt;
|Организуйте одновременное наблюдение за SCP-096 с нескольких камер и через несколько смотровых окон. Проверьте, реагирует ли он на множественные взгляды.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17811</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17811"/>
		<updated>2026-04-01T21:54:37Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilPrankModule = {&lt;br /&gt;
    FORCE_PRANK_FOR_ALL: true, &lt;br /&gt;
    ONLY_MAIN_PAGE: false,       &lt;br /&gt;
    ANIMATION_MS: 5000,&lt;br /&gt;
    SHOWN_SESSION_KEY: &#039;april-prank-shown-v2&#039;,&lt;br /&gt;
&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
    isClosing: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.ONLY_MAIN_PAGE &amp;amp;&amp;amp; window.mw &amp;amp;&amp;amp; mw.config &amp;amp;&amp;amp; !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (!this.shouldRun()) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Чтобы не показывалось повторно в одной вкладке&lt;br /&gt;
        if (sessionStorage.getItem(this.SHOWN_SESSION_KEY) === &#039;1&#039;) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        sessionStorage.setItem(this.SHOWN_SESSION_KEY, &#039;1&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.buildOverlay();&lt;br /&gt;
        this.bindEvents();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    shouldRun: function () {&lt;br /&gt;
        if (this.FORCE_PRANK_FOR_ALL) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        if (!params.has(&#039;prank&#039;)) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var value = (params.get(&#039;prank&#039;) || &#039;&#039;).trim().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
        // Работает для ?prank, ?prank=1, ?prank=true, ?prank=on, ?prank=yes&lt;br /&gt;
        if (value === &#039;&#039; || value === &#039;1&#039; || value === &#039;true&#039; || value === &#039;on&#039; || value === &#039;yes&#039;) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
	injectStyles: function () {&lt;br /&gt;
	    if (document.getElementById(&#039;april-prank-styles&#039;)) {&lt;br /&gt;
	        return;&lt;br /&gt;
	    }&lt;br /&gt;
	&lt;br /&gt;
	    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
	    style.id = &#039;april-prank-styles&#039;;&lt;br /&gt;
	    style.textContent =&lt;br /&gt;
	        &#039;#april-prank-overlay {&#039; +&lt;br /&gt;
	            &#039;position: fixed;&#039; +&lt;br /&gt;
	            &#039;inset: 0;&#039; +&lt;br /&gt;
	            &#039;z-index: 2147483647;&#039; +&lt;br /&gt;
	            &#039;background: #000;&#039; +&lt;br /&gt;
	            &#039;overflow: auto;&#039; +&lt;br /&gt;
	            &#039;cursor: pointer;&#039; +&lt;br /&gt;
	            &#039;transform: translateY(0);&#039; +&lt;br /&gt;
	            &#039;will-change: transform;&#039; +&lt;br /&gt;
	        &#039;}&#039; +&lt;br /&gt;
	        &#039;#april-prank-overlay.closing {&#039; +&lt;br /&gt;
	            &#039;transition: transform 5000ms linear;&#039; +&lt;br /&gt;
	            &#039;transform: translateY(-100%);&#039; +&lt;br /&gt;
	        &#039;}&#039; +&lt;br /&gt;
	        &#039;#april-prank-overlay img {&#039; +&lt;br /&gt;
	            &#039;display: block;&#039; +&lt;br /&gt;
	            &#039;width: 100%;&#039; +&lt;br /&gt;
	            &#039;height: auto;&#039; +&lt;br /&gt;
	            &#039;min-height: 100vh;&#039; +&lt;br /&gt;
	            &#039;object-fit: cover;&#039; +&lt;br /&gt;
	            &#039;user-select: none;&#039; +&lt;br /&gt;
	            &#039;-webkit-user-drag: none;&#039; +&lt;br /&gt;
	            &#039;pointer-events: none;&#039; +&lt;br /&gt;
	        &#039;}&#039; +&lt;br /&gt;
	        &#039;#april-prank-overlay.mobile {&#039; +&lt;br /&gt;
	            &#039;display: flex;&#039; +&lt;br /&gt;
	            &#039;align-items: center;&#039; +&lt;br /&gt;
	            &#039;justify-content: center;&#039; +&lt;br /&gt;
	            &#039;padding: 0;&#039; +&lt;br /&gt;
	            &#039;overflow: hidden;&#039; +&lt;br /&gt;
	            &#039;background: #0b0b0b;&#039; +&lt;br /&gt;
	        &#039;}&#039; +&lt;br /&gt;
	        &#039;#april-prank-overlay.mobile img {&#039; +&lt;br /&gt;
	            &#039;width: 100%;&#039; +&lt;br /&gt;
	            &#039;height: 100svh;&#039; +&lt;br /&gt;
	            &#039;min-height: 0;&#039; +&lt;br /&gt;
	            &#039;object-fit: contain;&#039; +&lt;br /&gt;
	        &#039;}&#039;;&lt;br /&gt;
	    document.head.appendChild(style);&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	buildOverlay: function () {&lt;br /&gt;
	    var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
	    overlay.id = &#039;april-prank-overlay&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
	&lt;br /&gt;
	    var isMobile =&lt;br /&gt;
	        window.matchMedia(&#039;(max-width: 768px)&#039;).matches ||&lt;br /&gt;
	        /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);&lt;br /&gt;
	&lt;br /&gt;
	    if (isMobile) {&lt;br /&gt;
	        overlay.classList.add(&#039;mobile&#039;);&lt;br /&gt;
	    }&lt;br /&gt;
	&lt;br /&gt;
	    img.src = isMobile&lt;br /&gt;
	        ? &#039;https://i.redd.it/yjmiajn4uq5a1.jpg&#039;&lt;br /&gt;
	        : &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    img.alt = &#039;Wikipedia homepage screenshot&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    overlay.appendChild(img);&lt;br /&gt;
	    document.body.appendChild(overlay);&lt;br /&gt;
	&lt;br /&gt;
	    this.overlay = overlay;&lt;br /&gt;
	    this.audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
	    this.audio.preload = &#039;auto&#039;;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
    bindEvents: function () {&lt;br /&gt;
        var self = this;&lt;br /&gt;
        if (!this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.startClose();&lt;br /&gt;
        }, { passive: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startClose: function () {&lt;br /&gt;
        if (this.isClosing || !this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.isClosing = true;&lt;br /&gt;
&lt;br /&gt;
        if (this.audio) {&lt;br /&gt;
            this.audio.currentTime = 0;&lt;br /&gt;
            this.audio.play().catch(function () {&lt;br /&gt;
                // Браузер может заблокировать autoplay — клик уже есть, обычно играет&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.classList.add(&#039;closing&#039;);&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            if (self.audio) {&lt;br /&gt;
                self.audio.pause();&lt;br /&gt;
                self.audio.currentTime = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }, this.ANIMATION_MS);&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function onEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, onEnd);&lt;br /&gt;
&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
        // AprilPrankModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17810</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17810"/>
		<updated>2026-04-01T17:16:09Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilPrankModule = {&lt;br /&gt;
    FORCE_PRANK_FOR_ALL: true, &lt;br /&gt;
    ONLY_MAIN_PAGE: false,       &lt;br /&gt;
    ANIMATION_MS: 5000,&lt;br /&gt;
    SHOWN_SESSION_KEY: &#039;april-prank-shown-v2&#039;,&lt;br /&gt;
&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
    isClosing: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.ONLY_MAIN_PAGE &amp;amp;&amp;amp; window.mw &amp;amp;&amp;amp; mw.config &amp;amp;&amp;amp; !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (!this.shouldRun()) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Чтобы не показывалось повторно в одной вкладке&lt;br /&gt;
        if (sessionStorage.getItem(this.SHOWN_SESSION_KEY) === &#039;1&#039;) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        sessionStorage.setItem(this.SHOWN_SESSION_KEY, &#039;1&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.buildOverlay();&lt;br /&gt;
        this.bindEvents();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    shouldRun: function () {&lt;br /&gt;
        if (this.FORCE_PRANK_FOR_ALL) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        if (!params.has(&#039;prank&#039;)) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var value = (params.get(&#039;prank&#039;) || &#039;&#039;).trim().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
        // Работает для ?prank, ?prank=1, ?prank=true, ?prank=on, ?prank=yes&lt;br /&gt;
        if (value === &#039;&#039; || value === &#039;1&#039; || value === &#039;true&#039; || value === &#039;on&#039; || value === &#039;yes&#039;) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
	injectStyles: function () {&lt;br /&gt;
	    if (document.getElementById(&#039;april-prank-styles&#039;)) {&lt;br /&gt;
	        return;&lt;br /&gt;
	    }&lt;br /&gt;
	&lt;br /&gt;
	    var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
	    style.id = &#039;april-prank-styles&#039;;&lt;br /&gt;
	    style.textContent =&lt;br /&gt;
	        &#039;#april-prank-overlay {&#039; +&lt;br /&gt;
	            &#039;position: fixed;&#039; +&lt;br /&gt;
	            &#039;inset: 0;&#039; +&lt;br /&gt;
	            &#039;z-index: 2147483647;&#039; +&lt;br /&gt;
	            &#039;background: #000;&#039; +&lt;br /&gt;
	            &#039;overflow: auto;&#039; +&lt;br /&gt;
	            &#039;cursor: pointer;&#039; +&lt;br /&gt;
	            &#039;transform: translateY(0);&#039; +&lt;br /&gt;
	            &#039;will-change: transform;&#039; +&lt;br /&gt;
	        &#039;}&#039; +&lt;br /&gt;
	        &#039;#april-prank-overlay.closing {&#039; +&lt;br /&gt;
	            &#039;transition: transform 5000ms linear;&#039; +&lt;br /&gt;
	            &#039;transform: translateY(-100%);&#039; +&lt;br /&gt;
	        &#039;}&#039; +&lt;br /&gt;
	        &#039;#april-prank-overlay img {&#039; +&lt;br /&gt;
	            &#039;display: block;&#039; +&lt;br /&gt;
	            &#039;width: 100%;&#039; +&lt;br /&gt;
	            &#039;height: auto;&#039; +&lt;br /&gt;
	            &#039;min-height: 100vh;&#039; +&lt;br /&gt;
	            &#039;object-fit: cover;&#039; +&lt;br /&gt;
	            &#039;user-select: none;&#039; +&lt;br /&gt;
	            &#039;-webkit-user-drag: none;&#039; +&lt;br /&gt;
	            &#039;pointer-events: none;&#039; +&lt;br /&gt;
	        &#039;}&#039; +&lt;br /&gt;
	        &#039;#april-prank-overlay.mobile {&#039; +&lt;br /&gt;
	            &#039;display: flex;&#039; +&lt;br /&gt;
	            &#039;align-items: center;&#039; +&lt;br /&gt;
	            &#039;justify-content: center;&#039; +&lt;br /&gt;
	            &#039;padding: 0;&#039; +&lt;br /&gt;
	            &#039;overflow: hidden;&#039; +&lt;br /&gt;
	            &#039;background: #0b0b0b;&#039; +&lt;br /&gt;
	        &#039;}&#039; +&lt;br /&gt;
	        &#039;#april-prank-overlay.mobile img {&#039; +&lt;br /&gt;
	            &#039;width: 100%;&#039; +&lt;br /&gt;
	            &#039;height: 100svh;&#039; +&lt;br /&gt;
	            &#039;min-height: 0;&#039; +&lt;br /&gt;
	            &#039;object-fit: contain;&#039; +&lt;br /&gt;
	        &#039;}&#039;;&lt;br /&gt;
	    document.head.appendChild(style);&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
	buildOverlay: function () {&lt;br /&gt;
	    var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
	    overlay.id = &#039;april-prank-overlay&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
	&lt;br /&gt;
	    var isMobile =&lt;br /&gt;
	        window.matchMedia(&#039;(max-width: 768px)&#039;).matches ||&lt;br /&gt;
	        /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);&lt;br /&gt;
	&lt;br /&gt;
	    if (isMobile) {&lt;br /&gt;
	        overlay.classList.add(&#039;mobile&#039;);&lt;br /&gt;
	    }&lt;br /&gt;
	&lt;br /&gt;
	    img.src = isMobile&lt;br /&gt;
	        ? &#039;https://i.redd.it/yjmiajn4uq5a1.jpg&#039;&lt;br /&gt;
	        : &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    img.alt = &#039;Wikipedia homepage screenshot&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    overlay.appendChild(img);&lt;br /&gt;
	    document.body.appendChild(overlay);&lt;br /&gt;
	&lt;br /&gt;
	    this.overlay = overlay;&lt;br /&gt;
	    this.audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
	    this.audio.preload = &#039;auto&#039;;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
    bindEvents: function () {&lt;br /&gt;
        var self = this;&lt;br /&gt;
        if (!this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.startClose();&lt;br /&gt;
        }, { passive: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startClose: function () {&lt;br /&gt;
        if (this.isClosing || !this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.isClosing = true;&lt;br /&gt;
&lt;br /&gt;
        if (this.audio) {&lt;br /&gt;
            this.audio.currentTime = 0;&lt;br /&gt;
            this.audio.play().catch(function () {&lt;br /&gt;
                // Браузер может заблокировать autoplay — клик уже есть, обычно играет&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.classList.add(&#039;closing&#039;);&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            if (self.audio) {&lt;br /&gt;
                self.audio.pause();&lt;br /&gt;
                self.audio.currentTime = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }, this.ANIMATION_MS);&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function onEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, onEnd);&lt;br /&gt;
&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
         AprilPrankModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17809</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17809"/>
		<updated>2026-04-01T17:14:53Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilPrankModule = {&lt;br /&gt;
    FORCE_PRANK_FOR_ALL: true, &lt;br /&gt;
    ONLY_MAIN_PAGE: false,       &lt;br /&gt;
    ANIMATION_MS: 5000,&lt;br /&gt;
    SHOWN_SESSION_KEY: &#039;april-prank-shown-v2&#039;,&lt;br /&gt;
&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
    isClosing: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.ONLY_MAIN_PAGE &amp;amp;&amp;amp; window.mw &amp;amp;&amp;amp; mw.config &amp;amp;&amp;amp; !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (!this.shouldRun()) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Чтобы не показывалось повторно в одной вкладке&lt;br /&gt;
        if (sessionStorage.getItem(this.SHOWN_SESSION_KEY) === &#039;1&#039;) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        sessionStorage.setItem(this.SHOWN_SESSION_KEY, &#039;1&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.buildOverlay();&lt;br /&gt;
        this.bindEvents();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    shouldRun: function () {&lt;br /&gt;
        if (this.FORCE_PRANK_FOR_ALL) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        if (!params.has(&#039;prank&#039;)) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var value = (params.get(&#039;prank&#039;) || &#039;&#039;).trim().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
        // Работает для ?prank, ?prank=1, ?prank=true, ?prank=on, ?prank=yes&lt;br /&gt;
        if (value === &#039;&#039; || value === &#039;1&#039; || value === &#039;true&#039; || value === &#039;on&#039; || value === &#039;yes&#039;) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-prank-styles&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-prank-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-prank-overlay {&#039; +&lt;br /&gt;
                &#039;position: fixed;&#039; +&lt;br /&gt;
                &#039;inset: 0;&#039; +&lt;br /&gt;
                &#039;z-index: 2147483647;&#039; +&lt;br /&gt;
                &#039;background: #000;&#039; +&lt;br /&gt;
                &#039;overflow: auto;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transform: translateY(0);&#039; +&lt;br /&gt;
                &#039;will-change: transform;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay.closing {&#039; +&lt;br /&gt;
                &#039;transition: transform 5000ms linear;&#039; +&lt;br /&gt;
                &#039;transform: translateY(-100%);&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay img {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
                &#039;width: 100%;&#039; +&lt;br /&gt;
                &#039;height: auto;&#039; +&lt;br /&gt;
                &#039;min-height: 100vh;&#039; +&lt;br /&gt;
                &#039;object-fit: cover;&#039; +&lt;br /&gt;
                &#039;user-select: none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag: none;&#039; +&lt;br /&gt;
                &#039;pointer-events: none;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
	buildOverlay: function () {&lt;br /&gt;
	    var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
	    overlay.id = &#039;april-prank-overlay&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
	&lt;br /&gt;
	    var isMobile =&lt;br /&gt;
	        window.matchMedia(&#039;(max-width: 768px)&#039;).matches ||&lt;br /&gt;
	        /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);&lt;br /&gt;
	&lt;br /&gt;
	    img.src = isMobile&lt;br /&gt;
	        ? &#039;https://i.redd.it/yjmiajn4uq5a1.jpg&#039;&lt;br /&gt;
	        : &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    img.alt = &#039;Wikipedia homepage screenshot&#039;;&lt;br /&gt;
	&lt;br /&gt;
	    overlay.appendChild(img);&lt;br /&gt;
	    document.body.appendChild(overlay);&lt;br /&gt;
	&lt;br /&gt;
	    this.overlay = overlay;&lt;br /&gt;
	    this.audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
	    this.audio.preload = &#039;auto&#039;;&lt;br /&gt;
	},&lt;br /&gt;
&lt;br /&gt;
    bindEvents: function () {&lt;br /&gt;
        var self = this;&lt;br /&gt;
        if (!this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.startClose();&lt;br /&gt;
        }, { passive: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startClose: function () {&lt;br /&gt;
        if (this.isClosing || !this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.isClosing = true;&lt;br /&gt;
&lt;br /&gt;
        if (this.audio) {&lt;br /&gt;
            this.audio.currentTime = 0;&lt;br /&gt;
            this.audio.play().catch(function () {&lt;br /&gt;
                // Браузер может заблокировать autoplay — клик уже есть, обычно играет&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.classList.add(&#039;closing&#039;);&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            if (self.audio) {&lt;br /&gt;
                self.audio.pause();&lt;br /&gt;
                self.audio.currentTime = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }, this.ANIMATION_MS);&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function onEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, onEnd);&lt;br /&gt;
&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
         AprilPrankModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17808</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17808"/>
		<updated>2026-04-01T08:39:00Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilPrankModule = {&lt;br /&gt;
    FORCE_PRANK_FOR_ALL: true, &lt;br /&gt;
    ONLY_MAIN_PAGE: false,       &lt;br /&gt;
    ANIMATION_MS: 5000,&lt;br /&gt;
    SHOWN_SESSION_KEY: &#039;april-prank-shown-v2&#039;,&lt;br /&gt;
&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
    isClosing: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.ONLY_MAIN_PAGE &amp;amp;&amp;amp; window.mw &amp;amp;&amp;amp; mw.config &amp;amp;&amp;amp; !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (!this.shouldRun()) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Чтобы не показывалось повторно в одной вкладке&lt;br /&gt;
        if (sessionStorage.getItem(this.SHOWN_SESSION_KEY) === &#039;1&#039;) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        sessionStorage.setItem(this.SHOWN_SESSION_KEY, &#039;1&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.buildOverlay();&lt;br /&gt;
        this.bindEvents();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    shouldRun: function () {&lt;br /&gt;
        if (this.FORCE_PRANK_FOR_ALL) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        if (!params.has(&#039;prank&#039;)) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var value = (params.get(&#039;prank&#039;) || &#039;&#039;).trim().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
        // Работает для ?prank, ?prank=1, ?prank=true, ?prank=on, ?prank=yes&lt;br /&gt;
        if (value === &#039;&#039; || value === &#039;1&#039; || value === &#039;true&#039; || value === &#039;on&#039; || value === &#039;yes&#039;) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-prank-styles&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-prank-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-prank-overlay {&#039; +&lt;br /&gt;
                &#039;position: fixed;&#039; +&lt;br /&gt;
                &#039;inset: 0;&#039; +&lt;br /&gt;
                &#039;z-index: 2147483647;&#039; +&lt;br /&gt;
                &#039;background: #000;&#039; +&lt;br /&gt;
                &#039;overflow: auto;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transform: translateY(0);&#039; +&lt;br /&gt;
                &#039;will-change: transform;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay.closing {&#039; +&lt;br /&gt;
                &#039;transition: transform 5000ms linear;&#039; +&lt;br /&gt;
                &#039;transform: translateY(-100%);&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay img {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
                &#039;width: 100%;&#039; +&lt;br /&gt;
                &#039;height: auto;&#039; +&lt;br /&gt;
                &#039;min-height: 100vh;&#039; +&lt;br /&gt;
                &#039;object-fit: cover;&#039; +&lt;br /&gt;
                &#039;user-select: none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag: none;&#039; +&lt;br /&gt;
                &#039;pointer-events: none;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    buildOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-prank-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
        img.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
        img.alt = &#039;Wikipedia homepage screenshot&#039;;&lt;br /&gt;
&lt;br /&gt;
        overlay.appendChild(img);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
        this.audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
        this.audio.preload = &#039;auto&#039;;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    bindEvents: function () {&lt;br /&gt;
        var self = this;&lt;br /&gt;
        if (!this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.startClose();&lt;br /&gt;
        }, { passive: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startClose: function () {&lt;br /&gt;
        if (this.isClosing || !this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.isClosing = true;&lt;br /&gt;
&lt;br /&gt;
        if (this.audio) {&lt;br /&gt;
            this.audio.currentTime = 0;&lt;br /&gt;
            this.audio.play().catch(function () {&lt;br /&gt;
                // Браузер может заблокировать autoplay — клик уже есть, обычно играет&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.classList.add(&#039;closing&#039;);&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            if (self.audio) {&lt;br /&gt;
                self.audio.pause();&lt;br /&gt;
                self.audio.currentTime = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }, this.ANIMATION_MS);&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function onEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, onEnd);&lt;br /&gt;
&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
         AprilPrankModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17807</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17807"/>
		<updated>2026-03-31T23:09:16Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilPrankModule = {&lt;br /&gt;
    FORCE_PRANK_FOR_ALL: false, // &amp;lt;- поставь true, если нужно включить всем без ?prank&lt;br /&gt;
    ONLY_MAIN_PAGE: true,       // &amp;lt;- оставить true, чтобы работало только на главной&lt;br /&gt;
    ANIMATION_MS: 5000,&lt;br /&gt;
    SHOWN_SESSION_KEY: &#039;april-prank-shown-v2&#039;,&lt;br /&gt;
&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
    isClosing: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.ONLY_MAIN_PAGE &amp;amp;&amp;amp; window.mw &amp;amp;&amp;amp; mw.config &amp;amp;&amp;amp; !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (!this.shouldRun()) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Чтобы не показывалось повторно в одной вкладке&lt;br /&gt;
        if (sessionStorage.getItem(this.SHOWN_SESSION_KEY) === &#039;1&#039;) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        sessionStorage.setItem(this.SHOWN_SESSION_KEY, &#039;1&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.buildOverlay();&lt;br /&gt;
        this.bindEvents();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    shouldRun: function () {&lt;br /&gt;
        if (this.FORCE_PRANK_FOR_ALL) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        if (!params.has(&#039;prank&#039;)) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var value = (params.get(&#039;prank&#039;) || &#039;&#039;).trim().toLowerCase();&lt;br /&gt;
&lt;br /&gt;
        // Работает для ?prank, ?prank=1, ?prank=true, ?prank=on, ?prank=yes&lt;br /&gt;
        if (value === &#039;&#039; || value === &#039;1&#039; || value === &#039;true&#039; || value === &#039;on&#039; || value === &#039;yes&#039;) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-prank-styles&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-prank-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-prank-overlay {&#039; +&lt;br /&gt;
                &#039;position: fixed;&#039; +&lt;br /&gt;
                &#039;inset: 0;&#039; +&lt;br /&gt;
                &#039;z-index: 2147483647;&#039; +&lt;br /&gt;
                &#039;background: #000;&#039; +&lt;br /&gt;
                &#039;overflow: auto;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transform: translateY(0);&#039; +&lt;br /&gt;
                &#039;will-change: transform;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay.closing {&#039; +&lt;br /&gt;
                &#039;transition: transform 5000ms linear;&#039; +&lt;br /&gt;
                &#039;transform: translateY(-100%);&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay img {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
                &#039;width: 100%;&#039; +&lt;br /&gt;
                &#039;height: auto;&#039; +&lt;br /&gt;
                &#039;min-height: 100vh;&#039; +&lt;br /&gt;
                &#039;object-fit: cover;&#039; +&lt;br /&gt;
                &#039;user-select: none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag: none;&#039; +&lt;br /&gt;
                &#039;pointer-events: none;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    buildOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-prank-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
        img.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
        img.alt = &#039;Wikipedia homepage screenshot&#039;;&lt;br /&gt;
&lt;br /&gt;
        overlay.appendChild(img);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
        this.audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
        this.audio.preload = &#039;auto&#039;;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    bindEvents: function () {&lt;br /&gt;
        var self = this;&lt;br /&gt;
        if (!this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.startClose();&lt;br /&gt;
        }, { passive: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startClose: function () {&lt;br /&gt;
        if (this.isClosing || !this.overlay) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.isClosing = true;&lt;br /&gt;
&lt;br /&gt;
        if (this.audio) {&lt;br /&gt;
            this.audio.currentTime = 0;&lt;br /&gt;
            this.audio.play().catch(function () {&lt;br /&gt;
                // Браузер может заблокировать autoplay — клик уже есть, обычно играет&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.classList.add(&#039;closing&#039;);&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            if (self.audio) {&lt;br /&gt;
                self.audio.pause();&lt;br /&gt;
                self.audio.currentTime = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }, this.ANIMATION_MS);&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function onEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, onEnd);&lt;br /&gt;
&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
         AprilPrankModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17806</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17806"/>
		<updated>2026-03-31T23:05:52Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilPrankSlideModule = {&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
    stopAudioTimer: null,&lt;br /&gt;
    started: false,&lt;br /&gt;
    isAnimating: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.started) return;&lt;br /&gt;
        this.started = true;&lt;br /&gt;
&lt;br /&gt;
        if (!window.mw || !mw.config || !mw.config.get(&#039;wgIsMainPage&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        var isPrankMode = params.has(&#039;prank&#039;);&lt;br /&gt;
&lt;br /&gt;
        var now = new Date();&lt;br /&gt;
        var isAprilFirst = now.getMonth() === 3 &amp;amp;&amp;amp; now.getDate() === 1;&lt;br /&gt;
&lt;br /&gt;
        if (!isPrankMode &amp;amp;&amp;amp; !isAprilFirst) return;&lt;br /&gt;
&lt;br /&gt;
        if (!isPrankMode &amp;amp;&amp;amp; sessionStorage.getItem(&#039;april-prank-shown&#039;) === &#039;1&#039;) return;&lt;br /&gt;
        if (!isPrankMode) {&lt;br /&gt;
            sessionStorage.setItem(&#039;april-prank-shown&#039;, &#039;1&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.createOverlay();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-prank-slide-styles&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-prank-slide-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-prank-overlay{&#039; +&lt;br /&gt;
                &#039;position:fixed;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;z-index:2147483647;&#039; +&lt;br /&gt;
                &#039;background:#000;&#039; +&lt;br /&gt;
                &#039;overflow:hidden;&#039; +&lt;br /&gt;
                &#039;transform:translateY(0);&#039; +&lt;br /&gt;
                &#039;transition:transform 5000ms linear;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay.april-prank-hide{&#039; +&lt;br /&gt;
                &#039;transform:translateY(-100%);&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay .april-prank-scroll{&#039; +&lt;br /&gt;
                &#039;width:100%;&#039; +&lt;br /&gt;
                &#039;height:100%;&#039; +&lt;br /&gt;
                &#039;overflow:auto;&#039; +&lt;br /&gt;
                &#039;cursor:pointer;&#039; +&lt;br /&gt;
                &#039;-webkit-overflow-scrolling:touch;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay .april-prank-scroll img{&#039; +&lt;br /&gt;
                &#039;display:block;&#039; +&lt;br /&gt;
                &#039;width:100%;&#039; +&lt;br /&gt;
                &#039;height:auto;&#039; +&lt;br /&gt;
                &#039;max-width:none;&#039; +&lt;br /&gt;
                &#039;user-select:none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag:none;&#039; +&lt;br /&gt;
                &#039;pointer-events:none;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-prank-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var scroller = document.createElement(&#039;div&#039;);&lt;br /&gt;
        scroller.className = &#039;april-prank-scroll&#039;;&lt;br /&gt;
&lt;br /&gt;
        var image = document.createElement(&#039;img&#039;);&lt;br /&gt;
        image.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
        image.alt = &#039;Wikipedia homepage prank&#039;;&lt;br /&gt;
&lt;br /&gt;
        scroller.appendChild(image);&lt;br /&gt;
        overlay.appendChild(scroller);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        scroller.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.startSlideOut();&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startSlideOut: function () {&lt;br /&gt;
        if (!this.overlay || this.isAnimating) return;&lt;br /&gt;
        this.isAnimating = true;&lt;br /&gt;
&lt;br /&gt;
        this.playSoundStrict5s();&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.overlay.classList.add(&#039;april-prank-hide&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function handleTransitionEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) return;&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, handleTransitionEnd);&lt;br /&gt;
            self.stopSoundNow();&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    playSoundStrict5s: function () {&lt;br /&gt;
        this.stopSoundNow();&lt;br /&gt;
&lt;br /&gt;
        var audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
        audio.preload = &#039;auto&#039;;&lt;br /&gt;
        audio.loop = false;&lt;br /&gt;
        audio.volume = 1;&lt;br /&gt;
&lt;br /&gt;
        this.audio = audio;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        audio.play().catch(function () {&lt;br /&gt;
            // Браузер мог заблокировать автозвук; по клику обычно воспроизводится.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        this.stopAudioTimer = setTimeout(function () {&lt;br /&gt;
            self.stopSoundNow();&lt;br /&gt;
        }, 5000);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    stopSoundNow: function () {&lt;br /&gt;
        if (this.stopAudioTimer) {&lt;br /&gt;
            clearTimeout(this.stopAudioTimer);&lt;br /&gt;
            this.stopAudioTimer = null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (this.audio) {&lt;br /&gt;
            try {&lt;br /&gt;
                this.audio.pause();&lt;br /&gt;
                this.audio.currentTime = 0;&lt;br /&gt;
                this.audio.removeAttribute(&#039;src&#039;);&lt;br /&gt;
                this.audio.load();&lt;br /&gt;
            } catch (e) {}&lt;br /&gt;
            this.audio = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
         AprilPrankSlideModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17805</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17805"/>
		<updated>2026-03-31T23:05:12Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilPrankSlideModule = {&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
    stopAudioTimer: null,&lt;br /&gt;
    started: false,&lt;br /&gt;
    isAnimating: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.started) return;&lt;br /&gt;
        this.started = true;&lt;br /&gt;
&lt;br /&gt;
        if (!window.mw || !mw.config || !mw.config.get(&#039;wgIsMainPage&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        var isPrankMode = params.has(&#039;prank&#039;);&lt;br /&gt;
&lt;br /&gt;
        var now = new Date();&lt;br /&gt;
        var isAprilFirst = now.getMonth() === 3 &amp;amp;&amp;amp; now.getDate() === 1;&lt;br /&gt;
&lt;br /&gt;
        if (!isPrankMode &amp;amp;&amp;amp; !isAprilFirst) return;&lt;br /&gt;
&lt;br /&gt;
        if (!isPrankMode &amp;amp;&amp;amp; sessionStorage.getItem(&#039;april-prank-shown&#039;) === &#039;1&#039;) return;&lt;br /&gt;
        if (!isPrankMode) {&lt;br /&gt;
            sessionStorage.setItem(&#039;april-prank-shown&#039;, &#039;1&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.createOverlay();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-prank-slide-styles&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-prank-slide-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-prank-overlay{&#039; +&lt;br /&gt;
                &#039;position:fixed;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;z-index:2147483647;&#039; +&lt;br /&gt;
                &#039;background:#000;&#039; +&lt;br /&gt;
                &#039;overflow:hidden;&#039; +&lt;br /&gt;
                &#039;transform:translateY(0);&#039; +&lt;br /&gt;
                &#039;transition:transform 5000ms linear;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay.april-prank-hide{&#039; +&lt;br /&gt;
                &#039;transform:translateY(-100%);&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay .april-prank-scroll{&#039; +&lt;br /&gt;
                &#039;width:100%;&#039; +&lt;br /&gt;
                &#039;height:100%;&#039; +&lt;br /&gt;
                &#039;overflow:auto;&#039; +&lt;br /&gt;
                &#039;cursor:pointer;&#039; +&lt;br /&gt;
                &#039;-webkit-overflow-scrolling:touch;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-prank-overlay .april-prank-scroll img{&#039; +&lt;br /&gt;
                &#039;display:block;&#039; +&lt;br /&gt;
                &#039;width:100%;&#039; +&lt;br /&gt;
                &#039;height:auto;&#039; +&lt;br /&gt;
                &#039;max-width:none;&#039; +&lt;br /&gt;
                &#039;user-select:none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag:none;&#039; +&lt;br /&gt;
                &#039;pointer-events:none;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-prank-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var scroller = document.createElement(&#039;div&#039;);&lt;br /&gt;
        scroller.className = &#039;april-prank-scroll&#039;;&lt;br /&gt;
&lt;br /&gt;
        var image = document.createElement(&#039;img&#039;);&lt;br /&gt;
        image.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
        image.alt = &#039;Wikipedia homepage prank&#039;;&lt;br /&gt;
&lt;br /&gt;
        scroller.appendChild(image);&lt;br /&gt;
        overlay.appendChild(scroller);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        scroller.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.startSlideOut();&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startSlideOut: function () {&lt;br /&gt;
        if (!this.overlay || this.isAnimating) return;&lt;br /&gt;
        this.isAnimating = true;&lt;br /&gt;
&lt;br /&gt;
        this.playSoundStrict5s();&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.overlay.classList.add(&#039;april-prank-hide&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function handleTransitionEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) return;&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, handleTransitionEnd);&lt;br /&gt;
            self.stopSoundNow();&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    playSoundStrict5s: function () {&lt;br /&gt;
        this.stopSoundNow();&lt;br /&gt;
&lt;br /&gt;
        var audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
        audio.preload = &#039;auto&#039;;&lt;br /&gt;
        audio.loop = false;&lt;br /&gt;
        audio.volume = 1;&lt;br /&gt;
&lt;br /&gt;
        this.audio = audio;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        audio.play().catch(function () {&lt;br /&gt;
            // Браузер мог заблокировать автозвук; по клику обычно воспроизводится.&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        this.stopAudioTimer = setTimeout(function () {&lt;br /&gt;
            self.stopSoundNow();&lt;br /&gt;
        }, 5000);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    stopSoundNow: function () {&lt;br /&gt;
        if (this.stopAudioTimer) {&lt;br /&gt;
            clearTimeout(this.stopAudioTimer);&lt;br /&gt;
            this.stopAudioTimer = null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (this.audio) {&lt;br /&gt;
            try {&lt;br /&gt;
                this.audio.pause();&lt;br /&gt;
                this.audio.currentTime = 0;&lt;br /&gt;
                this.audio.removeAttribute(&#039;src&#039;);&lt;br /&gt;
                this.audio.load();&lt;br /&gt;
            } catch (e) {}&lt;br /&gt;
            this.audio = null;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
         AprilFoolsPrankModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17804</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17804"/>
		<updated>2026-03-31T23:03:48Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilFoolsPrankModule = {&lt;br /&gt;
    started: false,&lt;br /&gt;
    closing: false,&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    imageLayer: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.started) return;&lt;br /&gt;
        this.started = true;&lt;br /&gt;
&lt;br /&gt;
        if (!window.mw || !mw.config || !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        var prankByFlag = params.get(&#039;prank&#039;) === &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
        var enableForAll = false;&lt;br /&gt;
&lt;br /&gt;
        if (!prankByFlag &amp;amp;&amp;amp; !enableForAll) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.createOverlay();&lt;br /&gt;
        this.lockPageScroll();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-fools-prank-styles&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-fools-prank-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-fools-prank-overlay{&#039; +&lt;br /&gt;
                &#039;position:fixed;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;z-index:2147483647;&#039; +&lt;br /&gt;
                &#039;background:#000;&#039; +&lt;br /&gt;
                &#039;overflow-y:auto;&#039; +&lt;br /&gt;
                &#039;overflow-x:hidden;&#039; +&lt;br /&gt;
                &#039;cursor:pointer;&#039; +&lt;br /&gt;
                &#039;transform:translateY(0);&#039; +&lt;br /&gt;
                &#039;transition:transform 5s linear;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-prank-overlay.closing{&#039; +&lt;br /&gt;
                &#039;transform:translateY(-100%);&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-prank-image{&#039; +&lt;br /&gt;
                &#039;display:block;&#039; +&lt;br /&gt;
                &#039;width:100vw;&#039; +&lt;br /&gt;
                &#039;min-height:100vh;&#039; +&lt;br /&gt;
                &#039;height:auto;&#039; +&lt;br /&gt;
                &#039;object-fit:cover;&#039; +&lt;br /&gt;
                &#039;object-position:top center;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-fools-prank-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
        img.id = &#039;april-fools-prank-image&#039;;&lt;br /&gt;
        img.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
        img.alt = &#039;Wikipedia homepage&#039;;&lt;br /&gt;
&lt;br /&gt;
        overlay.appendChild(img);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
        this.imageLayer = img;&lt;br /&gt;
        this.audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
        this.audio.preload = &#039;auto&#039;;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        overlay.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.closeWithSound();&lt;br /&gt;
        }, { once: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    closeWithSound: function () {&lt;br /&gt;
        if (this.closing || !this.overlay) return;&lt;br /&gt;
        this.closing = true;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            this.audio.currentTime = 0;&lt;br /&gt;
            this.audio.play();&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.classList.add(&#039;closing&#039;);&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function handleEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) return;&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, handleEnd);&lt;br /&gt;
            self.unlockPageScroll();&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    lockPageScroll: function () {&lt;br /&gt;
        document.documentElement.style.overflow = &#039;hidden&#039;;&lt;br /&gt;
        document.body.style.overflow = &#039;hidden&#039;;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    unlockPageScroll: function () {&lt;br /&gt;
        document.documentElement.style.overflow = &#039;&#039;;&lt;br /&gt;
        document.body.style.overflow = &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
         AprilFoolsPrankModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17803</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17803"/>
		<updated>2026-03-31T23:03:20Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilFoolsPrankModule = {&lt;br /&gt;
    started: false,&lt;br /&gt;
    closing: false,&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    imageLayer: null,&lt;br /&gt;
    audio: null,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.started) return;&lt;br /&gt;
        this.started = true;&lt;br /&gt;
&lt;br /&gt;
        if (!window.mw || !mw.config || !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        var prankByFlag = params.get(&#039;prank&#039;) === &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
        var enableForAll = false;&lt;br /&gt;
&lt;br /&gt;
        if (!prankByFlag &amp;amp;&amp;amp; !enableForAll) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.createOverlay();&lt;br /&gt;
        this.lockPageScroll();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-fools-prank-styles&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-fools-prank-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-fools-prank-overlay{&#039; +&lt;br /&gt;
                &#039;position:fixed;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;z-index:2147483647;&#039; +&lt;br /&gt;
                &#039;background:#000;&#039; +&lt;br /&gt;
                &#039;overflow-y:auto;&#039; +&lt;br /&gt;
                &#039;overflow-x:hidden;&#039; +&lt;br /&gt;
                &#039;cursor:pointer;&#039; +&lt;br /&gt;
                &#039;transform:translateY(0);&#039; +&lt;br /&gt;
                &#039;transition:transform 5s linear;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-prank-overlay.closing{&#039; +&lt;br /&gt;
                &#039;transform:translateY(-100%);&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-prank-image{&#039; +&lt;br /&gt;
                &#039;display:block;&#039; +&lt;br /&gt;
                &#039;width:100vw;&#039; +&lt;br /&gt;
                &#039;min-height:100vh;&#039; +&lt;br /&gt;
                &#039;height:auto;&#039; +&lt;br /&gt;
                &#039;object-fit:cover;&#039; +&lt;br /&gt;
                &#039;object-position:top center;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-fools-prank-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
        img.id = &#039;april-fools-prank-image&#039;;&lt;br /&gt;
        img.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
        img.alt = &#039;Wikipedia homepage&#039;;&lt;br /&gt;
&lt;br /&gt;
        overlay.appendChild(img);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
        this.imageLayer = img;&lt;br /&gt;
        this.audio = new Audio(&#039;https://zvukogram.com/mp3/40/stone-plate.mp3&#039;);&lt;br /&gt;
        this.audio.preload = &#039;auto&#039;;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        overlay.addEventListener(&#039;click&#039;, function () {&lt;br /&gt;
            self.closeWithSound();&lt;br /&gt;
        }, { once: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    closeWithSound: function () {&lt;br /&gt;
        if (this.closing || !this.overlay) return;&lt;br /&gt;
        this.closing = true;&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
            this.audio.currentTime = 0;&lt;br /&gt;
            this.audio.play();&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.classList.add(&#039;closing&#039;);&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.overlay.addEventListener(&#039;transitionend&#039;, function handleEnd(e) {&lt;br /&gt;
            if (e.propertyName !== &#039;transform&#039;) return;&lt;br /&gt;
            self.overlay.removeEventListener(&#039;transitionend&#039;, handleEnd);&lt;br /&gt;
            self.unlockPageScroll();&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    lockPageScroll: function () {&lt;br /&gt;
        document.documentElement.style.overflow = &#039;hidden&#039;;&lt;br /&gt;
        document.body.style.overflow = &#039;hidden&#039;;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    unlockPageScroll: function () {&lt;br /&gt;
        document.documentElement.style.overflow = &#039;&#039;;&lt;br /&gt;
        document.body.style.overflow = &#039;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
        AprilFoolsCubeTransitionModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17802</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17802"/>
		<updated>2026-03-31T22:57:50Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilFoolsCubeTransitionModule = {&lt;br /&gt;
    config: {&lt;br /&gt;
        // Пока только по флагу:&lt;br /&gt;
        enableForAll: false,        // &amp;lt;-- чтобы включить всем, просто поставь true&lt;br /&gt;
        enableOnAprilFirst: false,  // &amp;lt;-- если потом захочешь автозапуск 1 апреля&lt;br /&gt;
        onlyMainPage: true,         // запуск только на главной&lt;br /&gt;
        runOncePerSession: true,    // работает только для обычного режима (НЕ для ?prank=1)&lt;br /&gt;
&lt;br /&gt;
        overlayDurationMs: 4200,    // сколько показывать картинку до куб-перехода&lt;br /&gt;
        cubeDurationMs: 1200,&lt;br /&gt;
&lt;br /&gt;
        wikiImageUrl: &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;,&lt;br /&gt;
        clockAudioUrl: &#039;https://zvukogram.com/mp3/34/the-ticking-of-a-quartz-clock.mp3&#039;,&lt;br /&gt;
        lampAudioUrl: &#039;https://zvukitop.com/wp-content/uploads/2021/04/luminesc-lampa-r4fh.mp3&#039;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    started: false,&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    clockAudio: null,&lt;br /&gt;
    lampAudio: null,&lt;br /&gt;
    needsGestureUnlock: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.started) return;&lt;br /&gt;
        this.started = true;&lt;br /&gt;
&lt;br /&gt;
        if (this.config.onlyMainPage) {&lt;br /&gt;
            if (!window.mw || !mw.config || !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var url = new URL(window.location.href);&lt;br /&gt;
        var prankFlag = url.searchParams.get(&#039;prank&#039;) === &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
        var now = new Date();&lt;br /&gt;
        var isAprilFirst = now.getMonth() === 3 &amp;amp;&amp;amp; now.getDate() === 1;&lt;br /&gt;
&lt;br /&gt;
        var shouldRun =&lt;br /&gt;
            prankFlag ||&lt;br /&gt;
            this.config.enableForAll ||&lt;br /&gt;
            (this.config.enableOnAprilFirst &amp;amp;&amp;amp; isAprilFirst);&lt;br /&gt;
&lt;br /&gt;
        if (!shouldRun) return;&lt;br /&gt;
&lt;br /&gt;
        // Важно: для ?prank=1 НЕ ограничиваем одним показом&lt;br /&gt;
        if (!prankFlag &amp;amp;&amp;amp; this.config.runOncePerSession) {&lt;br /&gt;
            if (sessionStorage.getItem(&#039;april-fools-cube-shown&#039;) === &#039;1&#039;) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            sessionStorage.setItem(&#039;april-fools-cube-shown&#039;, &#039;1&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.createOverlay();&lt;br /&gt;
        this.prepareAudio();&lt;br /&gt;
        this.startSequence();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-fools-cube-v2-styles&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-fools-cube-v2-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-fools-cube-overlay {&#039; +&lt;br /&gt;
                &#039;position: fixed;&#039; +&lt;br /&gt;
                &#039;inset: 0;&#039; +&lt;br /&gt;
                &#039;z-index: 2147483647;&#039; +&lt;br /&gt;
                &#039;pointer-events: auto;&#039; +&lt;br /&gt;
                &#039;background: #000;&#039; +&lt;br /&gt;
                &#039;overflow: hidden;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-cube-overlay .af-scene {&#039; +&lt;br /&gt;
                &#039;position: absolute;&#039; +&lt;br /&gt;
                &#039;inset: 0;&#039; +&lt;br /&gt;
                &#039;perspective: 1800px;&#039; +&lt;br /&gt;
                &#039;perspective-origin: 50% 50%;&#039; +&lt;br /&gt;
                &#039;overflow: hidden;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-cube-overlay .af-cube {&#039; +&lt;br /&gt;
                &#039;position: absolute;&#039; +&lt;br /&gt;
                &#039;inset: 0;&#039; +&lt;br /&gt;
                &#039;transform-style: preserve-3d;&#039; +&lt;br /&gt;
                &#039;transform-origin: right center;&#039; +&lt;br /&gt;
                &#039;will-change: transform, opacity;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-cube-overlay.af-exit .af-cube {&#039; +&lt;br /&gt;
                &#039;animation: af-cube-rotate 1200ms cubic-bezier(0.2, 0.8, 0.2, 1) forwards;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-cube-overlay .af-face {&#039; +&lt;br /&gt;
                &#039;position: absolute;&#039; +&lt;br /&gt;
                &#039;inset: 0;&#039; +&lt;br /&gt;
                &#039;backface-visibility: hidden;&#039; +&lt;br /&gt;
                &#039;-webkit-backface-visibility: hidden;&#039; +&lt;br /&gt;
                &#039;overflow: hidden;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-cube-overlay .af-front {&#039; +&lt;br /&gt;
                &#039;transform: translateZ(1px);&#039; +&lt;br /&gt;
                &#039;background: #000;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-cube-overlay .af-front img {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
                &#039;width: 100%;&#039; +&lt;br /&gt;
                &#039;height: 100%;&#039; +&lt;br /&gt;
                &#039;object-fit: cover;&#039; +&lt;br /&gt;
                &#039;object-position: center top;&#039; +&lt;br /&gt;
                &#039;user-select: none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag: none;&#039; +&lt;br /&gt;
                &#039;pointer-events: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-cube-overlay .af-right {&#039; +&lt;br /&gt;
                &#039;transform-origin: left center;&#039; +&lt;br /&gt;
                &#039;transform: rotateY(90deg) translateX(0);&#039; +&lt;br /&gt;
                // прозрачная грань: видна реальная страница как &amp;quot;другая сторона куба&amp;quot;&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;box-shadow: inset 0 0 120px rgba(0, 0, 0, 0.35);&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-cube-overlay .af-edge {&#039; +&lt;br /&gt;
                &#039;position: absolute;&#039; +&lt;br /&gt;
                &#039;top: 0;&#039; +&lt;br /&gt;
                &#039;right: 0;&#039; +&lt;br /&gt;
                &#039;width: 36px;&#039; +&lt;br /&gt;
                &#039;height: 100%;&#039; +&lt;br /&gt;
                &#039;background: linear-gradient(to left, rgba(0,0,0,0.45), rgba(0,0,0,0));&#039; +&lt;br /&gt;
                &#039;pointer-events: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;@keyframes af-cube-rotate {&#039; +&lt;br /&gt;
                &#039;0% {&#039; +&lt;br /&gt;
                    &#039;transform: translateZ(0) rotateY(0deg);&#039; +&lt;br /&gt;
                    &#039;opacity: 1;&#039; +&lt;br /&gt;
                &#039;}&#039; +&lt;br /&gt;
                &#039;100% {&#039; +&lt;br /&gt;
                    &#039;transform: translateZ(0) rotateY(-90deg);&#039; +&lt;br /&gt;
                    &#039;opacity: 0.02;&#039; +&lt;br /&gt;
                &#039;}&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-fools-cube-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var scene = document.createElement(&#039;div&#039;);&lt;br /&gt;
        scene.className = &#039;af-scene&#039;;&lt;br /&gt;
&lt;br /&gt;
        var cube = document.createElement(&#039;div&#039;);&lt;br /&gt;
        cube.className = &#039;af-cube&#039;;&lt;br /&gt;
&lt;br /&gt;
        var front = document.createElement(&#039;div&#039;);&lt;br /&gt;
        front.className = &#039;af-face af-front&#039;;&lt;br /&gt;
&lt;br /&gt;
        var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
        img.src = this.config.wikiImageUrl;&lt;br /&gt;
        img.alt = &#039;Wikipedia homepage screenshot&#039;;&lt;br /&gt;
&lt;br /&gt;
        var right = document.createElement(&#039;div&#039;);&lt;br /&gt;
        right.className = &#039;af-face af-right&#039;;&lt;br /&gt;
&lt;br /&gt;
        var edge = document.createElement(&#039;div&#039;);&lt;br /&gt;
        edge.className = &#039;af-edge&#039;;&lt;br /&gt;
&lt;br /&gt;
        front.appendChild(img);&lt;br /&gt;
        cube.appendChild(front);&lt;br /&gt;
        cube.appendChild(right);&lt;br /&gt;
        cube.appendChild(edge);&lt;br /&gt;
        scene.appendChild(cube);&lt;br /&gt;
        overlay.appendChild(scene);&lt;br /&gt;
&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    prepareAudio: function () {&lt;br /&gt;
        this.clockAudio = new Audio(this.config.clockAudioUrl);&lt;br /&gt;
        this.lampAudio = new Audio(this.config.lampAudioUrl);&lt;br /&gt;
&lt;br /&gt;
        this.clockAudio.preload = &#039;auto&#039;;&lt;br /&gt;
        this.lampAudio.preload = &#039;auto&#039;;&lt;br /&gt;
&lt;br /&gt;
        this.clockAudio.loop = true;&lt;br /&gt;
        this.clockAudio.volume = 0.45;&lt;br /&gt;
        this.lampAudio.loop = false;&lt;br /&gt;
        this.lampAudio.volume = 0.6;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startSequence: function () {&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        // Пробуем запустить сразу оба звука одновременно&lt;br /&gt;
        this.playBothSoundsNow();&lt;br /&gt;
&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            self.startCubeTransition();&lt;br /&gt;
        }, this.config.overlayDurationMs);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    playBothSoundsNow: function () {&lt;br /&gt;
        var self = this;&lt;br /&gt;
        var playClock = this.clockAudio ? this.clockAudio.play() : Promise.resolve();&lt;br /&gt;
        var playLamp = this.lampAudio ? this.lampAudio.play() : Promise.resolve();&lt;br /&gt;
&lt;br /&gt;
        Promise.allSettled([playClock, playLamp]).then(function (results) {&lt;br /&gt;
            var hasRejected = results.some(function (r) { return r.status === &#039;rejected&#039;; });&lt;br /&gt;
            if (hasRejected) {&lt;br /&gt;
                self.enableGestureUnlock();&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    enableGestureUnlock: function () {&lt;br /&gt;
        if (this.needsGestureUnlock) return;&lt;br /&gt;
        this.needsGestureUnlock = true;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        function unlockAndPlay() {&lt;br /&gt;
            self.needsGestureUnlock = false;&lt;br /&gt;
&lt;br /&gt;
            if (self.clockAudio) {&lt;br /&gt;
                self.clockAudio.currentTime = 0;&lt;br /&gt;
                self.clockAudio.play().catch(function () {});&lt;br /&gt;
            }&lt;br /&gt;
            if (self.lampAudio) {&lt;br /&gt;
                self.lampAudio.currentTime = 0;&lt;br /&gt;
                self.lampAudio.play().catch(function () {});&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            document.removeEventListener(&#039;pointerdown&#039;, unlockAndPlay);&lt;br /&gt;
            document.removeEventListener(&#039;keydown&#039;, unlockAndPlay);&lt;br /&gt;
            document.removeEventListener(&#039;touchstart&#039;, unlockAndPlay);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener(&#039;pointerdown&#039;, unlockAndPlay, { once: true });&lt;br /&gt;
        document.addEventListener(&#039;keydown&#039;, unlockAndPlay, { once: true });&lt;br /&gt;
        document.addEventListener(&#039;touchstart&#039;, unlockAndPlay, { once: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startCubeTransition: function () {&lt;br /&gt;
        if (!this.overlay) return;&lt;br /&gt;
&lt;br /&gt;
        // В момент вращения ещё раз запускаем &amp;quot;лампу&amp;quot;, часы продолжают тикать&lt;br /&gt;
        if (this.lampAudio) {&lt;br /&gt;
            try {&lt;br /&gt;
                this.lampAudio.currentTime = 0;&lt;br /&gt;
                this.lampAudio.play().catch(function () {});&lt;br /&gt;
            } catch (e) {}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.overlay.classList.add(&#039;af-exit&#039;);&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            self.finish();&lt;br /&gt;
        }, this.config.cubeDurationMs + 80);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    finish: function () {&lt;br /&gt;
        if (this.clockAudio) {&lt;br /&gt;
            this.clockAudio.pause();&lt;br /&gt;
            this.clockAudio.currentTime = 0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (this.overlay &amp;amp;&amp;amp; this.overlay.parentNode) {&lt;br /&gt;
            this.overlay.parentNode.removeChild(this.overlay);&lt;br /&gt;
        }&lt;br /&gt;
        this.overlay = null;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
        AprilFoolsCubeTransitionModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17801</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17801"/>
		<updated>2026-03-31T22:55:04Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilFoolsCubeTransitionModule = {&lt;br /&gt;
    FORCE_FOR_ALL: false,&lt;br /&gt;
    ENABLE_APRIL_FIRST: false,&lt;br /&gt;
    DURATION_BEFORE_TRANSITION: 6500,&lt;br /&gt;
&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    cube: null,&lt;br /&gt;
    frontImage: null,&lt;br /&gt;
    rightFrame: null,&lt;br /&gt;
    clockAudio: null,&lt;br /&gt;
    lampAudio: null,&lt;br /&gt;
    started: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.started) return;&lt;br /&gt;
        this.started = true;&lt;br /&gt;
&lt;br /&gt;
        if (!window.mw || !mw.config || !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var url = new URL(window.location.href);&lt;br /&gt;
        var isPreview = url.searchParams.get(&#039;prank_preview&#039;) === &#039;1&#039;;&lt;br /&gt;
        if (isPreview) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var isPrankFlag = url.searchParams.get(&#039;prank&#039;) === &#039;1&#039;;&lt;br /&gt;
        var now = new Date();&lt;br /&gt;
        var isAprilFirst = now.getMonth() === 3 &amp;amp;&amp;amp; now.getDate() === 1;&lt;br /&gt;
&lt;br /&gt;
        var shouldRun = isPrankFlag || this.FORCE_FOR_ALL || (this.ENABLE_APRIL_FIRST &amp;amp;&amp;amp; isAprilFirst);&lt;br /&gt;
        if (!shouldRun) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.createDom();&lt;br /&gt;
        this.createAudio();&lt;br /&gt;
        this.show();&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.tryPlayClockNow();&lt;br /&gt;
        this.bindAudioUnlock();&lt;br /&gt;
&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            self.startCubeTransition();&lt;br /&gt;
        }, this.DURATION_BEFORE_TRANSITION);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-cube-prank-styles&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-cube-prank-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-cube-prank-overlay{&#039; +&lt;br /&gt;
                &#039;position:fixed;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;z-index:2147483647;&#039; +&lt;br /&gt;
                &#039;background:#000;&#039; +&lt;br /&gt;
                &#039;opacity:0;&#039; +&lt;br /&gt;
                &#039;visibility:hidden;&#039; +&lt;br /&gt;
                &#039;overflow:hidden;&#039; +&lt;br /&gt;
                &#039;transition:opacity .2s linear;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-cube-prank-overlay.active{&#039; +&lt;br /&gt;
                &#039;opacity:1;&#039; +&lt;br /&gt;
                &#039;visibility:visible;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-cube-prank-scene{&#039; +&lt;br /&gt;
                &#039;position:absolute;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;perspective:1800px;&#039; +&lt;br /&gt;
                &#039;perspective-origin:50% 50%;&#039; +&lt;br /&gt;
                &#039;--cube-depth:50vw;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-cube-prank-cube{&#039; +&lt;br /&gt;
                &#039;position:absolute;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;transform-style:preserve-3d;&#039; +&lt;br /&gt;
                &#039;transform:translateZ(calc(-1 * var(--cube-depth))) rotateY(0deg);&#039; +&lt;br /&gt;
                &#039;will-change:transform,opacity;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-cube-prank-cube.exiting{&#039; +&lt;br /&gt;
                &#039;animation:aprilCubeRotateOut 1100ms cubic-bezier(.2,.8,.2,1) forwards;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;@keyframes aprilCubeRotateOut{&#039; +&lt;br /&gt;
                &#039;0%{&#039; +&lt;br /&gt;
                    &#039;transform:translateZ(calc(-1 * var(--cube-depth))) rotateY(0deg);&#039; +&lt;br /&gt;
                    &#039;opacity:1;&#039; +&lt;br /&gt;
                &#039;}&#039; +&lt;br /&gt;
                &#039;100%{&#039; +&lt;br /&gt;
                    &#039;transform:translateZ(calc(-1 * var(--cube-depth))) rotateY(-90deg);&#039; +&lt;br /&gt;
                    &#039;opacity:1;&#039; +&lt;br /&gt;
                &#039;}&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.april-cube-face{&#039; +&lt;br /&gt;
                &#039;position:absolute;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;backface-visibility:hidden;&#039; +&lt;br /&gt;
                &#039;overflow:hidden;&#039; +&lt;br /&gt;
                &#039;background:#000;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.april-cube-face.front{&#039; +&lt;br /&gt;
                &#039;transform:translateZ(var(--cube-depth));&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.april-cube-face.right{&#039; +&lt;br /&gt;
                &#039;transform:rotateY(90deg) translateZ(var(--cube-depth));&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.april-cube-face.front img{&#039; +&lt;br /&gt;
                &#039;width:100%;&#039; +&lt;br /&gt;
                &#039;height:100%;&#039; +&lt;br /&gt;
                &#039;object-fit:cover;&#039; +&lt;br /&gt;
                &#039;object-position:center center;&#039; +&lt;br /&gt;
                &#039;display:block;&#039; +&lt;br /&gt;
                &#039;user-select:none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag:none;&#039; +&lt;br /&gt;
                &#039;pointer-events:none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.april-cube-face.right iframe{&#039; +&lt;br /&gt;
                &#039;width:100%;&#039; +&lt;br /&gt;
                &#039;height:100%;&#039; +&lt;br /&gt;
                &#039;border:0;&#039; +&lt;br /&gt;
                &#039;display:block;&#039; +&lt;br /&gt;
                &#039;background:#111;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createDom: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-cube-prank-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var scene = document.createElement(&#039;div&#039;);&lt;br /&gt;
        scene.id = &#039;april-cube-prank-scene&#039;;&lt;br /&gt;
&lt;br /&gt;
        var cube = document.createElement(&#039;div&#039;);&lt;br /&gt;
        cube.id = &#039;april-cube-prank-cube&#039;;&lt;br /&gt;
&lt;br /&gt;
        var front = document.createElement(&#039;div&#039;);&lt;br /&gt;
        front.className = &#039;april-cube-face front&#039;;&lt;br /&gt;
&lt;br /&gt;
        var img = document.createElement(&#039;img&#039;);&lt;br /&gt;
        img.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
        img.alt = &#039;Wikipedia home&#039;;&lt;br /&gt;
&lt;br /&gt;
        front.appendChild(img);&lt;br /&gt;
&lt;br /&gt;
        var right = document.createElement(&#039;div&#039;);&lt;br /&gt;
        right.className = &#039;april-cube-face right&#039;;&lt;br /&gt;
&lt;br /&gt;
        var iframe = document.createElement(&#039;iframe&#039;);&lt;br /&gt;
        iframe.setAttribute(&#039;loading&#039;, &#039;eager&#039;);&lt;br /&gt;
        iframe.setAttribute(&#039;referrerpolicy&#039;, &#039;no-referrer-when-downgrade&#039;);&lt;br /&gt;
        iframe.src = this.buildPreviewUrl();&lt;br /&gt;
&lt;br /&gt;
        right.appendChild(iframe);&lt;br /&gt;
&lt;br /&gt;
        cube.appendChild(front);&lt;br /&gt;
        cube.appendChild(right);&lt;br /&gt;
        scene.appendChild(cube);&lt;br /&gt;
        overlay.appendChild(scene);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
        this.cube = cube;&lt;br /&gt;
        this.frontImage = img;&lt;br /&gt;
        this.rightFrame = iframe;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    buildPreviewUrl: function () {&lt;br /&gt;
        var url = new URL(window.location.href);&lt;br /&gt;
        url.searchParams.delete(&#039;prank&#039;);&lt;br /&gt;
        url.searchParams.set(&#039;prank_preview&#039;, &#039;1&#039;);&lt;br /&gt;
        return url.toString();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createAudio: function () {&lt;br /&gt;
        this.clockAudio = new Audio(&#039;https://zvukogram.com/mp3/34/the-ticking-of-a-quartz-clock.mp3&#039;);&lt;br /&gt;
        this.clockAudio.loop = true;&lt;br /&gt;
        this.clockAudio.preload = &#039;auto&#039;;&lt;br /&gt;
        this.clockAudio.volume = 0.45;&lt;br /&gt;
&lt;br /&gt;
        this.lampAudio = new Audio(&#039;https://zvukitop.com/wp-content/uploads/2021/04/luminesc-lampa-r4fh.mp3&#039;);&lt;br /&gt;
        this.lampAudio.loop = false;&lt;br /&gt;
        this.lampAudio.preload = &#039;auto&#039;;&lt;br /&gt;
        this.lampAudio.volume = 0.9;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    show: function () {&lt;br /&gt;
        if (!this.overlay) return;&lt;br /&gt;
        this.overlay.classList.add(&#039;active&#039;);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    tryPlayClockNow: function () {&lt;br /&gt;
        if (!this.clockAudio) return;&lt;br /&gt;
        this.clockAudio.currentTime = 0;&lt;br /&gt;
&lt;br /&gt;
        var playPromise = this.clockAudio.play();&lt;br /&gt;
        if (playPromise &amp;amp;&amp;amp; typeof playPromise.catch === &#039;function&#039;) {&lt;br /&gt;
            playPromise.catch(function () {});&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    bindAudioUnlock: function () {&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        function unlockAndPlay() {&lt;br /&gt;
            if (self.clockAudio) {&lt;br /&gt;
                self.clockAudio.play().catch(function () {});&lt;br /&gt;
            }&lt;br /&gt;
            document.removeEventListener(&#039;pointerdown&#039;, unlockAndPlay);&lt;br /&gt;
            document.removeEventListener(&#039;keydown&#039;, unlockAndPlay);&lt;br /&gt;
            document.removeEventListener(&#039;touchstart&#039;, unlockAndPlay);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener(&#039;pointerdown&#039;, unlockAndPlay, { once: true });&lt;br /&gt;
        document.addEventListener(&#039;keydown&#039;, unlockAndPlay, { once: true });&lt;br /&gt;
        document.addEventListener(&#039;touchstart&#039;, unlockAndPlay, { once: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startCubeTransition: function () {&lt;br /&gt;
        if (!this.cube || !this.overlay) return;&lt;br /&gt;
&lt;br /&gt;
        if (this.clockAudio) {&lt;br /&gt;
            this.clockAudio.pause();&lt;br /&gt;
            this.clockAudio.currentTime = 0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (this.lampAudio) {&lt;br /&gt;
            this.lampAudio.currentTime = 0;&lt;br /&gt;
            this.lampAudio.play().catch(function () {});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.cube.classList.add(&#039;exiting&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.cube.addEventListener(&#039;animationend&#039;, function handleEnd() {&lt;br /&gt;
            self.cube.removeEventListener(&#039;animationend&#039;, handleEnd);&lt;br /&gt;
&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (self.lampAudio) {&lt;br /&gt;
                self.lampAudio.pause();&lt;br /&gt;
                self.lampAudio.currentTime = 0;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
            self.cube = null;&lt;br /&gt;
            self.frontImage = null;&lt;br /&gt;
            self.rightFrame = null;&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
        AprilFoolsCubeTransitionModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17800</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17800"/>
		<updated>2026-03-31T22:44:19Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
var AprilFoolsCubeTransitionModule = {&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    clockTimer: null,&lt;br /&gt;
    audioContext: null,&lt;br /&gt;
    started: false,&lt;br /&gt;
&lt;br /&gt;
    // Сейчас false: пранк только по ?prank=1&lt;br /&gt;
    // Когда захочешь включить всем 1 апреля — просто поставь true&lt;br /&gt;
    ENABLE_FOR_ALL_ON_APRIL_FIRST: false,&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.started) return;&lt;br /&gt;
        this.started = true;&lt;br /&gt;
&lt;br /&gt;
        if (!window.mw || !mw.config || !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        var prankMode = params.get(&#039;prank&#039;) === &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
        var now = new Date();&lt;br /&gt;
        var isAprilFirst = now.getMonth() === 3 &amp;amp;&amp;amp; now.getDate() === 1;&lt;br /&gt;
&lt;br /&gt;
        var allowForAll = this.ENABLE_FOR_ALL_ON_APRIL_FIRST &amp;amp;&amp;amp; isAprilFirst;&lt;br /&gt;
        var shouldRun = prankMode || allowForAll;&lt;br /&gt;
        if (!shouldRun) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Ограничение &amp;quot;один раз за сессию&amp;quot; — только для массового режима&lt;br /&gt;
        if (!prankMode) {&lt;br /&gt;
            if (sessionStorage.getItem(&#039;april-fools-cube-shown&#039;) === &#039;1&#039;) {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            sessionStorage.setItem(&#039;april-fools-cube-shown&#039;, &#039;1&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.createOverlay();&lt;br /&gt;
        this.initAudio();&lt;br /&gt;
        this.startClockTick(); // стартуем сразу&lt;br /&gt;
        this.showOverlay();&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            self.startExitTransition();&lt;br /&gt;
        }, 6000);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-fools-cube-styles&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-fools-cube-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-fools-overlay{&#039; +&lt;br /&gt;
                &#039;position:fixed;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;z-index:2147483647;&#039; +&lt;br /&gt;
                &#039;background:#000;&#039; +&lt;br /&gt;
                &#039;display:flex;&#039; +&lt;br /&gt;
                &#039;align-items:center;&#039; +&lt;br /&gt;
                &#039;justify-content:center;&#039; +&lt;br /&gt;
                &#039;opacity:0;&#039; +&lt;br /&gt;
                &#039;visibility:hidden;&#039; +&lt;br /&gt;
                &#039;overflow:hidden;&#039; +&lt;br /&gt;
                &#039;transform:translateZ(0);&#039; +&lt;br /&gt;
                &#039;will-change:transform,opacity;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-overlay.active{&#039; +&lt;br /&gt;
                &#039;opacity:1;&#039; +&lt;br /&gt;
                &#039;visibility:visible;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-overlay img{&#039; +&lt;br /&gt;
                &#039;width:100vw;&#039; +&lt;br /&gt;
                &#039;height:100vh;&#039; +&lt;br /&gt;
                &#039;object-fit:cover;&#039; +          // ширина/высота заполняются, лишнее режется&lt;br /&gt;
                &#039;object-position:center top;&#039; + // чуть приятнее для такого скрина&lt;br /&gt;
                &#039;display:block;&#039; +&lt;br /&gt;
                &#039;user-select:none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag:none;&#039; +&lt;br /&gt;
                &#039;pointer-events:none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-overlay.exiting{&#039; +&lt;br /&gt;
                &#039;transform-origin:left center;&#039; +&lt;br /&gt;
                &#039;animation:aprilCubeOut 900ms cubic-bezier(0.2,0.8,0.2,1) forwards;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;@keyframes aprilCubeOut{&#039; +&lt;br /&gt;
                &#039;0%{&#039; +&lt;br /&gt;
                    &#039;transform:perspective(1400px) rotateY(0deg) translateX(0);&#039; +&lt;br /&gt;
                    &#039;opacity:1;&#039; +&lt;br /&gt;
                &#039;}&#039; +&lt;br /&gt;
                &#039;100%{&#039; +&lt;br /&gt;
                    &#039;transform:perspective(1400px) rotateY(-88deg) translateX(-34vw);&#039; +&lt;br /&gt;
                    &#039;opacity:0;&#039; +&lt;br /&gt;
                &#039;}&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-fools-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var image = document.createElement(&#039;img&#039;);&lt;br /&gt;
        image.alt = &#039;Wikipedia homepage&#039;;&lt;br /&gt;
        image.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
&lt;br /&gt;
        overlay.appendChild(image);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    showOverlay: function () {&lt;br /&gt;
        if (!this.overlay) return;&lt;br /&gt;
        this.overlay.classList.add(&#039;active&#039;);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startExitTransition: function () {&lt;br /&gt;
        if (!this.overlay) return;&lt;br /&gt;
&lt;br /&gt;
        this.stopClockTick();&lt;br /&gt;
        this.playCubeShiftSound();&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.overlay.classList.add(&#039;exiting&#039;);&lt;br /&gt;
        this.overlay.addEventListener(&#039;animationend&#039;, function handleEnd() {&lt;br /&gt;
            self.overlay.removeEventListener(&#039;animationend&#039;, handleEnd);&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initAudio: function () {&lt;br /&gt;
        try {&lt;br /&gt;
            var Ctx = window.AudioContext || window.webkitAudioContext;&lt;br /&gt;
            if (!Ctx) return;&lt;br /&gt;
            this.audioContext = new Ctx();&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            this.audioContext = null;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        // Best-effort сразу&lt;br /&gt;
        if (this.audioContext.state === &#039;suspended&#039;) {&lt;br /&gt;
            this.audioContext.resume().catch(function () {});&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Гарантия: как только пользователь взаимодействует — точно резюмим&lt;br /&gt;
        function unlock() {&lt;br /&gt;
            if (!self.audioContext) return;&lt;br /&gt;
            self.audioContext.resume().catch(function () {});&lt;br /&gt;
            document.removeEventListener(&#039;pointerdown&#039;, unlock);&lt;br /&gt;
            document.removeEventListener(&#039;keydown&#039;, unlock);&lt;br /&gt;
            document.removeEventListener(&#039;touchstart&#039;, unlock);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener(&#039;pointerdown&#039;, unlock, { once: true });&lt;br /&gt;
        document.addEventListener(&#039;keydown&#039;, unlock, { once: true });&lt;br /&gt;
        document.addEventListener(&#039;touchstart&#039;, unlock, { once: true });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startClockTick: function () {&lt;br /&gt;
        if (!this.audioContext || this.clockTimer) return;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        function safeTick() {&lt;br /&gt;
            if (!self.audioContext) return;&lt;br /&gt;
&lt;br /&gt;
            // Повторяем попытки resume, если браузер всё ещё держит suspended&lt;br /&gt;
            if (self.audioContext.state === &#039;suspended&#039;) {&lt;br /&gt;
                self.audioContext.resume().catch(function () {});&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            self.playTick();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        safeTick();&lt;br /&gt;
        this.clockTimer = setInterval(safeTick, 900);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    stopClockTick: function () {&lt;br /&gt;
        if (this.clockTimer) {&lt;br /&gt;
            clearInterval(this.clockTimer);&lt;br /&gt;
            this.clockTimer = null;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // Тик ближе к &amp;quot;механическому&amp;quot;&lt;br /&gt;
    playTick: function () {&lt;br /&gt;
        if (!this.audioContext || this.audioContext.state !== &#039;running&#039;) return;&lt;br /&gt;
&lt;br /&gt;
        var t = this.audioContext.currentTime;&lt;br /&gt;
&lt;br /&gt;
        var clickNoiseBuffer = this.audioContext.createBuffer(1, 512, this.audioContext.sampleRate);&lt;br /&gt;
        var data = clickNoiseBuffer.getChannelData(0);&lt;br /&gt;
        for (var i = 0; i &amp;lt; data.length; i++) {&lt;br /&gt;
            data[i] = (Math.random() * 2 - 1) * (1 - i / data.length);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var source = this.audioContext.createBufferSource();&lt;br /&gt;
        source.buffer = clickNoiseBuffer;&lt;br /&gt;
&lt;br /&gt;
        var hp = this.audioContext.createBiquadFilter();&lt;br /&gt;
        hp.type = &#039;highpass&#039;;&lt;br /&gt;
        hp.frequency.value = 1800;&lt;br /&gt;
&lt;br /&gt;
        var bp = this.audioContext.createBiquadFilter();&lt;br /&gt;
        bp.type = &#039;bandpass&#039;;&lt;br /&gt;
        bp.frequency.value = 2600;&lt;br /&gt;
        bp.Q.value = 1.5;&lt;br /&gt;
&lt;br /&gt;
        var gain = this.audioContext.createGain();&lt;br /&gt;
        gain.gain.setValueAtTime(0.0001, t);&lt;br /&gt;
        gain.gain.exponentialRampToValueAtTime(0.09, t + 0.002);&lt;br /&gt;
        gain.gain.exponentialRampToValueAtTime(0.0001, t + 0.05);&lt;br /&gt;
&lt;br /&gt;
        source.connect(hp);&lt;br /&gt;
        hp.connect(bp);&lt;br /&gt;
        bp.connect(gain);&lt;br /&gt;
        gain.connect(this.audioContext.destination);&lt;br /&gt;
&lt;br /&gt;
        source.start(t);&lt;br /&gt;
        source.stop(t + 0.06);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    // &amp;quot;Сдвиг куба&amp;quot;: whoosh + низкочастотный удар&lt;br /&gt;
    playCubeShiftSound: function () {&lt;br /&gt;
        if (!this.audioContext || this.audioContext.state !== &#039;running&#039;) return;&lt;br /&gt;
&lt;br /&gt;
        var t = this.audioContext.currentTime;&lt;br /&gt;
&lt;br /&gt;
        // Whoosh (шумовой слой)&lt;br /&gt;
        var duration = 0.55;&lt;br /&gt;
        var bufferSize = Math.floor(this.audioContext.sampleRate * duration);&lt;br /&gt;
        var noiseBuffer = this.audioContext.createBuffer(1, bufferSize, this.audioContext.sampleRate);&lt;br /&gt;
        var ch = noiseBuffer.getChannelData(0);&lt;br /&gt;
&lt;br /&gt;
        for (var i = 0; i &amp;lt; bufferSize; i++) {&lt;br /&gt;
            var env = 1 - (i / bufferSize);&lt;br /&gt;
            ch[i] = (Math.random() * 2 - 1) * env;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var noise = this.audioContext.createBufferSource();&lt;br /&gt;
        noise.buffer = noiseBuffer;&lt;br /&gt;
&lt;br /&gt;
        var noiseFilter = this.audioContext.createBiquadFilter();&lt;br /&gt;
        noiseFilter.type = &#039;bandpass&#039;;&lt;br /&gt;
        noiseFilter.frequency.setValueAtTime(1200, t);&lt;br /&gt;
        noiseFilter.frequency.exponentialRampToValueAtTime(320, t + duration);&lt;br /&gt;
        noiseFilter.Q.value = 0.9;&lt;br /&gt;
&lt;br /&gt;
        var noiseGain = this.audioContext.createGain();&lt;br /&gt;
        noiseGain.gain.setValueAtTime(0.0001, t);&lt;br /&gt;
        noiseGain.gain.exponentialRampToValueAtTime(0.22, t + 0.03);&lt;br /&gt;
        noiseGain.gain.exponentialRampToValueAtTime(0.0001, t + duration);&lt;br /&gt;
&lt;br /&gt;
        noise.connect(noiseFilter);&lt;br /&gt;
        noiseFilter.connect(noiseGain);&lt;br /&gt;
        noiseGain.connect(this.audioContext.destination);&lt;br /&gt;
&lt;br /&gt;
        noise.start(t);&lt;br /&gt;
        noise.stop(t + duration);&lt;br /&gt;
&lt;br /&gt;
        // Низкий &amp;quot;thud&amp;quot;&lt;br /&gt;
        var osc = this.audioContext.createOscillator();&lt;br /&gt;
        osc.type = &#039;triangle&#039;;&lt;br /&gt;
        osc.frequency.setValueAtTime(130, t + 0.12);&lt;br /&gt;
        osc.frequency.exponentialRampToValueAtTime(58, t + 0.35);&lt;br /&gt;
&lt;br /&gt;
        var oscGain = this.audioContext.createGain();&lt;br /&gt;
        oscGain.gain.setValueAtTime(0.0001, t + 0.1);&lt;br /&gt;
        oscGain.gain.exponentialRampToValueAtTime(0.18, t + 0.13);&lt;br /&gt;
        oscGain.gain.exponentialRampToValueAtTime(0.0001, t + 0.4);&lt;br /&gt;
&lt;br /&gt;
        osc.connect(oscGain);&lt;br /&gt;
        oscGain.connect(this.audioContext.destination);&lt;br /&gt;
&lt;br /&gt;
        osc.start(t + 0.1);&lt;br /&gt;
        osc.stop(t + 0.45);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
        AprilFoolsCubeTransitionModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17799</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17799"/>
		<updated>2026-03-31T22:40:12Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
var AprilFoolsCubeTransitionModule = {&lt;br /&gt;
    overlay: null,&lt;br /&gt;
    clockTimer: null,&lt;br /&gt;
    audioContext: null,&lt;br /&gt;
    audioReady: false,&lt;br /&gt;
    started: false,&lt;br /&gt;
&lt;br /&gt;
    // === БЫСТРЫЕ ПЕРЕКЛЮЧАТЕЛИ ===&lt;br /&gt;
    // Сейчас: только ?prank=1&lt;br /&gt;
    ENABLE_BY_FLAG: true,&lt;br /&gt;
    ENABLE_FOR_ALL_ON_APRIL_FIRST: false,&lt;br /&gt;
    ENABLE_FOR_ALL_ALWAYS: false,&lt;br /&gt;
    // ============================&lt;br /&gt;
&lt;br /&gt;
    init: function () {&lt;br /&gt;
        if (this.started) return;&lt;br /&gt;
        this.started = true;&lt;br /&gt;
&lt;br /&gt;
        if (!window.mw || !mw.config || !mw.config.get(&#039;wgIsMainPage&#039;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (!this.shouldRun()) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Чтобы не повторялось на каждый переход в рамках сессии&lt;br /&gt;
        if (sessionStorage.getItem(&#039;april-fools-cube-shown&#039;) === &#039;1&#039;) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        sessionStorage.setItem(&#039;april-fools-cube-shown&#039;, &#039;1&#039;);&lt;br /&gt;
&lt;br /&gt;
        this.injectStyles();&lt;br /&gt;
        this.createOverlay();&lt;br /&gt;
        this.initAudioUnlock();&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.showOverlay();&lt;br /&gt;
&lt;br /&gt;
        setTimeout(function () {&lt;br /&gt;
            self.startExitTransition();&lt;br /&gt;
        }, 6500);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    shouldRun: function () {&lt;br /&gt;
        if (this.ENABLE_FOR_ALL_ALWAYS) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (this.ENABLE_FOR_ALL_ON_APRIL_FIRST &amp;amp;&amp;amp; this.isAprilFirst()) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (this.ENABLE_BY_FLAG &amp;amp;&amp;amp; this.hasPrankFlag()) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return false;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    isAprilFirst: function () {&lt;br /&gt;
        var now = new Date();&lt;br /&gt;
        return now.getMonth() === 3 &amp;amp;&amp;amp; now.getDate() === 1;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    hasPrankFlag: function () {&lt;br /&gt;
        var params = new URLSearchParams(window.location.search);&lt;br /&gt;
        return params.get(&#039;prank&#039;) === &#039;1&#039;;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    injectStyles: function () {&lt;br /&gt;
        if (document.getElementById(&#039;april-fools-cube-styles&#039;)) return;&lt;br /&gt;
&lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;april-fools-cube-styles&#039;;&lt;br /&gt;
        style.textContent =&lt;br /&gt;
            &#039;#april-fools-overlay{&#039; +&lt;br /&gt;
                &#039;position:fixed;&#039; +&lt;br /&gt;
                &#039;inset:0;&#039; +&lt;br /&gt;
                &#039;z-index:2147483647;&#039; +&lt;br /&gt;
                &#039;background:#000;&#039; +&lt;br /&gt;
                &#039;display:flex;&#039; +&lt;br /&gt;
                &#039;align-items:center;&#039; +&lt;br /&gt;
                &#039;justify-content:center;&#039; +&lt;br /&gt;
                &#039;opacity:0;&#039; +&lt;br /&gt;
                &#039;visibility:hidden;&#039; +&lt;br /&gt;
                &#039;transform:translateZ(0);&#039; +&lt;br /&gt;
                &#039;will-change:transform,opacity;&#039; +&lt;br /&gt;
                &#039;overflow:hidden;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-overlay.active{&#039; +&lt;br /&gt;
                &#039;opacity:1;&#039; +&lt;br /&gt;
                &#039;visibility:visible;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-overlay img{&#039; +&lt;br /&gt;
                &#039;width:100%;&#039; +&lt;br /&gt;
                &#039;height:100%;&#039; +&lt;br /&gt;
                &#039;object-fit:cover;&#039; +&lt;br /&gt;
                &#039;display:block;&#039; +&lt;br /&gt;
                &#039;user-select:none;&#039; +&lt;br /&gt;
                &#039;-webkit-user-drag:none;&#039; +&lt;br /&gt;
                &#039;pointer-events:none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;#april-fools-overlay.exiting{&#039; +&lt;br /&gt;
                &#039;transform-origin:left center;&#039; +&lt;br /&gt;
                &#039;animation:aprilCubeOut 900ms cubic-bezier(0.2,0.8,0.2,1) forwards;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;@keyframes aprilCubeOut{&#039; +&lt;br /&gt;
                &#039;0%{&#039; +&lt;br /&gt;
                    &#039;transform:perspective(1400px) rotateY(0deg) translateX(0);&#039; +&lt;br /&gt;
                    &#039;opacity:1;&#039; +&lt;br /&gt;
                &#039;}&#039; +&lt;br /&gt;
                &#039;100%{&#039; +&lt;br /&gt;
                    &#039;transform:perspective(1400px) rotateY(-88deg) translateX(-34vw);&#039; +&lt;br /&gt;
                    &#039;opacity:0;&#039; +&lt;br /&gt;
                &#039;}&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
        document.head.appendChild(style);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createOverlay: function () {&lt;br /&gt;
        var overlay = document.createElement(&#039;div&#039;);&lt;br /&gt;
        overlay.id = &#039;april-fools-overlay&#039;;&lt;br /&gt;
&lt;br /&gt;
        var image = document.createElement(&#039;img&#039;);&lt;br /&gt;
        image.alt = &#039;Wikipedia homepage&#039;;&lt;br /&gt;
        image.src = &#039;https://upload.wikimedia.org/wikipedia/commons/d/d4/2019_Screenshot_of_English_Wikipedia_homepage.png&#039;;&lt;br /&gt;
&lt;br /&gt;
        overlay.appendChild(image);&lt;br /&gt;
        document.body.appendChild(overlay);&lt;br /&gt;
&lt;br /&gt;
        this.overlay = overlay;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    showOverlay: function () {&lt;br /&gt;
        if (!this.overlay) return;&lt;br /&gt;
        this.overlay.classList.add(&#039;active&#039;);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startExitTransition: function () {&lt;br /&gt;
        if (!this.overlay) return;&lt;br /&gt;
&lt;br /&gt;
        this.stopClockTick();&lt;br /&gt;
        this.playCubeShiftSound();&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
        this.overlay.classList.add(&#039;exiting&#039;);&lt;br /&gt;
        this.overlay.addEventListener(&#039;animationend&#039;, function handleEnd() {&lt;br /&gt;
            self.overlay.removeEventListener(&#039;animationend&#039;, handleEnd);&lt;br /&gt;
            if (self.overlay &amp;amp;&amp;amp; self.overlay.parentNode) {&lt;br /&gt;
                self.overlay.parentNode.removeChild(self.overlay);&lt;br /&gt;
            }&lt;br /&gt;
            self.overlay = null;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initAudioUnlock: function () {&lt;br /&gt;
        try {&lt;br /&gt;
            var Ctx = window.AudioContext || window.webkitAudioContext;&lt;br /&gt;
            if (!Ctx) return;&lt;br /&gt;
            this.audioContext = new Ctx();&lt;br /&gt;
        } catch (e) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        function unlock() {&lt;br /&gt;
            if (!self.audioContext) return;&lt;br /&gt;
&lt;br /&gt;
            self.audioContext.resume().then(function () {&lt;br /&gt;
                self.audioReady = true;&lt;br /&gt;
                self.startClockTick();&lt;br /&gt;
            }).catch(function () {&lt;br /&gt;
                self.audioReady = false;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            document.removeEventListener(&#039;pointerdown&#039;, unlock);&lt;br /&gt;
            document.removeEventListener(&#039;keydown&#039;, unlock);&lt;br /&gt;
            document.removeEventListener(&#039;touchstart&#039;, unlock);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener(&#039;pointerdown&#039;, unlock, { once: true });&lt;br /&gt;
        document.addEventListener(&#039;keydown&#039;, unlock, { once: true });&lt;br /&gt;
        document.addEventListener(&#039;touchstart&#039;, unlock, { once: true });&lt;br /&gt;
&lt;br /&gt;
        if (this.audioContext.state === &#039;running&#039;) {&lt;br /&gt;
            this.audioReady = true;&lt;br /&gt;
            this.startClockTick();&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    startClockTick: function () {&lt;br /&gt;
        if (!this.audioContext || !this.audioReady || this.clockTimer) return;&lt;br /&gt;
&lt;br /&gt;
        var self = this;&lt;br /&gt;
&lt;br /&gt;
        function tick() {&lt;br /&gt;
            self.playTick();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        tick();&lt;br /&gt;
        this.clockTimer = setInterval(tick, 1000);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    stopClockTick: function () {&lt;br /&gt;
        if (this.clockTimer) {&lt;br /&gt;
            clearInterval(this.clockTimer);&lt;br /&gt;
            this.clockTimer = null;&lt;br /&gt;
        }&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    playTick: function () {&lt;br /&gt;
        if (!this.audioContext || this.audioContext.state !== &#039;running&#039;) return;&lt;br /&gt;
&lt;br /&gt;
        var t = this.audioContext.currentTime;&lt;br /&gt;
&lt;br /&gt;
        var osc = this.audioContext.createOscillator();&lt;br /&gt;
        var gain = this.audioContext.createGain();&lt;br /&gt;
        var hp = this.audioContext.createBiquadFilter();&lt;br /&gt;
&lt;br /&gt;
        hp.type = &#039;highpass&#039;;&lt;br /&gt;
        hp.frequency.value = 900;&lt;br /&gt;
&lt;br /&gt;
        osc.type = &#039;square&#039;;&lt;br /&gt;
        osc.frequency.setValueAtTime(1400, t);&lt;br /&gt;
&lt;br /&gt;
        gain.gain.setValueAtTime(0.0001, t);&lt;br /&gt;
        gain.gain.exponentialRampToValueAtTime(0.08, t + 0.002);&lt;br /&gt;
        gain.gain.exponentialRampToValueAtTime(0.0001, t + 0.035);&lt;br /&gt;
&lt;br /&gt;
        osc.connect(hp);&lt;br /&gt;
        hp.connect(gain);&lt;br /&gt;
        gain.connect(this.audioContext.destination);&lt;br /&gt;
&lt;br /&gt;
        osc.start(t);&lt;br /&gt;
        osc.stop(t + 0.04);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    playCubeShiftSound: function () {&lt;br /&gt;
        if (!this.audioContext || this.audioContext.state !== &#039;running&#039;) return;&lt;br /&gt;
&lt;br /&gt;
        var t = this.audioContext.currentTime;&lt;br /&gt;
&lt;br /&gt;
        var osc = this.audioContext.createOscillator();&lt;br /&gt;
        var gain = this.audioContext.createGain();&lt;br /&gt;
        var lp = this.audioContext.createBiquadFilter();&lt;br /&gt;
&lt;br /&gt;
        lp.type = &#039;lowpass&#039;;&lt;br /&gt;
        lp.frequency.setValueAtTime(1200, t);&lt;br /&gt;
        lp.frequency.exponentialRampToValueAtTime(220, t + 0.45);&lt;br /&gt;
&lt;br /&gt;
        osc.type = &#039;sawtooth&#039;;&lt;br /&gt;
        osc.frequency.setValueAtTime(380, t);&lt;br /&gt;
        osc.frequency.exponentialRampToValueAtTime(90, t + 0.45);&lt;br /&gt;
&lt;br /&gt;
        gain.gain.setValueAtTime(0.0001, t);&lt;br /&gt;
        gain.gain.exponentialRampToValueAtTime(0.18, t + 0.02);&lt;br /&gt;
        gain.gain.exponentialRampToValueAtTime(0.0001, t + 0.5);&lt;br /&gt;
&lt;br /&gt;
        osc.connect(lp);&lt;br /&gt;
        lp.connect(gain);&lt;br /&gt;
        gain.connect(this.audioContext.destination);&lt;br /&gt;
&lt;br /&gt;
        osc.start(t);&lt;br /&gt;
        osc.stop(t + 0.52);&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init();&lt;br /&gt;
        AprilFoolsCubeTransitionModule.init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%94_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0/%D0%A2%D0%B8%D0%BF%D1%8B_%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%B8%D0%B9/%D0%A1%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=17793</id>
		<title>Шаблон:Закон Д класса/Типы нарушений/Средние нарушения</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%94_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0/%D0%A2%D0%B8%D0%BF%D1%8B_%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%B8%D0%B9/%D0%A1%D1%80%D0%B5%D0%B4%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=17793"/>
		<updated>2026-03-31T12:48:16Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Наказание&#039;&#039;&#039;: 2 очка штрафа.&lt;br /&gt;
&lt;br /&gt;
{| style=&#039;text-align:center;&#039; border=1 cellspacing=1&lt;br /&gt;
! style=&amp;quot;background-color:#414700; width=15%&amp;quot; | Преступление&lt;br /&gt;
! style=&amp;quot;background-color:#414700; width=35%&amp;quot; | Описание&lt;br /&gt;
! style=&amp;quot;background-color:#414700; width=50%&amp;quot; | Пример&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#414700;&#039;&lt;br /&gt;
| {{Anchor|200}}&#039;&#039;&#039;200&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Сопротивление аресту и/или обыску.&#039;&#039;&#039;&lt;br /&gt;
| 	Любое сопротивление, не дающие сотрудникам СБ провести процедуру обыска и/или ареста.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Бегство от сотрудников СБ, которые пытаются заковать нарушителя.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Попытки и/или расковывание из наручников.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#414700;&#039;&lt;br /&gt;
| {{Anchor|201}}&#039;&#039;&#039;201&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Лёгкий ущерб здоровью&#039;&#039;&#039;&lt;br /&gt;
| 	Применение физической силы с причинением незначительного вреда здоровью.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Неоднократные попытки обезоружить (более 3).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Незначительные удары (менее 4).&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#414700;&#039;&lt;br /&gt;
| {{Anchor|202}}&#039;&#039;&#039;202&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Вандализм&#039;&#039;&#039;&lt;br /&gt;
| 	Создание повреждений в технической части учреждения.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Незначительные повреждения (ЛКП, шлюзы и т.д.).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Разбивание ламп в количестве больше 4.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Отключение электропитания на небольшой площади ЗСД вне рабочих отделов (коридоры, и т.п.).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Нанесение средних и тяжёлых повреждений киборгам учреждения.&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#414700;&#039;&lt;br /&gt;
| {{Anchor|203}}&#039;&#039;&#039;203&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Владение контрабандой 2 уровня&#039;&#039;&#039;&lt;br /&gt;
| 	Владение [[#Контрабанда|контрабандой 2 уровня]] или её хранение.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Владение каких-либо из предметов, которые относятся к контрабанде 2 уровня.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Распространение контрабанды 1 уровня.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Сбыт контрабанды 1 уровня.&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#414700;&#039;&lt;br /&gt;
| {{Anchor|204}}&#039;&#039;&#039;204&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Длительное препятствие работе сотрудников Фонда. Хулиганство.&#039;&#039;&#039;&lt;br /&gt;
| 	Длительное препятствие работе сотрудников Фонда. Хулиганство.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Хулиганство подразумевает нарушение общественного порядка, выражающее явное неуважение к обществу, сопровождающееся нецензурной бранью в общественных местах, оскорбительным поведением, а также уничтожением или повреждением чужого имущества. &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Любое длительное препятствие сотрудникам Фонда, которое мешает выполнению их работе.&lt;br /&gt;
|- &lt;br /&gt;
|-style=&#039;background-color:#414700;&#039;&lt;br /&gt;
| {{Anchor|205}}&#039;&#039;&#039;205&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Проникновение в зону безопасности&#039;&#039;&#039;&lt;br /&gt;
| 	Преднамеренный вход на незначительную территорию ЗБ.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
*Преследуя сотрудника Фонда.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
*Вступить за линию дабы помочь Д-классу (если его там заковывают сбить заковывание).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
*При сопровождении тоже включено всё.&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#414700;&#039;&lt;br /&gt;
| {{Anchor|206}}&#039;&#039;&#039;206&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Оскорбление персонала комплекса&#039;&#039;&#039;&lt;br /&gt;
| 	Любое оскорбление персонала комплекса&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Оскорбление персонала Фонда.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%94_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0/%D0%A2%D0%B8%D0%BF%D1%8B_%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%B8%D0%B9/%D0%9B%D1%91%D0%B3%D0%BA%D0%B8%D0%B5_%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=17792</id>
		<title>Шаблон:Закон Д класса/Типы нарушений/Лёгкие нарушения</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%94_%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0/%D0%A2%D0%B8%D0%BF%D1%8B_%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%B8%D0%B9/%D0%9B%D1%91%D0%B3%D0%BA%D0%B8%D0%B5_%D0%BD%D0%B0%D1%80%D1%83%D1%88%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=17792"/>
		<updated>2026-03-31T12:47:12Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Наказание&#039;&#039;&#039;: 1 очко штрафа.&lt;br /&gt;
{| style=&#039;text-align:center;&#039; border=1 cellspacing=1&lt;br /&gt;
! style=&amp;quot;background-color:#0F4F27; width=15%&amp;quot; | Преступление&lt;br /&gt;
! style=&amp;quot;background-color:#0F4F27; width=35%&amp;quot; | Описание&lt;br /&gt;
! style=&amp;quot;background-color:#0F4F27; width=50%&amp;quot; | Пример&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#0F4F27;&#039;&lt;br /&gt;
| {{Anchor|100}}&#039;&#039;&#039;100&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Неподчинение приказу персонала Фонда. Сокрытие от службы безопасности.&#039;&#039;&#039;&lt;br /&gt;
|  Неподчинение приказу персонала фонда и сокрытие что-то или кого-то от Службы безопасности.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Неподчинение приказу персонала фонда.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Сокрытие любого оружия от Службы безопасности.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Сокрытие преступника от Службы безопасности.&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#0F4F27;&#039;&lt;br /&gt;
| {{Anchor|102}}&#039;&#039;&#039;102&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Порча имущества&#039;&#039;&#039;&lt;br /&gt;
| 	Повреждение, разрушение, приведение в непригодность к эксплуатации имущества сотрудников или учреждения, а также повреждение самого учреждения в незначительной степени.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Чрезмерное нанесение рисунков.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Разбивание ламп в количистве меньше 4.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Несанкционированная перекраска дверей.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Засорение коридоров и помещений учреждения путём разбрасывания предметов и/или разливания жидкостей.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Уничтожение мебели (столы, кресла и т.п), посуды, которая может находиться в отделах.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Незначительные повреждение киборгов (менее 3-х ударов).&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#0F4F27;&#039;&lt;br /&gt;
| {{Anchor|103}}&#039;&#039;&#039;103&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Владение контрабандой 1 уровня&#039;&#039;&#039;&lt;br /&gt;
| 	Владение [[#Контрабанда|контрабандой 1 уровня]] или её хранение.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Владение каких-либо из предметов, которые относятся к контрабанде 1 уровня.&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#0F4F27;&#039;&lt;br /&gt;
| {{Anchor|104}}&#039;&#039;&#039;104&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Бесцельное пребывание вблизи запретных зон.&#039;&#039;&#039;&lt;br /&gt;
| 	Бесцельное нахождение около запретных зон.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Нахождение просто так около линии, отделяющее Охрану от сотрудников Класса-Д.&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#0F4F27;&#039;&lt;br /&gt;
| {{Anchor|105}}&#039;&#039;&#039;105&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Нарушение границ зоны безопасности&#039;&#039;&#039;&lt;br /&gt;
| 	Непреднамеренный вход на незначительную территорию ЗБ.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
*  Зашёл за линию у КПП Д-блока.&lt;br /&gt;
*  При сопровождении пошёл не туда.&lt;br /&gt;
|-&lt;br /&gt;
|-style=&#039;background-color:#0F4F27;&#039;&lt;br /&gt;
| {{Anchor|106}}&#039;&#039;&#039;106&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Оскорбительное поведение&#039;&#039;&#039;&lt;br /&gt;
| 	Грубое нарушение общественного порядка, выраженное явным неуважения к коллективу Д-блока или персоналу Фонда.&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
* Оскорбления других лиц.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Эксгибиционизм (нахождение без одежды в местах, не предусмотренных для переодевания).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Приставания, поцелуи, излишний тактильный контакт против воли того, к кому применяются действия непристойного характера.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
* Воспроизведение откровенно мешающих громких или назойливых звуков.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17791</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17791"/>
		<updated>2026-03-31T12:46:43Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
    var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
    var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
    text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Новый формат: &amp;quot;§ 1.1 Название&amp;quot;&lt;br /&gt;
    text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
    // Старый формат: &amp;quot;200Название&amp;quot; / &amp;quot;200 Название&amp;quot; / &amp;quot;200. Название&amp;quot;&lt;br /&gt;
    var normalizedCode = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
    if (normalizedCode) {&lt;br /&gt;
        var escapedCode = normalizedCode.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
        var legacyPrefix = new RegExp(&lt;br /&gt;
            &#039;^(?:§\\s*_?\\s*)?&#039; + escapedCode + &#039;[\\s\\u00A0\\-–—:.,)]*&#039;,&lt;br /&gt;
            &#039;u&#039;&lt;br /&gt;
        );&lt;br /&gt;
        text = text.replace(legacyPrefix, &#039;&#039;).trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return text;&lt;br /&gt;
},&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17789</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17789"/>
		<updated>2026-03-31T12:43:42Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var linkCodes = LawTooltipsModule.collectLinkCodes(tableCells);&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData(linkCodes);&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    collectLinkCodes: function (tableCells) {&lt;br /&gt;
        var codes = new Set();&lt;br /&gt;
&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            codes.add(rawCode);&lt;br /&gt;
            codes.add(LawTooltipsModule.normalizeLawCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toSectionCode(rawCode));&lt;br /&gt;
            codes.add(LawTooltipsModule.toLegacyCode(rawCode));&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return codes;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function (expectedCodes) {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;span[id]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var rawId = (span.id || &#039;&#039;).trim();&lt;br /&gt;
            if (!rawId) return;&lt;br /&gt;
&lt;br /&gt;
            var normalizedId = LawTooltipsModule.normalizeLawCode(rawId);&lt;br /&gt;
&lt;br /&gt;
            if (expectedCodes &amp;amp;&amp;amp; expectedCodes.size &amp;gt; 0) {&lt;br /&gt;
                var isExpected =&lt;br /&gt;
                    expectedCodes.has(rawId) ||&lt;br /&gt;
                    expectedCodes.has(normalizedId) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toSectionCode(rawId)) ||&lt;br /&gt;
                    expectedCodes.has(LawTooltipsModule.toLegacyCode(rawId));&lt;br /&gt;
&lt;br /&gt;
                if (!isExpected) return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell, rawId);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            var payload = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples,&lt;br /&gt;
                sourceCode: rawId&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            LawTooltipsModule.addLawDataAliases(lawData, rawId, payload);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    addLawDataAliases: function (lawData, rawCode, payload) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
        var sectionCode = LawTooltipsModule.toSectionCode(rawCode);&lt;br /&gt;
        var legacyCode = LawTooltipsModule.toLegacyCode(rawCode);&lt;br /&gt;
&lt;br /&gt;
        var keys = [rawCode, normalized, sectionCode, legacyCode];&lt;br /&gt;
&lt;br /&gt;
        keys.forEach(function (key) {&lt;br /&gt;
            if (!key) return;&lt;br /&gt;
            lawData[key] = payload;&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractTitleFromCrimeCell: function (crimeCell, rawCode) {&lt;br /&gt;
        var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
        var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
        text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
        text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/u, &#039;&#039;).trim();&lt;br /&gt;
&lt;br /&gt;
        if (!text) {&lt;br /&gt;
            var normalized = LawTooltipsModule.normalizeLawCode(rawCode);&lt;br /&gt;
            var escaped = normalized.replace(/[.*+?^${}()|[\]\\]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
            text = ((b ? b.textContent : crimeCell.textContent) || &#039;&#039;)&lt;br /&gt;
                .replace(/\s+/g, &#039; &#039;)&lt;br /&gt;
                .replace(new RegExp(&#039;^&#039; + escaped + &#039;\\s*&#039;, &#039;u&#039;), &#039;&#039;)&lt;br /&gt;
                .trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return text;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractCodeFromHref: function (href) {&lt;br /&gt;
        var match = (href || &#039;&#039;).match(/^#(.+)$/);&lt;br /&gt;
        if (!match) return &#039;&#039;;&lt;br /&gt;
        return (match[1] || &#039;&#039;).trim();&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    normalizeLawCode: function (lawCode) {&lt;br /&gt;
        var code = (lawCode || &#039;&#039;).trim();&lt;br /&gt;
        code = code.replace(/^#/, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/^§\s*_?\s*/u, &#039;&#039;);&lt;br /&gt;
        code = code.replace(/\s+/g, &#039;&#039;);&lt;br /&gt;
        return code;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toSectionCode: function (lawCode) {&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
        if (!normalized) return &#039;&#039;;&lt;br /&gt;
        return &#039;§_&#039; + normalized;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    toLegacyCode: function (lawCode) {&lt;br /&gt;
        return LawTooltipsModule.normalizeLawCode(lawCode);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode, data) {&lt;br /&gt;
        var raw = (data &amp;amp;&amp;amp; data.sourceCode ? data.sourceCode : lawCode) || &#039;&#039;;&lt;br /&gt;
        var normalized = LawTooltipsModule.normalizeLawCode(raw);&lt;br /&gt;
&lt;br /&gt;
        if (/^§\s*_?/u.test(raw) || raw.indexOf(&#039;§_&#039;) === 0 || normalized.indexOf(&#039;.&#039;) !== -1) {&lt;br /&gt;
            return &#039;§ &#039; + normalized;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return normalized || raw;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode, data);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var rawCode = LawTooltipsModule.extractCodeFromHref(href);&lt;br /&gt;
            if (!rawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var candidateKeys = [&lt;br /&gt;
                rawCode,&lt;br /&gt;
                LawTooltipsModule.normalizeLawCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toSectionCode(rawCode),&lt;br /&gt;
                LawTooltipsModule.toLegacyCode(rawCode)&lt;br /&gt;
            ];&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = null;&lt;br /&gt;
            var matchedKey = null;&lt;br /&gt;
&lt;br /&gt;
            for (var i = 0; i &amp;lt; candidateKeys.length; i++) {&lt;br /&gt;
                var key = candidateKeys[i];&lt;br /&gt;
                if (!key) continue;&lt;br /&gt;
&lt;br /&gt;
                tooltipContent = LawTooltipsModule.createTooltipContent(key, lawData);&lt;br /&gt;
                if (tooltipContent) {&lt;br /&gt;
                    matchedKey = key;&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = rawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17681</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17681"/>
		<updated>2026-03-30T07:35:17Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
var LawTooltipsModule = {&lt;br /&gt;
    init: function () {&lt;br /&gt;
        var tableCells = document.querySelectorAll(&#039;.law-tooltips td, .law-tooltips th&#039;);&lt;br /&gt;
        if (tableCells.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        MediaWikiTooltips.load(function () {&lt;br /&gt;
            var lawData = LawTooltipsModule.extractLawData();&lt;br /&gt;
            LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
        });&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractLawData: function () {&lt;br /&gt;
        var lawData = {};&lt;br /&gt;
        var crimeIdSpans = document.querySelectorAll(&#039;table.wikitable span[id^=&amp;quot;§_&amp;quot;]&#039;);&lt;br /&gt;
&lt;br /&gt;
        crimeIdSpans.forEach(function (span) {&lt;br /&gt;
            var lawCode = span.id;&lt;br /&gt;
            if (!lawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var tr = span.closest(&#039;tr&#039;);&lt;br /&gt;
            if (!tr) return;&lt;br /&gt;
&lt;br /&gt;
            var cells = tr.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
&lt;br /&gt;
            var crimeCell = cells[0];&lt;br /&gt;
            var descriptionCell = cells[1];&lt;br /&gt;
            var exampleCell = cells[2];&lt;br /&gt;
&lt;br /&gt;
            var title = LawTooltipsModule.extractTitleFromCrimeCell(crimeCell);&lt;br /&gt;
            if (!title) return;&lt;br /&gt;
&lt;br /&gt;
            var description = (descriptionCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
            var examples = LawTooltipsModule.extractExamplesFromExampleCell(exampleCell);&lt;br /&gt;
&lt;br /&gt;
            lawData[lawCode] = {&lt;br /&gt;
                title: title,&lt;br /&gt;
                description: description,&lt;br /&gt;
                examples: examples&lt;br /&gt;
            };&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        return lawData;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractTitleFromCrimeCell: function (crimeCell) {&lt;br /&gt;
        var b = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
        var text = (b ? b.textContent : crimeCell.textContent) || &#039;&#039;;&lt;br /&gt;
        text = text.replace(/\s+/g, &#039; &#039;).trim();&lt;br /&gt;
&lt;br /&gt;
        // Пример текста: &amp;quot;§ 1.1 Оскорбительное поведение&amp;quot;&lt;br /&gt;
        text = text.replace(/^§\s*[\d]+(?:\.\s*[\d]+)*\s*/,&#039;&#039;).trim();&lt;br /&gt;
        return text;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    extractExamplesFromExampleCell: function (exampleCell) {&lt;br /&gt;
        var examples = [];&lt;br /&gt;
        var liItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
&lt;br /&gt;
        if (liItems.length &amp;gt; 0) {&lt;br /&gt;
            liItems.forEach(function (item) {&lt;br /&gt;
                var html = (item.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
                html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
                html = html.trim();&lt;br /&gt;
                if (html) examples.push(html);&lt;br /&gt;
            });&lt;br /&gt;
            return examples;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // На случай, если вместо &amp;lt;li&amp;gt; будет иной формат&lt;br /&gt;
        var fallback = (exampleCell.innerHTML || &#039;&#039;).trim();&lt;br /&gt;
        fallback = fallback.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;).trim();&lt;br /&gt;
        if (fallback) examples.push(fallback);&lt;br /&gt;
&lt;br /&gt;
        return examples;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    formatLawCode: function (lawCode) {&lt;br /&gt;
        // §_1.1 -&amp;gt; § 1.1&lt;br /&gt;
        return (lawCode || &#039;&#039;).replace(/^§_/, &#039;§ &#039;);&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    createTooltipContent: function (lawCode, lawData) {&lt;br /&gt;
        var data = lawData[lawCode];&lt;br /&gt;
        if (!data) return null;&lt;br /&gt;
&lt;br /&gt;
        var displayCode = LawTooltipsModule.formatLawCode(lawCode);&lt;br /&gt;
&lt;br /&gt;
        var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + displayCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
        html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + (data.description || &#039;&#039;) + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
        if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
            html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
            html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
            data.examples.slice(0, 5).forEach(function (example) {&lt;br /&gt;
                html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
        return html;&lt;br /&gt;
    },&lt;br /&gt;
&lt;br /&gt;
    initCellTooltips: function (tableCells, lawData) {&lt;br /&gt;
        tableCells.forEach(function (cell) {&lt;br /&gt;
            if (cell.dataset.lawTooltipAttached === &#039;1&#039;) return;&lt;br /&gt;
&lt;br /&gt;
            var link = cell.querySelector(&#039;a[href^=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
            if (!link) return;&lt;br /&gt;
&lt;br /&gt;
            var href = link.getAttribute(&#039;href&#039;) || &#039;&#039;;&lt;br /&gt;
            var match = href.match(/^#(.+)$/);&lt;br /&gt;
            if (!match) return;&lt;br /&gt;
&lt;br /&gt;
            var lawCode = match[1];&lt;br /&gt;
            if (!lawCode) return;&lt;br /&gt;
&lt;br /&gt;
            var tooltipContent = LawTooltipsModule.createTooltipContent(lawCode, lawData);&lt;br /&gt;
            if (!tooltipContent) return;&lt;br /&gt;
&lt;br /&gt;
            cell.dataset.lawTooltipAttached = &#039;1&#039;;&lt;br /&gt;
            cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
&lt;br /&gt;
            cell.addEventListener(&#039;click&#039;, function (e) {&lt;br /&gt;
                e.preventDefault();&lt;br /&gt;
                window.location.hash = lawCode;&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            tippy(cell, {&lt;br /&gt;
                content: tooltipContent,&lt;br /&gt;
                allowHTML: true,&lt;br /&gt;
                interactive: true,&lt;br /&gt;
                placement: &#039;top&#039;,&lt;br /&gt;
                maxWidth: 400,&lt;br /&gt;
                theme: &#039;law-theme&#039;,&lt;br /&gt;
                arrow: true,&lt;br /&gt;
                duration: [200, 150],&lt;br /&gt;
                delay: [0, 50],&lt;br /&gt;
                appendTo: document.body,&lt;br /&gt;
                boundary: &#039;viewport&#039;,&lt;br /&gt;
                popperOptions: {&lt;br /&gt;
                    strategy: &#039;fixed&#039;,&lt;br /&gt;
                    modifiers: [&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;preventOverflow&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                boundary: &#039;viewport&#039;,&lt;br /&gt;
                                padding: 20,&lt;br /&gt;
                                altAxis: true,&lt;br /&gt;
                                altBoundary: true&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;flip&#039;,&lt;br /&gt;
                            options: {&lt;br /&gt;
                                fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                            }&lt;br /&gt;
                        },&lt;br /&gt;
                        {&lt;br /&gt;
                            name: &#039;computeStyles&#039;,&lt;br /&gt;
                            options: { adaptive: false }&lt;br /&gt;
                        }&lt;br /&gt;
                    ]&lt;br /&gt;
                },&lt;br /&gt;
                onShow: function (instance) {&lt;br /&gt;
                    document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function (tooltip) {&lt;br /&gt;
                        if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                            tooltip._tippy.hide();&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17680</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=MediaWiki:Common.js&amp;diff=17680"/>
		<updated>2026-03-30T07:31:02Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;(function() {&lt;br /&gt;
    &#039;use strict&#039;;&lt;br /&gt;
    &lt;br /&gt;
    window.MediaWikiTooltips = {&lt;br /&gt;
        loaded: false,&lt;br /&gt;
        callbacks: [],&lt;br /&gt;
        &lt;br /&gt;
        load: function(callback) {&lt;br /&gt;
            if (this.loaded &amp;amp;&amp;amp; window.tippy) {&lt;br /&gt;
                callback();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            this.callbacks.push(callback);&lt;br /&gt;
            &lt;br /&gt;
            if (this.loading) return;&lt;br /&gt;
            this.loading = true;&lt;br /&gt;
            &lt;br /&gt;
            var self = this;&lt;br /&gt;
            var popperScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
            popperScript.src = &#039;https://unpkg.com/@popperjs/core@2/dist/umd/popper.min.js&#039;;&lt;br /&gt;
            popperScript.onload = function() {&lt;br /&gt;
                var tippyScript = document.createElement(&#039;script&#039;);&lt;br /&gt;
                tippyScript.src = &#039;https://unpkg.com/tippy.js@6/dist/tippy-bundle.umd.min.js&#039;;&lt;br /&gt;
                tippyScript.onload = function() {&lt;br /&gt;
                    self.loaded = true;&lt;br /&gt;
                    self.loading = false;&lt;br /&gt;
                    self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
                    self.callbacks = [];&lt;br /&gt;
                };&lt;br /&gt;
                document.head.appendChild(tippyScript);&lt;br /&gt;
            };&lt;br /&gt;
            document.head.appendChild(popperScript);&lt;br /&gt;
            &lt;br /&gt;
            var tippyCSS = document.createElement(&#039;link&#039;);&lt;br /&gt;
            tippyCSS.rel = &#039;stylesheet&#039;;&lt;br /&gt;
            tippyCSS.href = &#039;https://unpkg.com/tippy.js@6/dist/tippy.css&#039;;&lt;br /&gt;
            document.head.appendChild(tippyCSS);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var SidebarModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var buttons = document.querySelectorAll(&#039;.боковая-панель-кнопка&#039;);&lt;br /&gt;
            var sections = document.querySelectorAll(&#039;.боковая-панель-раздел&#039;);&lt;br /&gt;
            &lt;br /&gt;
            if (buttons.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            buttons.forEach(function(button) {&lt;br /&gt;
                button.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
                    var targetId = this.dataset.target;&lt;br /&gt;
                    &lt;br /&gt;
                    buttons.forEach(function(btn) { btn.classList.remove(&#039;active&#039;); });&lt;br /&gt;
                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
                    &lt;br /&gt;
                    sections.forEach(function(section) { section.classList.remove(&#039;default&#039;); });&lt;br /&gt;
                    var targetSection = document.getElementById(targetId);&lt;br /&gt;
                    if (targetSection) {&lt;br /&gt;
                        targetSection.classList.add(&#039;default&#039;);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            buttons[0].click();&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var AccessTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var containers = document.querySelectorAll(&#039;.допуск-контейнер&#039;);&lt;br /&gt;
            if (containers.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                containers.forEach(function(container) {&lt;br /&gt;
                    var contentElement = container.querySelector(&#039;.допуск-подсказка&#039;);&lt;br /&gt;
                    if (!contentElement) return;&lt;br /&gt;
                    &lt;br /&gt;
                    var content = contentElement.innerHTML;&lt;br /&gt;
                    tippy(container, {&lt;br /&gt;
                        content: content,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: true,&lt;br /&gt;
                        placement: &#039;auto&#039;,&lt;br /&gt;
                        maxWidth: 500,&lt;br /&gt;
                        theme: &#039;dark&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 200],&lt;br /&gt;
                        popperOptions: {&lt;br /&gt;
                            modifiers: [&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                    options: { padding: 8 }&lt;br /&gt;
                                },&lt;br /&gt;
                                {&lt;br /&gt;
                                    name: &#039;flip&#039;,&lt;br /&gt;
                                    options: {&lt;br /&gt;
                                        fallbackPlacements: [&#039;top&#039;, &#039;bottom&#039;, &#039;right&#039;, &#039;left&#039;]&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                            ]&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var LawTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var tableCells = document.querySelectorAll(&#039;.law-tooltips td&#039;);&lt;br /&gt;
            if (tableCells.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                var lawData = LawTooltipsModule.extractLawData();&lt;br /&gt;
                LawTooltipsModule.initCellTooltips(tableCells, lawData);&lt;br /&gt;
            });&lt;br /&gt;
        },&lt;br /&gt;
        &lt;br /&gt;
        extractLawData: function() {&lt;br /&gt;
		    var lawData = {};&lt;br /&gt;
		    var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
		    &lt;br /&gt;
		    detailTables.forEach(function(table) {&lt;br /&gt;
		        var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
		        &lt;br /&gt;
		        rows.forEach(function(row) {&lt;br /&gt;
		            var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
		            if (cells.length &amp;lt; 3) return;&lt;br /&gt;
		            &lt;br /&gt;
		            var crimeCell = cells[0];&lt;br /&gt;
		            var descriptionCell = cells[1];&lt;br /&gt;
		            var exampleCell = cells[2];&lt;br /&gt;
		            &lt;br /&gt;
		            var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
		            if (!anchor) return;&lt;br /&gt;
		            &lt;br /&gt;
		            var lawCode = anchor.id;&lt;br /&gt;
		            var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
		            &lt;br /&gt;
		            if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
		                var titleText = titleElement.textContent.trim();&lt;br /&gt;
		                var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
		                var description = descriptionCell.innerHTML.trim();&lt;br /&gt;
		                &lt;br /&gt;
		                var examples = [];&lt;br /&gt;
		                var exampleItems = exampleCell.querySelectorAll(&#039;li&#039;);&lt;br /&gt;
						exampleItems.forEach(function(item) {&lt;br /&gt;
						    var html = item.innerHTML.trim();&lt;br /&gt;
						    // Удаляем все &amp;lt;br&amp;gt; теги&lt;br /&gt;
						    html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
						    if (html) examples.push(html);&lt;br /&gt;
						});&lt;br /&gt;
		                &lt;br /&gt;
		                lawData[lawCode] = {&lt;br /&gt;
		                    title: lawTitle,&lt;br /&gt;
		                    description: description,&lt;br /&gt;
		                    examples: examples&lt;br /&gt;
		                };&lt;br /&gt;
		            }&lt;br /&gt;
		        });&lt;br /&gt;
		    });&lt;br /&gt;
		    &lt;br /&gt;
		    return lawData;&lt;br /&gt;
		},&lt;br /&gt;
        &lt;br /&gt;
    createTooltipContent: function(lawCode, lawData) {&lt;br /&gt;
	    var data = lawData[lawCode];&lt;br /&gt;
	    if (!data) return null;&lt;br /&gt;
	    &lt;br /&gt;
	    var html = &#039;&amp;lt;div class=&amp;quot;law-tooltip&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
	    html += &#039;&amp;lt;h4 class=&amp;quot;law-tooltip-title&amp;quot;&amp;gt;&#039; + lawCode + &#039; - &#039; + data.title + &#039;&amp;lt;/h4&amp;gt;&#039;;&lt;br /&gt;
	    html += &#039;&amp;lt;p class=&amp;quot;law-tooltip-description&amp;quot;&amp;gt;&#039; + data.description + &#039;&amp;lt;/p&amp;gt;&#039;;&lt;br /&gt;
	    &lt;br /&gt;
	    if (data.examples &amp;amp;&amp;amp; data.examples.length &amp;gt; 0) {&lt;br /&gt;
	        html += &#039;&amp;lt;div class=&amp;quot;law-tooltip-examples&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
	        html += &#039;&amp;lt;strong&amp;gt;Примеры:&amp;lt;/strong&amp;gt;&amp;lt;ul&amp;gt;&#039;;&lt;br /&gt;
	        data.examples.slice(0, 5).forEach(function(example) {&lt;br /&gt;
	            html += &#039;&amp;lt;li&amp;gt;&#039; + example + &#039;&amp;lt;/li&amp;gt;&#039;; // Теперь example содержит HTML&lt;br /&gt;
	        });&lt;br /&gt;
	        html += &#039;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	    }&lt;br /&gt;
	    html += &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	    &lt;br /&gt;
	    return html;&lt;br /&gt;
	},&lt;br /&gt;
        &lt;br /&gt;
        initCellTooltips: function(tableCells, lawData) {&lt;br /&gt;
            tableCells.forEach(function(cell) {&lt;br /&gt;
                var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
                if (!link) return;&lt;br /&gt;
                &lt;br /&gt;
                var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
                var match = href.match(/#(\d{3})/);&lt;br /&gt;
                if (!match) return;&lt;br /&gt;
                &lt;br /&gt;
                var lawCode = match[1];&lt;br /&gt;
                var tooltipContent = LawTooltipsModule.createTooltipContent(lawCode, lawData);&lt;br /&gt;
                if (!tooltipContent) return;&lt;br /&gt;
                &lt;br /&gt;
                cell.classList.add(&#039;law-cell-with-tooltip&#039;);&lt;br /&gt;
                &lt;br /&gt;
                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
                    e.preventDefault();&lt;br /&gt;
                    window.location.hash = lawCode;&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                tippy(cell, {&lt;br /&gt;
                    content: tooltipContent,&lt;br /&gt;
                    allowHTML: true,&lt;br /&gt;
                    interactive: true,&lt;br /&gt;
                    placement: &#039;top&#039;,&lt;br /&gt;
                    maxWidth: 400,&lt;br /&gt;
                    theme: &#039;law-theme&#039;,&lt;br /&gt;
                    arrow: true,&lt;br /&gt;
                    duration: [200, 150],&lt;br /&gt;
                    delay: [0, 50],&lt;br /&gt;
                    appendTo: document.body,&lt;br /&gt;
                    boundary: &#039;viewport&#039;,&lt;br /&gt;
                    popperOptions: {&lt;br /&gt;
                        strategy: &#039;fixed&#039;,&lt;br /&gt;
                        modifiers: [&lt;br /&gt;
                            {&lt;br /&gt;
                                name: &#039;preventOverflow&#039;,&lt;br /&gt;
                                options: {&lt;br /&gt;
                                    boundary: &#039;viewport&#039;,&lt;br /&gt;
                                    padding: 20,&lt;br /&gt;
                                    altAxis: true,&lt;br /&gt;
                                    altBoundary: true&lt;br /&gt;
                                }&lt;br /&gt;
                            },&lt;br /&gt;
                            {&lt;br /&gt;
                                name: &#039;flip&#039;,&lt;br /&gt;
                                options: {&lt;br /&gt;
                                    fallbackPlacements: [&#039;bottom&#039;, &#039;left&#039;, &#039;right&#039;]&lt;br /&gt;
                                }&lt;br /&gt;
                            },&lt;br /&gt;
                            {&lt;br /&gt;
                                name: &#039;computeStyles&#039;,&lt;br /&gt;
                                options: { adaptive: false }&lt;br /&gt;
                            }&lt;br /&gt;
                        ]&lt;br /&gt;
                    },&lt;br /&gt;
                    onShow: function(instance) {&lt;br /&gt;
                        document.querySelectorAll(&#039;[data-tippy-root]&#039;).forEach(function(tooltip) {&lt;br /&gt;
                            if (tooltip._tippy &amp;amp;&amp;amp; tooltip._tippy !== instance) {&lt;br /&gt;
                                tooltip._tippy.hide();&lt;br /&gt;
                            }&lt;br /&gt;
                        });&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
    var DataTooltipsModule = {&lt;br /&gt;
        init: function() {&lt;br /&gt;
            var elements = document.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
            if (elements.length === 0) return;&lt;br /&gt;
            &lt;br /&gt;
            MediaWikiTooltips.load(function() {&lt;br /&gt;
                elements.forEach(function(element) {&lt;br /&gt;
                    var tooltipText = element.getAttribute(&#039;data-text&#039;);&lt;br /&gt;
                    if (!tooltipText || !tooltipText.trim()) return;&lt;br /&gt;
                    &lt;br /&gt;
                    tippy(element, {&lt;br /&gt;
                        content: tooltipText,&lt;br /&gt;
                        allowHTML: true,&lt;br /&gt;
                        interactive: false,&lt;br /&gt;
                        placement: &#039;top&#039;,&lt;br /&gt;
                        maxWidth: 300,&lt;br /&gt;
                        theme: &#039;data-tooltip-theme&#039;,&lt;br /&gt;
                        arrow: true,&lt;br /&gt;
                        duration: [200, 150],&lt;br /&gt;
                        delay: [0, 50]&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
                var shouldReinit = false;&lt;br /&gt;
                mutations.forEach(function(mutation) {&lt;br /&gt;
                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
                        if (node.nodeType === 1) {&lt;br /&gt;
                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;data-tooltip&#039;) &amp;amp;&amp;amp; node.hasAttribute(&#039;data-text&#039;)) {&lt;br /&gt;
                                shouldReinit = true;&lt;br /&gt;
                            } else if (node.querySelectorAll) {&lt;br /&gt;
                                var newElements = node.querySelectorAll(&#039;.data-tooltip[data-text]&#039;);&lt;br /&gt;
                                if (newElements.length &amp;gt; 0) {&lt;br /&gt;
                                    shouldReinit = true;&lt;br /&gt;
                                }&lt;br /&gt;
                            }&lt;br /&gt;
                        }&lt;br /&gt;
                    });&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                if (shouldReinit) {&lt;br /&gt;
                    setTimeout(function() { DataTooltipsModule.init(); }, 100);&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            observer.observe(document.body, {&lt;br /&gt;
                childList: true,&lt;br /&gt;
                subtree: true&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    &lt;br /&gt;
	var CopyTextModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        CopyTextModule.initDirectElements();&lt;br /&gt;
	        CopyTextModule.initAutoContainers();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initDirectElements: function() {&lt;br /&gt;
	        var elements = document.querySelectorAll(&#039;.copyable-text&#039;);&lt;br /&gt;
	        if (elements.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        elements.forEach(function(element) {&lt;br /&gt;
	            CopyTextModule.cleanPreContent(element);&lt;br /&gt;
	            CopyTextModule.setupElement(element);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    initAutoContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	        if (containers.length === 0) return;&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        // Наблюдатель за динамически появляющимися элементами&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        // Проверяем сам элемент&lt;br /&gt;
	                        if (node.tagName === &#039;PRE&#039;) {&lt;br /&gt;
	                            var container = node.closest(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            if (container &amp;amp;&amp;amp; !node.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                node.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                CopyTextModule.cleanPreContent(node);&lt;br /&gt;
	                                CopyTextModule.setupElement(node);&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                        // Проверяем дочерние элементы&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                            });&lt;br /&gt;
	                            &lt;br /&gt;
	                            // Также проверяем pre внутри уже существующих контейнеров&lt;br /&gt;
	                            var preElements = node.querySelectorAll(&#039;.copyable-pre-container pre&#039;);&lt;br /&gt;
	                            preElements.forEach(function(pre) {&lt;br /&gt;
	                                if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                                    pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                                    CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                                    CopyTextModule.setupElement(pre);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	                &lt;br /&gt;
	                // Обрабатываем изменения атрибутов (например, style=&amp;quot;display: none&amp;quot; -&amp;gt; &amp;quot;&amp;quot;)&lt;br /&gt;
	                if (mutation.type === &#039;attributes&#039; &amp;amp;&amp;amp; mutation.attributeName === &#039;style&#039;) {&lt;br /&gt;
	                    var target = mutation.target;&lt;br /&gt;
	                    if (target.style.display !== &#039;none&#039;) {&lt;br /&gt;
	                        var containers = target.querySelectorAll(&#039;.copyable-pre-container&#039;);&lt;br /&gt;
	                        containers.forEach(function(container) {&lt;br /&gt;
	                            CopyTextModule.processContainerPre(container);&lt;br /&gt;
	                        });&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true,&lt;br /&gt;
	            attributes: true,&lt;br /&gt;
	            attributeFilter: [&#039;style&#039;]&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processContainerPre: function(container) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        preElements.forEach(function(pre) {&lt;br /&gt;
	            if (!pre.classList.contains(&#039;copyable-text&#039;)) {&lt;br /&gt;
	                pre.classList.add(&#039;copyable-text&#039;);&lt;br /&gt;
	                CopyTextModule.cleanPreContent(pre);&lt;br /&gt;
	                CopyTextModule.setupElement(pre);&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		cleanPreContent: function(preElement) {&lt;br /&gt;
		    var text = preElement.textContent || preElement.innerText;&lt;br /&gt;
		    &lt;br /&gt;
		    var cleanedText = text.split(&#039;\n&#039;).map(function(line) {&lt;br /&gt;
		        return line.replace(/^\s*\|\s*/, &#039;&#039;);&lt;br /&gt;
		    }).join(&#039;\n&#039;);&lt;br /&gt;
&lt;br /&gt;
		    if (cleanedText !== text) {&lt;br /&gt;
		        preElement.textContent = cleanedText;&lt;br /&gt;
		    }&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    setupElement: function(element) {&lt;br /&gt;
	        element.style.cursor = &#039;pointer&#039;;&lt;br /&gt;
	        element.addEventListener(&#039;click&#039;, CopyTextModule.handleClick);&lt;br /&gt;
	        &lt;br /&gt;
	        var isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent) &amp;amp;&amp;amp; !window.MSStream;&lt;br /&gt;
	        if (isIOS) {&lt;br /&gt;
	            element.style.webkitUserSelect = &#039;text&#039;;&lt;br /&gt;
	            element.style.userSelect = &#039;text&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    handleClick: function(e) {&lt;br /&gt;
	        e.preventDefault();&lt;br /&gt;
	        &lt;br /&gt;
	        var element = this;&lt;br /&gt;
	        var textToCopy = element.textContent;&lt;br /&gt;
	        &lt;br /&gt;
	        if (navigator.clipboard &amp;amp;&amp;amp; window.isSecureContext) {&lt;br /&gt;
	            navigator.clipboard.writeText(textToCopy).then(function() {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            }).catch(function(err) {&lt;br /&gt;
	                console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	                CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	            });&lt;br /&gt;
	        } else {&lt;br /&gt;
	            CopyTextModule.fallbackCopy(textToCopy, element);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        element.classList.add(&#039;copying&#039;);&lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            element.classList.remove(&#039;copying&#039;);&lt;br /&gt;
	        }, 200);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    fallbackCopy: function(text, element) {&lt;br /&gt;
	        var textArea = document.createElement(&#039;textarea&#039;);&lt;br /&gt;
	        textArea.value = text;&lt;br /&gt;
	        textArea.style.position = &#039;fixed&#039;;&lt;br /&gt;
	        textArea.style.top = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.left = &#039;-9999px&#039;;&lt;br /&gt;
	        textArea.style.width = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.height = &#039;2em&#039;;&lt;br /&gt;
	        textArea.style.padding = &#039;0&#039;;&lt;br /&gt;
	        textArea.style.border = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.outline = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.boxShadow = &#039;none&#039;;&lt;br /&gt;
	        textArea.style.background = &#039;transparent&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.appendChild(textArea);&lt;br /&gt;
	        textArea.focus();&lt;br /&gt;
	        textArea.select();&lt;br /&gt;
	        &lt;br /&gt;
	        try {&lt;br /&gt;
	            var successful = document.execCommand(&#039;copy&#039;);&lt;br /&gt;
	            if (successful) {&lt;br /&gt;
	                CopyTextModule.showNotification(element);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                console.error(&#039;Не удалось скопировать текст&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	        } catch (err) {&lt;br /&gt;
	            console.error(&#039;Ошибка при копировании: &#039;, err);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        document.body.removeChild(textArea);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    showNotification: function(element) {&lt;br /&gt;
	        var existingNotifications = document.querySelectorAll(&#039;.copy-notification&#039;);&lt;br /&gt;
	        existingNotifications.forEach(function(notification) {&lt;br /&gt;
	            notification.remove();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        var notification = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        notification.className = &#039;copy-notification&#039;;&lt;br /&gt;
	        notification.textContent = &#039;Текст скопирован!&#039;;&lt;br /&gt;
	        document.body.appendChild(notification);&lt;br /&gt;
	        &lt;br /&gt;
	        var rect = element.getBoundingClientRect();&lt;br /&gt;
	        var isMobile = window.innerWidth &amp;lt;= 768;&lt;br /&gt;
	        &lt;br /&gt;
	        if (isMobile) {&lt;br /&gt;
	            notification.style.position = &#039;fixed&#039;;&lt;br /&gt;
	            notification.style.top = &#039;20px&#039;;&lt;br /&gt;
	            notification.style.left = &#039;50%&#039;;&lt;br /&gt;
	            notification.style.transform = &#039;translateX(-50%) translateY(-10px)&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;10000&#039;;&lt;br /&gt;
	        } else {&lt;br /&gt;
	            notification.style.position = &#039;absolute&#039;;&lt;br /&gt;
	            notification.style.top = (rect.top + window.scrollY - 40) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.left = (rect.left + window.scrollX) + &#039;px&#039;;&lt;br /&gt;
	            notification.style.zIndex = &#039;9999&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.add(&#039;show&#039;);&lt;br /&gt;
	        }, 10);&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            notification.classList.remove(&#039;show&#039;);&lt;br /&gt;
	            setTimeout(function() {&lt;br /&gt;
	                if (notification.parentNode) {&lt;br /&gt;
	                    notification.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	            }, 300);&lt;br /&gt;
	        }, 2000);&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
    &lt;br /&gt;
	var DocumentAutoFillModule = {&lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.processExistingContainers();&lt;br /&gt;
	        this.observeNewContainers();&lt;br /&gt;
	        this.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    processExistingContainers: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            this.setupAutoFillContainer(container);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setupAutoFillContainer: function(container) {&lt;br /&gt;
	        if (container.querySelector(&#039;.document-fields-container&#039;)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fieldsContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldsContainer.className = &#039;document-fields-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var gridContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        gridContainer.className = &#039;fields-grid&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumberField = this.createField(&#039;site-number&#039;, &#039;Номер участка:&#039;, &#039;Введите номер участка...&#039;, false);&lt;br /&gt;
	        var authorField = this.createField(&#039;author&#039;, &#039;Автор документа:&#039;, &#039;Введите ваше имя...&#039;, true);&lt;br /&gt;
	        var positionField = this.createField(&#039;position&#039;, &#039;Должность:&#039;, &#039;Введите вашу должность...&#039;, true);&lt;br /&gt;
	        var signatureField = this.createField(&#039;signature&#039;, &#039;Подпись:&#039;, &#039;Введите подпись...&#039;, true);&lt;br /&gt;
	        &lt;br /&gt;
	        gridContainer.appendChild(siteNumberField.container);&lt;br /&gt;
	        gridContainer.appendChild(authorField.container);&lt;br /&gt;
	        gridContainer.appendChild(positionField.container);&lt;br /&gt;
	        gridContainer.appendChild(signatureField.container);&lt;br /&gt;
	        &lt;br /&gt;
	        fieldsContainer.appendChild(gridContainer);&lt;br /&gt;
	        &lt;br /&gt;
	        if (container.firstChild) {&lt;br /&gt;
	            container.insertBefore(fieldsContainer, container.firstChild);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            container.appendChild(fieldsContainer);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        setTimeout(function() {&lt;br /&gt;
	            this.applyAllFieldsToContainer(container);&lt;br /&gt;
	        }.bind(this), 100);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createField: function(fieldType, labelText, placeholder, shouldCache) {&lt;br /&gt;
	        var fieldContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
	        fieldContainer.className = &#039;field-container&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var label = document.createElement(&#039;label&#039;);&lt;br /&gt;
	        label.textContent = labelText;&lt;br /&gt;
	        label.htmlFor = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        var input = document.createElement(&#039;input&#039;);&lt;br /&gt;
	        input.type = &#039;text&#039;;&lt;br /&gt;
	        input.id = fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.className = &#039;field-input &#039; + fieldType + &#039;-input&#039;;&lt;br /&gt;
	        input.placeholder = placeholder;&lt;br /&gt;
	        &lt;br /&gt;
	        if (shouldCache) {&lt;br /&gt;
	            var savedValue = localStorage.getItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType));&lt;br /&gt;
	            if (savedValue) {&lt;br /&gt;
	                input.value = savedValue;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        input.addEventListener(&#039;input&#039;, function() {&lt;br /&gt;
	            var value = input.value.trim();&lt;br /&gt;
	            if (shouldCache) {&lt;br /&gt;
	                localStorage.setItem(&#039;document&#039; + this.capitalizeFirstLetter(fieldType), value);&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        fieldContainer.appendChild(label);&lt;br /&gt;
	        fieldContainer.appendChild(input);&lt;br /&gt;
	        &lt;br /&gt;
	        return {&lt;br /&gt;
	            container: fieldContainer,&lt;br /&gt;
	            input: input,&lt;br /&gt;
	            type: fieldType,&lt;br /&gt;
	            shouldCache: shouldCache&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    capitalizeFirstLetter: function(string) {&lt;br /&gt;
	        return string.charAt(0).toUpperCase() + string.slice(1);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyAllFieldsToContainer: function(container) {&lt;br /&gt;
	        var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	        if (!fieldsContainer) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var siteNumber = fieldsContainer.querySelector(&#039;.site-number-input&#039;).value.trim();&lt;br /&gt;
	        var author = fieldsContainer.querySelector(&#039;.author-input&#039;).value.trim();&lt;br /&gt;
	        var position = fieldsContainer.querySelector(&#039;.position-input&#039;).value.trim();&lt;br /&gt;
	        var signature = fieldsContainer.querySelector(&#039;.signature-input&#039;).value.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        this.autoFillAllDocumentsInContainer(container, {&lt;br /&gt;
	            siteNumber: siteNumber,&lt;br /&gt;
	            author: author,&lt;br /&gt;
	            position: position,&lt;br /&gt;
	            signature: signature&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillAllDocumentsInContainer: function(container, fields) {&lt;br /&gt;
	        var preElements = container.querySelectorAll(&#039;pre&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        preElements.forEach(function(preElement) {&lt;br /&gt;
	            this.autoFillDocument(preElement, fields);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    autoFillDocument: function(preElement, fields) {&lt;br /&gt;
	        if (!preElement) return;&lt;br /&gt;
	        &lt;br /&gt;
	        var originalContent = preElement.textContent || preElement.innerText;&lt;br /&gt;
	        &lt;br /&gt;
	        if (!this.isDocumentTemplate(originalContent)) {&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var updatedContent = this.fillDocumentContent(originalContent, fields);&lt;br /&gt;
	        &lt;br /&gt;
	        if (updatedContent !== originalContent) {&lt;br /&gt;
	            preElement.textContent = updatedContent;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isDocumentTemplate: function(text) {&lt;br /&gt;
	        return text.includes(&#039;SCP&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	               text.includes(&#039;Обезопасить. Удержать. Сохранить.&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Автор документа:&#039;) &amp;amp;&amp;amp;&lt;br /&gt;
	               text.includes(&#039;Дата и время:&#039;);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
		fillDocumentContent: function(content, fields) {&lt;br /&gt;
		    var currentDateTime = this.getCurrentDateTime();&lt;br /&gt;
		    &lt;br /&gt;
		    content = content.replace(&lt;br /&gt;
		        /(\[bold\]Дата и время:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		        &#039;$1 &#039; + currentDateTime&lt;br /&gt;
		    );&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.siteNumber) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /Участок-([^|\n\[\]]*)/g, &lt;br /&gt;
		            &#039;Участок-&#039; + fields.siteNumber + &#039; &#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.author) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.author&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Автор документа:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.position) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.position&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Должность:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    if (fields.signature) {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])[^\n]*/g, &lt;br /&gt;
		            &#039;$1 &#039; + fields.signature&lt;br /&gt;
		        );&lt;br /&gt;
		    } else {&lt;br /&gt;
		        content = content.replace(&lt;br /&gt;
		            /(\[bold\]Подпись:\[\/bold\])([^\n]*)/g, &lt;br /&gt;
		            &#039;$1_____&#039;&lt;br /&gt;
		        );&lt;br /&gt;
		    }&lt;br /&gt;
		    &lt;br /&gt;
		    return content;&lt;br /&gt;
		},&lt;br /&gt;
	    &lt;br /&gt;
	    getCurrentDateTime: function() {&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        &lt;br /&gt;
	        var day = String(now.getDate()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var month = String(now.getMonth() + 1).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var year = now.getFullYear();&lt;br /&gt;
	        &lt;br /&gt;
	        var hours = String(now.getHours()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        var minutes = String(now.getMinutes()).padStart(2, &#039;0&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        return hours + &#039;:&#039; + minutes + &#039;, &#039; + day + &#039;.&#039; + month + &#039;.&#039; + year;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdateTimer: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        function updateTimeIfNeeded() {&lt;br /&gt;
	            var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            if (containers.length &amp;gt; 0) {&lt;br /&gt;
	                containers.forEach(function(container) {&lt;br /&gt;
	                    var fieldsContainer = container.querySelector(&#039;.document-fields-container&#039;);&lt;br /&gt;
	                    if (fieldsContainer) {&lt;br /&gt;
	                        self.applyAllFieldsToContainer(container);&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.timeUpdateInterval = setInterval(updateTimeIfNeeded, 5000);&lt;br /&gt;
	        &lt;br /&gt;
	        document.addEventListener(&#039;visibilitychange&#039;, function() {&lt;br /&gt;
	            if (!document.hidden) {&lt;br /&gt;
	                updateTimeIfNeeded();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.addEventListener(&#039;focus&#039;, updateTimeIfNeeded);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdateTimer: function() {&lt;br /&gt;
	        if (this.timeUpdateInterval) {&lt;br /&gt;
	            clearInterval(this.timeUpdateInterval);&lt;br /&gt;
	            this.timeUpdateInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    observeNewContainers: function() {&lt;br /&gt;
	        var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	            mutations.forEach(function(mutation) {&lt;br /&gt;
	                mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                    if (node.nodeType === 1) {&lt;br /&gt;
	                        if (node.classList &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;copyable-pre-container&#039;) &amp;amp;&amp;amp; &lt;br /&gt;
	                            node.classList.contains(&#039;auto-fill-enabled&#039;)) {&lt;br /&gt;
	                            setTimeout(function() {&lt;br /&gt;
	                                DocumentAutoFillModule.setupAutoFillContainer(node);&lt;br /&gt;
	                            }, 100);&lt;br /&gt;
	                        }&lt;br /&gt;
	                        else if (node.querySelectorAll) {&lt;br /&gt;
	                            var containers = node.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	                            containers.forEach(function(container) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    DocumentAutoFillModule.setupAutoFillContainer(container);&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            });&lt;br /&gt;
	                        }&lt;br /&gt;
	                    }&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        observer.observe(document.body, {&lt;br /&gt;
	            childList: true,&lt;br /&gt;
	            subtree: true&lt;br /&gt;
	        });&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.DocumentAutoFill = {&lt;br /&gt;
	    refreshAll: function() {&lt;br /&gt;
	        var containers = document.querySelectorAll(&#039;.copyable-pre-container.auto-fill-enabled&#039;);&lt;br /&gt;
	        containers.forEach(function(container) {&lt;br /&gt;
	            DocumentAutoFillModule.applyAllFieldsToContainer(container);&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearAllNames: function() {&lt;br /&gt;
	        localStorage.removeItem(&#039;documentAuthor&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentPosition&#039;);&lt;br /&gt;
	        localStorage.removeItem(&#039;documentSignature&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var inputs = document.querySelectorAll(&#039;.author-input, .position-input, .signature-input&#039;);&lt;br /&gt;
	        inputs.forEach(function(input) {&lt;br /&gt;
	            input.value = &#039;&#039;;&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        window.DocumentAutoFill.refreshAll();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.startTimeUpdateTimer();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopTimeUpdates: function() {&lt;br /&gt;
	        DocumentAutoFillModule.stopTimeUpdateTimer();&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	var LawCalculatorModule = {&lt;br /&gt;
	    isCalculatorMode: false,&lt;br /&gt;
	    selectedViolations: [],&lt;br /&gt;
	    lawData: {},&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.extractLawData();&lt;br /&gt;
	        this.createModeToggle();&lt;br /&gt;
	        this.observeTables();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawData: function() {&lt;br /&gt;
	        // Используем данные из существующего LawTooltipsModule&lt;br /&gt;
	        if (window.LawTooltipsModule &amp;amp;&amp;amp; window.LawTooltipsModule.extractLawData) {&lt;br /&gt;
	            this.lawData = window.LawTooltipsModule.extractLawData();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Fallback - извлекаем данные самостоятельно&lt;br /&gt;
	            this.lawData = this.extractLawDataFallback();&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Добавляем информацию о категориях и сроках&lt;br /&gt;
	        this.addCategoryInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractLawDataFallback: function() {&lt;br /&gt;
	        var lawData = {};&lt;br /&gt;
	        var detailTables = document.querySelectorAll(&#039;.mw-collapsible-content table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        detailTables.forEach(function(table) {&lt;br /&gt;
	            var rows = table.querySelectorAll(&#039;tr&#039;);&lt;br /&gt;
	            &lt;br /&gt;
	            rows.forEach(function(row) {&lt;br /&gt;
	                var cells = row.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	                if (cells.length &amp;lt; 3) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var crimeCell = cells[0];&lt;br /&gt;
	                var anchor = crimeCell.querySelector(&#039;[id]&#039;);&lt;br /&gt;
	                if (!anchor) return;&lt;br /&gt;
	                &lt;br /&gt;
	                var lawCode = anchor.id;&lt;br /&gt;
	                var titleElement = crimeCell.querySelector(&#039;b&#039;);&lt;br /&gt;
	                &lt;br /&gt;
	                if (titleElement &amp;amp;&amp;amp; lawCode.match(/^\d{3}$/)) {&lt;br /&gt;
	                    var titleText = titleElement.textContent.trim();&lt;br /&gt;
	                    var lawTitle = titleText.replace(/^\d{3}\s*/, &#039;&#039;).replace(/^\d{3}/, &#039;&#039;).trim();&lt;br /&gt;
	                    var description = cells[1].innerHTML.trim();&lt;br /&gt;
	                    &lt;br /&gt;
	                    var examples = [];&lt;br /&gt;
	                    var exampleItems = cells[2].querySelectorAll(&#039;li&#039;);&lt;br /&gt;
	                    exampleItems.forEach(function(item) {&lt;br /&gt;
	                        var html = item.innerHTML.trim();&lt;br /&gt;
	                        html = html.replace(/&amp;lt;br\s*\/?&amp;gt;/gi, &#039;&#039;);&lt;br /&gt;
	                        if (html) examples.push(html);&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    lawData[lawCode] = {&lt;br /&gt;
	                        title: lawTitle,&lt;br /&gt;
	                        description: description,&lt;br /&gt;
	                        examples: examples&lt;br /&gt;
	                    };&lt;br /&gt;
	                }&lt;br /&gt;
	            });&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return lawData;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addCategoryInfo: function() {&lt;br /&gt;
	        // Определяем тип страницы и извлекаем информацию о наказаниях&lt;br /&gt;
	        this.pageType = this.detectPageType();&lt;br /&gt;
	        this.extractPunishmentInfo();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    detectPageType: function() {&lt;br /&gt;
	        // Проверяем заголовки страницы для определения типа&lt;br /&gt;
	        var pageTitle = document.title.toLowerCase();&lt;br /&gt;
	        var headings = document.querySelectorAll(&#039;h1, h2, h3&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        for (var i = 0; i &amp;lt; headings.length; i++) {&lt;br /&gt;
	            var headingText = headings[i].textContent.toLowerCase();&lt;br /&gt;
	            if (headingText.includes(&#039;д-класс&#039;) || headingText.includes(&#039;d-class&#039;)) {&lt;br /&gt;
	                return &#039;d-class&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	            if (headingText.includes(&#039;персонал&#039;) || headingText.includes(&#039;сотрудник&#039;)) {&lt;br /&gt;
	                return &#039;personnel&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем по URL или другим признакам&lt;br /&gt;
	        if (window.location.href.toLowerCase().includes(&#039;d-class&#039;) || &lt;br /&gt;
	            window.location.href.toLowerCase().includes(&#039;д-класс&#039;)) {&lt;br /&gt;
	            return &#039;d-class&#039;;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return &#039;personnel&#039;; // По умолчанию&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    extractPunishmentInfo: function() {&lt;br /&gt;
	        // Извлекаем информацию о наказаниях из текста на странице&lt;br /&gt;
	        var punishmentSections = document.querySelectorAll(&#039;.mw-collapsible-content p&#039;);&lt;br /&gt;
	        var categories = {};&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Найдено секций с наказаниями:&#039;, punishmentSections.length);&lt;br /&gt;
	        console.log(&#039;LawCalculator: Тип страницы:&#039;, this.pageType);&lt;br /&gt;
	        &lt;br /&gt;
	        punishmentSections.forEach(function(section) {&lt;br /&gt;
	            var text = section.textContent;&lt;br /&gt;
	            var punishmentMatch = text.match(/Наказание[:\s]*(.+?)(?:\n|$)/i);&lt;br /&gt;
	            &lt;br /&gt;
	            if (punishmentMatch) {&lt;br /&gt;
	                var punishmentText = punishmentMatch[1].trim();&lt;br /&gt;
	                console.log(&#039;LawCalculator: Найдено наказание:&#039;, punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                var categoryInfo = this.parsePunishmentText(punishmentText);&lt;br /&gt;
	                &lt;br /&gt;
	                if (categoryInfo) {&lt;br /&gt;
	                    // Находим соответствующую категорию по цвету или другим признакам&lt;br /&gt;
	                    var categoryKey = this.findCategoryByContext(section);&lt;br /&gt;
	                    if (categoryKey) {&lt;br /&gt;
	                        categories[categoryKey] = categoryInfo;&lt;br /&gt;
	                        console.log(&#039;LawCalculator: Применено к категории:&#039;, categoryKey, categoryInfo);&lt;br /&gt;
	                    }&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	        &lt;br /&gt;
	        console.log(&#039;LawCalculator: Итоговые категории:&#039;, categories);&lt;br /&gt;
	        &lt;br /&gt;
	        // Применяем найденную информацию к законам&lt;br /&gt;
	        this.applyCategoryInfo(categories);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePunishmentText: function(text) {&lt;br /&gt;
	        // Парсим текст наказания&lt;br /&gt;
	        var originalText = text;&lt;br /&gt;
	        text = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем на критические нарушения&lt;br /&gt;
	        if (text.includes(&#039;д-класс&#039;) || text.includes(&#039;казнь&#039;) || text.includes(&#039;перевод&#039;)) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: true,&lt;br /&gt;
	                punishment: originalText.trim()&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для Д-класса ищем штрафы&lt;br /&gt;
	        if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	            return this.parseDClassPunishment(originalText);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Для персонала ищем временные рамки&lt;br /&gt;
	        return this.parsePersonnelPunishment(originalText);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parseDClassPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для Д-класса (штрафы, дополнительные наказания)&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем штрафы в кредитах&lt;br /&gt;
	        var creditMatch = text.match(/(\d+[\s,.]?\d*)\s*кредит/);&lt;br /&gt;
	        if (creditMatch) {&lt;br /&gt;
	            var amount = creditMatch[1].replace(/[\s,]/g, &#039;&#039;);&lt;br /&gt;
	            return {&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: &#039;Штраф &#039; + amount + &#039; кредитов&#039;,&lt;br /&gt;
	                fine: parseInt(amount)&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные наказания для Д-класса&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: timeMatch[1] + &#039;-&#039; + timeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: rangeMatch[1] + &#039;-&#039; + rangeMatch[2] + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false,&lt;br /&gt;
	                punishment: time + &#039; минут&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Если не нашли конкретные наказания, возвращаем текст как есть&lt;br /&gt;
	        return {&lt;br /&gt;
	            isCritical: false,&lt;br /&gt;
	            punishment: text.trim()&lt;br /&gt;
	        };&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    parsePersonnelPunishment: function(text) {&lt;br /&gt;
	        // Парсим наказания для персонала&lt;br /&gt;
	        var lowerText = text.toLowerCase();&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем временные рамки&lt;br /&gt;
	        var timeMatch = text.match(/(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (timeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(timeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(timeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем диапазон времени&lt;br /&gt;
	        var rangeMatch = text.match(/от\s*(\d+)\s*до\s*(\d+)\s*минут/);&lt;br /&gt;
	        if (rangeMatch) {&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: parseInt(rangeMatch[1]),&lt;br /&gt;
	                maxTime: parseInt(rangeMatch[2]),&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        // Ищем фиксированное время&lt;br /&gt;
	        var fixedMatch = text.match(/(\d+)\s*минут/);&lt;br /&gt;
	        if (fixedMatch) {&lt;br /&gt;
	            var time = parseInt(fixedMatch[1]);&lt;br /&gt;
	            return {&lt;br /&gt;
	                minTime: time,&lt;br /&gt;
	                maxTime: time,&lt;br /&gt;
	                isCritical: false&lt;br /&gt;
	            };&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    findCategoryByContext: function(section) {&lt;br /&gt;
	        // Находим категорию по контексту (заголовок секции)&lt;br /&gt;
	        var collapsible = section.closest(&#039;.mw-collapsible&#039;);&lt;br /&gt;
	        if (!collapsible) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var toggle = collapsible.querySelector(&#039;.mw-collapsible-toggle&#039;);&lt;br /&gt;
	        if (!toggle) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var titleElement = toggle.querySelector(&#039;.рамка-название&#039;);&lt;br /&gt;
	        if (!titleElement) return null;&lt;br /&gt;
	        &lt;br /&gt;
	        var title = titleElement.textContent.trim();&lt;br /&gt;
	        &lt;br /&gt;
	        // Определяем диапазон статей по заголовку&lt;br /&gt;
	        if (title.includes(&#039;Лёгкие&#039;)) return &#039;100-109&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Средние&#039;)) return &#039;200-211&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Тяжкие&#039;) &amp;amp;&amp;amp; !title.includes(&#039;Особо&#039;)) return &#039;300-311&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Особо тяжкие&#039;)) return &#039;400-411&#039;;&lt;br /&gt;
	        if (title.includes(&#039;Критические&#039;)) return &#039;500-511&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    applyCategoryInfo: function(categories) {&lt;br /&gt;
	        // Применяем информацию о категориях к законам&lt;br /&gt;
	        Object.keys(this.lawData).forEach(function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            var categoryKey = null;&lt;br /&gt;
	            &lt;br /&gt;
	            // Определяем категорию по номеру статьи&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) categoryKey = &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) categoryKey = &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) categoryKey = &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) categoryKey = &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) categoryKey = &#039;500-511&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            if (categoryKey &amp;amp;&amp;amp; categories[categoryKey]) {&lt;br /&gt;
	                this.lawData[lawCode].category = categories[categoryKey];&lt;br /&gt;
	            }&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createModeToggle: function() {&lt;br /&gt;
	        var tables = document.querySelectorAll(&#039;.citizen-table-wrapper table&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        tables.forEach(function(table) {&lt;br /&gt;
	            var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	            if (!wrapper || wrapper.querySelector(&#039;.law-mode-toggle&#039;)) return;&lt;br /&gt;
	            &lt;br /&gt;
            var toggleContainer = document.createElement(&#039;div&#039;);&lt;br /&gt;
            toggleContainer.className = &#039;law-mode-toggle&#039;;&lt;br /&gt;
            toggleContainer.innerHTML = &lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;mode-toggle-buttons&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn active&amp;quot; data-mode=&amp;quot;navigation&amp;quot;&amp;gt;Навигация&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                    &#039;&amp;lt;button class=&amp;quot;mode-btn&amp;quot; data-mode=&amp;quot;calculator&amp;quot;&amp;gt;Калькулятор&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            wrapper.appendChild(toggleContainer);&lt;br /&gt;
	            &lt;br /&gt;
	            // Добавляем стили&lt;br /&gt;
	            this.addToggleStyles();&lt;br /&gt;
	            &lt;br /&gt;
	            // Обработчики событий&lt;br /&gt;
	            var buttons = toggleContainer.querySelectorAll(&#039;.mode-btn&#039;);&lt;br /&gt;
	            buttons.forEach(function(btn) {&lt;br /&gt;
	                btn.addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                    buttons.forEach(function(b) { b.classList.remove(&#039;active&#039;); });&lt;br /&gt;
	                    this.classList.add(&#039;active&#039;);&lt;br /&gt;
	                    &lt;br /&gt;
	                    var mode = this.dataset.mode;&lt;br /&gt;
	                    LawCalculatorModule.setMode(mode, table);&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    addToggleStyles: function() {&lt;br /&gt;
	        if (document.getElementById(&#039;law-calculator-styles&#039;)) return;&lt;br /&gt;
	        &lt;br /&gt;
        var style = document.createElement(&#039;style&#039;);&lt;br /&gt;
        style.id = &#039;law-calculator-styles&#039;;&lt;br /&gt;
        style.textContent = &lt;br /&gt;
            &#039;.law-mode-toggle {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
                &#039;text-align: center;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-toggle-buttons {&#039; +&lt;br /&gt;
                &#039;display: inline-flex;&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 2px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: none;&#039; +&lt;br /&gt;
                &#039;background: transparent;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
                &#039;transition: all 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn.active {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.mode-btn:hover:not(.active) {&#039; +&lt;br /&gt;
                &#039;background: #e0e0e0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 15px;&#039; +&lt;br /&gt;
                &#039;background: #f9f9f9;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ddd;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;display: none;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-interface.active {&#039; +&lt;br /&gt;
                &#039;display: block;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.selected-violations {&#039; +&lt;br /&gt;
                &#039;margin: 10px 0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item {&#039; +&lt;br /&gt;
                &#039;display: inline-block;&#039; +&lt;br /&gt;
                &#039;margin: 5px;&#039; +&lt;br /&gt;
                &#039;padding: 5px 10px;&#039; +&lt;br /&gt;
                &#039;background: #e3f2fd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #2196f3;&#039; +&lt;br /&gt;
                &#039;border-radius: 15px;&#039; +&lt;br /&gt;
                &#039;font-size: 12px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.violation-item .remove-btn {&#039; +&lt;br /&gt;
                &#039;margin-left: 5px;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;color: #f44336;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result {&#039; +&lt;br /&gt;
                &#039;margin-top: 15px;&#039; +&lt;br /&gt;
                &#039;padding: 10px;&#039; +&lt;br /&gt;
                &#039;background: #fff3cd;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ffeaa7;&#039; +&lt;br /&gt;
                &#039;border-radius: 5px;&#039; +&lt;br /&gt;
                &#039;font-weight: bold;&#039; +&lt;br /&gt;
                &#039;white-space: pre-line;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculation-result.critical {&#039; +&lt;br /&gt;
                &#039;background: #f8d7da;&#039; +&lt;br /&gt;
                &#039;border-color: #f5c6cb;&#039; +&lt;br /&gt;
                &#039;color: #721c24;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator {&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;transition: background-color 0.2s;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator:hover {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.1) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.law-cell-calculator.selected {&#039; +&lt;br /&gt;
                &#039;background-color: rgba(0, 124, 186, 0.3) !important;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions {&#039; +&lt;br /&gt;
                &#039;margin-top: 10px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button {&#039; +&lt;br /&gt;
                &#039;padding: 8px 16px;&#039; +&lt;br /&gt;
                &#039;border: 1px solid #ccc;&#039; +&lt;br /&gt;
                &#039;background: white;&#039; +&lt;br /&gt;
                &#039;cursor: pointer;&#039; +&lt;br /&gt;
                &#039;border-radius: 3px;&#039; +&lt;br /&gt;
                &#039;font-size: 14px;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions button:hover {&#039; +&lt;br /&gt;
                &#039;background: #f0f0f0;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn {&#039; +&lt;br /&gt;
                &#039;background: #007cba;&#039; +&lt;br /&gt;
                &#039;color: white;&#039; +&lt;br /&gt;
                &#039;border-color: #007cba;&#039; +&lt;br /&gt;
            &#039;}&#039; +&lt;br /&gt;
            &#039;.calculator-actions .calculate-btn:hover {&#039; +&lt;br /&gt;
                &#039;background: #005a87;&#039; +&lt;br /&gt;
            &#039;}&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    setMode: function(mode, table) {&lt;br /&gt;
	        this.isCalculatorMode = (mode === &#039;calculator&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        var wrapper = table.closest(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	        var calculatorInterface = wrapper.querySelector(&#039;.calculator-interface&#039;);&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.isCalculatorMode) {&lt;br /&gt;
	            if (!calculatorInterface) {&lt;br /&gt;
	                calculatorInterface = this.createCalculatorInterface();&lt;br /&gt;
	                wrapper.appendChild(calculatorInterface);&lt;br /&gt;
	            }&lt;br /&gt;
	            calculatorInterface.classList.add(&#039;active&#039;);&lt;br /&gt;
	            this.makeTableInteractive(table);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (calculatorInterface) {&lt;br /&gt;
	                calculatorInterface.classList.remove(&#039;active&#039;);&lt;br /&gt;
	            }&lt;br /&gt;
	            this.makeTableNormal(table);&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    createCalculatorInterface: function() {&lt;br /&gt;
        var calculatorInterface = document.createElement(&#039;div&#039;);&lt;br /&gt;
        calculatorInterface.className = &#039;calculator-interface&#039;;&lt;br /&gt;
        calculatorInterface.innerHTML = &lt;br /&gt;
            &#039;&amp;lt;h4&amp;gt;Калькулятор сроков заключения&amp;lt;/h4&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;p&amp;gt;Выберите нарушения, кликая по статьям в таблице выше:&amp;lt;/p&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;selected-violations&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;div class=&amp;quot;violations-list&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculation-result&amp;quot; style=&amp;quot;display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;div class=&amp;quot;calculator-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;clear-btn&amp;quot; style=&amp;quot;margin-right: 10px;&amp;quot;&amp;gt;Очистить&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
                &#039;&amp;lt;button class=&amp;quot;calculate-btn&amp;quot;&amp;gt;Рассчитать&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
            &#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        // Обработчики событий&lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.clear-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.clearSelection();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        calculatorInterface.querySelector(&#039;.calculate-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	            LawCalculatorModule.calculateSentence();&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        return calculatorInterface;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableInteractive: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;td&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            var link = cell.querySelector(&#039;a[href*=&amp;quot;#&amp;quot;]&#039;);&lt;br /&gt;
	            if (!link) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var href = link.getAttribute(&#039;href&#039;);&lt;br /&gt;
	            var match = href.match(/#(\d{3})/);&lt;br /&gt;
	            if (!match) return;&lt;br /&gt;
	            &lt;br /&gt;
	            var lawCode = match[1];&lt;br /&gt;
	            if (!this.lawData[lawCode]) return;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.classList.add(&#039;law-cell-calculator&#039;);&lt;br /&gt;
	            cell.dataset.lawCode = lawCode;&lt;br /&gt;
	            &lt;br /&gt;
	            // Сохраняем оригинальный обработчик клика&lt;br /&gt;
	            var originalClickHandler = cell.onclick;&lt;br /&gt;
	            &lt;br /&gt;
	            cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                e.preventDefault();&lt;br /&gt;
	                e.stopPropagation();&lt;br /&gt;
	                LawCalculatorModule.toggleViolation(lawCode, cell);&lt;br /&gt;
	            });&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    makeTableNormal: function(table) {&lt;br /&gt;
	        var cells = table.querySelectorAll(&#039;.law-cell-calculator&#039;);&lt;br /&gt;
	        cells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;law-cell-calculator&#039;, &#039;selected&#039;);&lt;br /&gt;
	            // Восстанавливаем оригинальную функциональность навигации&lt;br /&gt;
	            var lawCode = cell.dataset.lawCode;&lt;br /&gt;
	            if (lawCode) {&lt;br /&gt;
	                cell.addEventListener(&#039;click&#039;, function(e) {&lt;br /&gt;
	                    e.preventDefault();&lt;br /&gt;
	                    window.location.hash = lawCode;&lt;br /&gt;
	                });&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleViolation: function(lawCode, cell) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        &lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            // Убираем нарушение&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        } else {&lt;br /&gt;
	            // Добавляем нарушение&lt;br /&gt;
	            this.selectedViolations.push(lawCode);&lt;br /&gt;
	            cell.classList.add(&#039;selected&#039;);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    updateViolationsList: function() {&lt;br /&gt;
	        var violationsList = document.querySelector(&#039;.violations-list&#039;);&lt;br /&gt;
	        if (!violationsList) return;&lt;br /&gt;
	        &lt;br /&gt;
	        violationsList.innerHTML = &#039;&#039;;&lt;br /&gt;
	        &lt;br /&gt;
	        this.selectedViolations.forEach(function(lawCode) {&lt;br /&gt;
	            var law = this.lawData[lawCode];&lt;br /&gt;
	            if (!law) return;&lt;br /&gt;
	            &lt;br /&gt;
            var item = document.createElement(&#039;div&#039;);&lt;br /&gt;
            item.className = &#039;violation-item&#039;;&lt;br /&gt;
            item.innerHTML = &lt;br /&gt;
                lawCode + &#039; - &#039; + law.title +&lt;br /&gt;
                &#039;&amp;lt;span class=&amp;quot;remove-btn&amp;quot; data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;&amp;gt;×&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            item.querySelector(&#039;.remove-btn&#039;).addEventListener(&#039;click&#039;, function() {&lt;br /&gt;
	                LawCalculatorModule.removeViolation(lawCode);&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            violationsList.appendChild(item);&lt;br /&gt;
	        }.bind(this));&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    removeViolation: function(lawCode) {&lt;br /&gt;
	        var index = this.selectedViolations.indexOf(lawCode);&lt;br /&gt;
	        if (index &amp;gt; -1) {&lt;br /&gt;
	            this.selectedViolations.splice(index, 1);&lt;br /&gt;
	            &lt;br /&gt;
            // Убираем выделение с ячейки&lt;br /&gt;
            var cell = document.querySelector(&#039;[data-law-code=&amp;quot;&#039; + lawCode + &#039;&amp;quot;]&#039;);&lt;br /&gt;
            if (cell) {&lt;br /&gt;
                cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
            }&lt;br /&gt;
	            &lt;br /&gt;
	            this.updateViolationsList();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    clearSelection: function() {&lt;br /&gt;
	        this.selectedViolations = [];&lt;br /&gt;
	        &lt;br /&gt;
	        // Убираем выделение со всех ячеек&lt;br /&gt;
	        var selectedCells = document.querySelectorAll(&#039;.law-cell-calculator.selected&#039;);&lt;br /&gt;
	        selectedCells.forEach(function(cell) {&lt;br /&gt;
	            cell.classList.remove(&#039;selected&#039;);&lt;br /&gt;
	        });&lt;br /&gt;
	        &lt;br /&gt;
	        this.updateViolationsList();&lt;br /&gt;
	        this.hideResult();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    calculateSentence: function() {&lt;br /&gt;
	        if (this.selectedViolations.length === 0) {&lt;br /&gt;
	            alert(&#039;Выберите хотя бы одно нарушение&#039;);&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	            var result = this.calculateSentenceLogic(this.selectedViolations);&lt;br /&gt;
	            this.showResult(result);&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        calculateSentenceLogic: function(violations) {&lt;br /&gt;
	            // Группируем нарушения по категориям&lt;br /&gt;
	            var categories = {};&lt;br /&gt;
	            &lt;br /&gt;
	            violations.forEach(function(lawCode) {&lt;br /&gt;
	                var law = this.lawData[lawCode];&lt;br /&gt;
	                if (!law || !law.category) return;&lt;br /&gt;
	                &lt;br /&gt;
	                // Используем номер статьи как ключ категории&lt;br /&gt;
	                var categoryKey = this.getCategoryKeyByLawCode(lawCode);&lt;br /&gt;
	                if (!categories[categoryKey]) {&lt;br /&gt;
	                    categories[categoryKey] = [];&lt;br /&gt;
	                }&lt;br /&gt;
	                categories[categoryKey].push(law);&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            var totalMinTime = 0;&lt;br /&gt;
	            var totalMaxTime = 0;&lt;br /&gt;
	            var totalFine = 0;&lt;br /&gt;
	            var hasCritical = false;&lt;br /&gt;
	            var resultText = &#039;&#039;;&lt;br /&gt;
	            &lt;br /&gt;
	            // Обрабатываем каждую категорию&lt;br /&gt;
	            Object.keys(categories).forEach(function(categoryKey) {&lt;br /&gt;
	                var laws = categories[categoryKey];&lt;br /&gt;
	                var category = laws[0].category;&lt;br /&gt;
	                var categoryName = this.getCategoryName(categoryKey);&lt;br /&gt;
	                &lt;br /&gt;
                if (category.isCritical) {&lt;br /&gt;
                    hasCritical = true;&lt;br /&gt;
                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + (category.punishment || &#039;Перевод в Д-класс/казнь&#039;) + &#039;\n&#039;;&lt;br /&gt;
                } else {&lt;br /&gt;
	                    // Для одной категории берем самую тяжкую статью&lt;br /&gt;
	                    var maxLaw = laws.reduce(function(max, current) {&lt;br /&gt;
	                        var currentCode = parseInt(lawCode);&lt;br /&gt;
	                        var maxCode = parseInt(max.title.match(/\d{3}/)[0]);&lt;br /&gt;
	                        return currentCode &amp;gt; maxCode ? current : max;&lt;br /&gt;
	                    });&lt;br /&gt;
	                    &lt;br /&gt;
	                    totalMinTime += category.minTime || 0;&lt;br /&gt;
	                    totalMaxTime += category.maxTime || 0;&lt;br /&gt;
	                    totalFine += category.fine || 0;&lt;br /&gt;
	                    &lt;br /&gt;
	                    var punishmentText = &#039;&#039;;&lt;br /&gt;
	                    if (category.punishment) {&lt;br /&gt;
	                        punishmentText = category.punishment;&lt;br /&gt;
	                    } else if (category.minTime !== undefined) {&lt;br /&gt;
	                        punishmentText = category.minTime === category.maxTime ? &lt;br /&gt;
	                            category.minTime + &#039; минут&#039; : &lt;br /&gt;
	                            category.minTime + &#039;-&#039; + category.maxTime + &#039; минут&#039;;&lt;br /&gt;
	                    }&lt;br /&gt;
	                    &lt;br /&gt;
	                    resultText += &#039;• &#039; + categoryName + &#039;: &#039; + punishmentText + &#039; (статья &#039; + lawCode + &#039;)\n&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	            }.bind(this));&lt;br /&gt;
	            &lt;br /&gt;
	            if (hasCritical) {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: true,&lt;br /&gt;
	                    text: &#039;КРИТИЧЕСКИЕ НАРУШЕНИЯ\n&#039; + resultText + &#039;\nПриговор: Перевод в Д-класс или казнь&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (this.pageType === &#039;d-class&#039;) {&lt;br /&gt;
	                // Для Д-класса показываем штрафы и время отдельно&lt;br /&gt;
	                var summaryText = &#039;&#039;;&lt;br /&gt;
                if (totalFine &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общий штраф: &#039; + totalFine + &#039; кредитов\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
                if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
                    summaryText += &#039;Общее время: &#039; + this.formatTime(totalMinTime, totalMaxTime) + &#039;\n&#039;;&lt;br /&gt;
                }&lt;br /&gt;
	                &lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ Д-КЛАССА\n&#039; + resultText + &#039;\n&#039; + summaryText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else if (totalMinTime &amp;gt; 0 || totalMaxTime &amp;gt; 0) {&lt;br /&gt;
	                var timeText = this.formatTime(totalMinTime, totalMaxTime);&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ СРОКА ЗАКЛЮЧЕНИЯ\n&#039; + resultText + &#039;\nОбщий срок: &#039; + timeText&lt;br /&gt;
	                };&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return {&lt;br /&gt;
	                    isCritical: false,&lt;br /&gt;
	                    text: &#039;РАСЧЕТ НАКАЗАНИЙ\n&#039; + resultText + &#039;\nНе удалось определить наказания&#039;&lt;br /&gt;
	                };&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryKeyByLawCode: function(lawCode) {&lt;br /&gt;
	            var code = parseInt(lawCode);&lt;br /&gt;
	            if (code &amp;gt;= 100 &amp;amp;&amp;amp; code &amp;lt;= 109) return &#039;100-109&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 200 &amp;amp;&amp;amp; code &amp;lt;= 211) return &#039;200-211&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 300 &amp;amp;&amp;amp; code &amp;lt;= 311) return &#039;300-311&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 400 &amp;amp;&amp;amp; code &amp;lt;= 411) return &#039;400-411&#039;;&lt;br /&gt;
	            else if (code &amp;gt;= 500 &amp;amp;&amp;amp; code &amp;lt;= 511) return &#039;500-511&#039;;&lt;br /&gt;
	            return &#039;unknown&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        getCategoryName: function(categoryKey) {&lt;br /&gt;
	            var names = {&lt;br /&gt;
	                &#039;100-109&#039;: &#039;Лёгкие нарушения&#039;,&lt;br /&gt;
	                &#039;200-211&#039;: &#039;Средние нарушения&#039;,&lt;br /&gt;
	                &#039;300-311&#039;: &#039;Тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;400-411&#039;: &#039;Особо тяжкие нарушения&#039;,&lt;br /&gt;
	                &#039;500-511&#039;: &#039;Критические нарушения&#039;&lt;br /&gt;
	            };&lt;br /&gt;
	            return names[categoryKey] || &#039;Неизвестная категория&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatTime: function(minTime, maxTime) {&lt;br /&gt;
	            if (minTime === maxTime) {&lt;br /&gt;
	                return this.formatMinutes(minTime);&lt;br /&gt;
	            } else {&lt;br /&gt;
	                return this.formatMinutes(minTime) + &#039; - &#039; + this.formatMinutes(maxTime);&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        formatMinutes: function(minutes) {&lt;br /&gt;
	            if (minutes &amp;lt; 60) {&lt;br /&gt;
	                return minutes + &#039; минут&#039;;&lt;br /&gt;
	            } else {&lt;br /&gt;
	                var hours = Math.floor(minutes / 60);&lt;br /&gt;
	                var remainingMinutes = minutes % 60;&lt;br /&gt;
	                var result = hours + &#039; час&#039;;&lt;br /&gt;
	                if (hours &amp;gt; 1 &amp;amp;&amp;amp; hours &amp;lt; 5) result += &#039;а&#039;;&lt;br /&gt;
	                if (hours &amp;gt;= 5) result += &#039;ов&#039;;&lt;br /&gt;
	                if (remainingMinutes &amp;gt; 0) {&lt;br /&gt;
	                    result += &#039; &#039; + remainingMinutes + &#039; минут&#039;;&lt;br /&gt;
	                }&lt;br /&gt;
	                return result;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        showResult: function(result) {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (!resultDiv) return;&lt;br /&gt;
	            &lt;br /&gt;
	            resultDiv.textContent = result.text;&lt;br /&gt;
	            resultDiv.className = &#039;calculation-result&#039; + (result.isCritical ? &#039; critical&#039; : &#039;&#039;);&lt;br /&gt;
	            resultDiv.style.display = &#039;block&#039;;&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        hideResult: function() {&lt;br /&gt;
	            var resultDiv = document.querySelector(&#039;.calculation-result&#039;);&lt;br /&gt;
	            if (resultDiv) {&lt;br /&gt;
	                resultDiv.style.display = &#039;none&#039;;&lt;br /&gt;
	            }&lt;br /&gt;
	        },&lt;br /&gt;
	        &lt;br /&gt;
	        observeTables: function() {&lt;br /&gt;
	            // Наблюдаем за динамически добавляемыми таблицами&lt;br /&gt;
	            var observer = new MutationObserver(function(mutations) {&lt;br /&gt;
	                mutations.forEach(function(mutation) {&lt;br /&gt;
	                    mutation.addedNodes.forEach(function(node) {&lt;br /&gt;
	                        if (node.nodeType === 1) {&lt;br /&gt;
	                            if (node.classList &amp;amp;&amp;amp; node.classList.contains(&#039;citizen-table-wrapper&#039;)) {&lt;br /&gt;
	                                setTimeout(function() {&lt;br /&gt;
	                                    LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                }, 100);&lt;br /&gt;
	                            } else if (node.querySelectorAll) {&lt;br /&gt;
	                                var tables = node.querySelectorAll(&#039;.citizen-table-wrapper&#039;);&lt;br /&gt;
	                                if (tables.length &amp;gt; 0) {&lt;br /&gt;
	                                    setTimeout(function() {&lt;br /&gt;
	                                        LawCalculatorModule.createModeToggle();&lt;br /&gt;
	                                    }, 100);&lt;br /&gt;
	                                }&lt;br /&gt;
	                            }&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                });&lt;br /&gt;
	            });&lt;br /&gt;
	            &lt;br /&gt;
	            observer.observe(document.body, {&lt;br /&gt;
	                childList: true,&lt;br /&gt;
	                subtree: true&lt;br /&gt;
	            });&lt;br /&gt;
	        }&lt;br /&gt;
	    };&lt;br /&gt;
	    &lt;br /&gt;
	var SnowflakesModule = {&lt;br /&gt;
	    snowflakes: [],&lt;br /&gt;
	    createInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    snowflakeCount: 30,&lt;br /&gt;
	&lt;br /&gt;
	    random: function (min, max) {&lt;br /&gt;
	        return Math.random() * (max - min) + min;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    init: function () {&lt;br /&gt;
	        if (this.isActive) return;&lt;br /&gt;
	&lt;br /&gt;
	        this.addStyles();&lt;br /&gt;
	        this.startContinuousCreation();&lt;br /&gt;
	        this.isActive = true;&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    addStyles: function () {&lt;br /&gt;
	        if (document.getElementById(&amp;quot;snowflakes-styles&amp;quot;)) return;&lt;br /&gt;
	&lt;br /&gt;
	        var style = document.createElement(&amp;quot;style&amp;quot;);&lt;br /&gt;
	        style.id = &amp;quot;snowflakes-styles&amp;quot;;&lt;br /&gt;
	        style.textContent =&lt;br /&gt;
	            &amp;quot;.snowflake {&amp;quot; +&lt;br /&gt;
	            &amp;quot;position: fixed;&amp;quot; +&lt;br /&gt;
	            &amp;quot;top: -10px;&amp;quot; +&lt;br /&gt;
	            &amp;quot;color: #fff;&amp;quot; +&lt;br /&gt;
	            &amp;quot;font-family: Arial, sans-serif;&amp;quot; +&lt;br /&gt;
	            &amp;quot;user-select: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;pointer-events: none;&amp;quot; +&lt;br /&gt;
	            &amp;quot;z-index: 1;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-name: snowflake-fall;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-timing-function: linear;&amp;quot; +&lt;br /&gt;
	            &amp;quot;animation-iteration-count: infinite;&amp;quot; +&lt;br /&gt;
	            &amp;quot;will-change: transform;&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;@keyframes snowflake-fall {&amp;quot; +&lt;br /&gt;
	            &amp;quot;0% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(0) translateX(0) rotate(0deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;25% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(25vh) translateX(10px) rotate(90deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;50% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(50vh) translateX(-10px) rotate(180deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;75% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(75vh) translateX(10px) rotate(270deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;100% {&amp;quot; +&lt;br /&gt;
	            &amp;quot;transform: translateY(calc(100vh + 100px)) translateX(0) rotate(360deg);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.flare {&amp;quot; +&lt;br /&gt;
	            &amp;quot;text-shadow: 0 0 5px rgba(255, 255, 255, 0.4), 0 0 10px rgba(255, 255, 255, 0.2);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot; +&lt;br /&gt;
	            &amp;quot;.snowflake.blurred {&amp;quot; +&lt;br /&gt;
	            &amp;quot;filter: blur(2px);&amp;quot; +&lt;br /&gt;
	            &amp;quot;}&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        document.head.appendChild(style);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    createSnowflake: function () {&lt;br /&gt;
	        var snowflake = document.createElement(&amp;quot;div&amp;quot;);&lt;br /&gt;
	        snowflake.className = &amp;quot;snowflake&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        var symbol = this.getSnowflakeSymbol();&lt;br /&gt;
	        snowflake.textContent = symbol;&lt;br /&gt;
	&lt;br /&gt;
	        var fontSize = this.random(0.5, 1.2);&lt;br /&gt;
	        snowflake.style.fontSize = fontSize + &amp;quot;em&amp;quot;;&lt;br /&gt;
	        snowflake.style.left = this.random(0, 100) + &amp;quot;vw&amp;quot;;&lt;br /&gt;
	        snowflake.style.opacity = this.random(0.25, 0.5);&lt;br /&gt;
	&lt;br /&gt;
	        var fallDuration = this.random(10, 30);&lt;br /&gt;
	        snowflake.style.animationDuration = fallDuration + &amp;quot;s&amp;quot;;&lt;br /&gt;
	        snowflake.style.animationDelay = this.random(0, 2) + &amp;quot;s&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.95) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;flare&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        if (Math.random() &amp;gt; 0.4) {&lt;br /&gt;
	            snowflake.classList.add(&amp;quot;blurred&amp;quot;);&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        document.body.appendChild(snowflake);&lt;br /&gt;
	        this.snowflakes.push(snowflake);&lt;br /&gt;
	&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        var checkRemove = setInterval(function () {&lt;br /&gt;
	            var rect = snowflake.getBoundingClientRect();&lt;br /&gt;
	            if (rect.top &amp;gt; window.innerHeight + 50) {&lt;br /&gt;
	                if (snowflake.parentNode) {&lt;br /&gt;
	                    snowflake.remove();&lt;br /&gt;
	                }&lt;br /&gt;
	                var index = self.snowflakes.indexOf(snowflake);&lt;br /&gt;
	                if (index &amp;gt; -1) {&lt;br /&gt;
	                    self.snowflakes.splice(index, 1);&lt;br /&gt;
	                }&lt;br /&gt;
	                clearInterval(checkRemove);&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 100);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    getSnowflakeSymbol: function () {&lt;br /&gt;
	        var symbols = [&amp;quot;❄&amp;quot;, &amp;quot;❅&amp;quot;, &amp;quot;❆&amp;quot;];&lt;br /&gt;
	        return symbols[Math.floor(Math.random() * symbols.length)];&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    startContinuousCreation: function () {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        this.createInterval = setInterval(function () {&lt;br /&gt;
	            if (&lt;br /&gt;
	                self.isActive &amp;amp;&amp;amp;&lt;br /&gt;
	                self.snowflakes.length &amp;lt; self.snowflakeCount * 1.5&lt;br /&gt;
	            ) {&lt;br /&gt;
	                self.createSnowflake();&lt;br /&gt;
	            }&lt;br /&gt;
	        }, 500);&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    stop: function () {&lt;br /&gt;
	        this.isActive = false;&lt;br /&gt;
	&lt;br /&gt;
	        if (this.createInterval) {&lt;br /&gt;
	            clearInterval(this.createInterval);&lt;br /&gt;
	            this.createInterval = null;&lt;br /&gt;
	        }&lt;br /&gt;
	&lt;br /&gt;
	        this.snowflakes.forEach(function (snowflake) {&lt;br /&gt;
	            if (snowflake &amp;amp;&amp;amp; snowflake.parentNode) {&lt;br /&gt;
	                snowflake.remove();&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	        this.snowflakes = [];&lt;br /&gt;
	&lt;br /&gt;
	        var styles = document.getElementById(&amp;quot;snowflakes-styles&amp;quot;);&lt;br /&gt;
	        if (styles) {&lt;br /&gt;
	            styles.remove();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	&lt;br /&gt;
	    toggle: function () {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stop();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.init();&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.SnowflakesModule = SnowflakesModule;&lt;br /&gt;
&lt;br /&gt;
	var FireworksModule = {&lt;br /&gt;
	    fireworks: null,&lt;br /&gt;
	    container: null,&lt;br /&gt;
	    checkInterval: null,&lt;br /&gt;
	    isActive: false,&lt;br /&gt;
	    loaded: false,&lt;br /&gt;
	    loading: false,&lt;br /&gt;
	    callbacks: [],&lt;br /&gt;
	    &lt;br /&gt;
	    init: function() {&lt;br /&gt;
	        this.startTimeCheck();&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    loadFireworks: function(callback) {&lt;br /&gt;
	        // Проверяем разные варианты экспорта библиотеки&lt;br /&gt;
	        if (this.loaded &amp;amp;&amp;amp; (window.Fireworks || (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default))) {&lt;br /&gt;
	            if (callback) callback();&lt;br /&gt;
	            return;&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (callback) {&lt;br /&gt;
	            this.callbacks.push(callback);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        if (this.loading) return;&lt;br /&gt;
	        this.loading = true;&lt;br /&gt;
	        &lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Загружаем библиотеку fireworks.js через UMD версию&lt;br /&gt;
	        var script = document.createElement(&#039;script&#039;);&lt;br /&gt;
	        script.src = &#039;https://unpkg.com/fireworks-js@2/dist/index.umd.js&#039;;&lt;br /&gt;
	        script.onload = function() {&lt;br /&gt;
	            self.loaded = true;&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            &lt;br /&gt;
	            // Вызываем все колбэки&lt;br /&gt;
	            self.callbacks.forEach(function(cb) { cb(); });&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        script.onerror = function() {&lt;br /&gt;
	            console.error(&#039;Ошибка загрузки fireworks.js&#039;);&lt;br /&gt;
	            self.loading = false;&lt;br /&gt;
	            self.callbacks = [];&lt;br /&gt;
	        };&lt;br /&gt;
	        &lt;br /&gt;
	        document.head.appendChild(script);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getMoscowTime: function() {&lt;br /&gt;
	        // МСК = UTC+3&lt;br /&gt;
	        var now = new Date();&lt;br /&gt;
	        var utc = now.getTime() + (now.getTimezoneOffset() * 60000);&lt;br /&gt;
	        var moscowTime = new Date(utc + (3 * 3600000)); // UTC+3&lt;br /&gt;
	        return moscowTime;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    isFireworksTime: function() {&lt;br /&gt;
	        var moscowTime = this.getMoscowTime();&lt;br /&gt;
	        var hours = moscowTime.getHours();&lt;br /&gt;
	        // С 00:00 до 01:00 по МСК&lt;br /&gt;
	        return hours === 0;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startTimeCheck: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем сразу при загрузке&lt;br /&gt;
	        this.checkTime();&lt;br /&gt;
	        &lt;br /&gt;
	        // Проверяем каждую минуту&lt;br /&gt;
	        this.checkInterval = setInterval(function() {&lt;br /&gt;
	            self.checkTime();&lt;br /&gt;
	        }, 60000);&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    checkTime: function() {&lt;br /&gt;
	        if (this.isFireworksTime()) {&lt;br /&gt;
	            if (!this.isActive) {&lt;br /&gt;
	                this.startFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        } else {&lt;br /&gt;
	            if (this.isActive) {&lt;br /&gt;
	                this.stopFireworks();&lt;br /&gt;
	            }&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    getFireworksConstructor: function() {&lt;br /&gt;
	        // Пробуем разные варианты доступа к конструктору&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; typeof window.Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default &amp;amp;&amp;amp; typeof window.Fireworks.default === &#039;function&#039;) {&lt;br /&gt;
	            return window.Fireworks.default;&lt;br /&gt;
	        }&lt;br /&gt;
	        if (window.fireworks &amp;amp;&amp;amp; typeof window.fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return window.fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        // Если библиотека экспортируется по-другому&lt;br /&gt;
	        if (typeof Fireworks !== &#039;undefined&#039; &amp;amp;&amp;amp; typeof Fireworks === &#039;function&#039;) {&lt;br /&gt;
	            return Fireworks;&lt;br /&gt;
	        }&lt;br /&gt;
	        return null;&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    startFireworks: function() {&lt;br /&gt;
	        var self = this;&lt;br /&gt;
	        &lt;br /&gt;
	        this.loadFireworks(function() {&lt;br /&gt;
	            if (!self.container) {&lt;br /&gt;
	                self.container = document.createElement(&#039;div&#039;);&lt;br /&gt;
	                self.container.id = &#039;fireworks-container&#039;;&lt;br /&gt;
	                self.container.style.cssText = &lt;br /&gt;
	                    &#039;position: fixed;&#039; +&lt;br /&gt;
	                    &#039;top: 0;&#039; +&lt;br /&gt;
	                    &#039;left: 0;&#039; +&lt;br /&gt;
	                    &#039;width: 100%;&#039; +&lt;br /&gt;
	                    &#039;height: 100%;&#039; +&lt;br /&gt;
	                    &#039;pointer-events: none;&#039; +&lt;br /&gt;
	                    &#039;z-index: 99998;&#039;;&lt;br /&gt;
	                document.body.appendChild(self.container);&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            var FireworksConstructor = self.getFireworksConstructor();&lt;br /&gt;
	            &lt;br /&gt;
	            if (!FireworksConstructor) {&lt;br /&gt;
	                console.error(&#039;Не удалось найти конструктор Fireworks. Проверьте загрузку библиотеки.&#039;);&lt;br /&gt;
	                console.log(&#039;Доступные объекты:&#039;, {&lt;br /&gt;
	                    &#039;window.Fireworks&#039;: window.Fireworks,&lt;br /&gt;
	                    &#039;window.Fireworks.default&#039;: window.Fireworks &amp;amp;&amp;amp; window.Fireworks.default,&lt;br /&gt;
	                    &#039;window.fireworks&#039;: window.fireworks&lt;br /&gt;
	                });&lt;br /&gt;
	                return;&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (!self.fireworks) {&lt;br /&gt;
	                try {&lt;br /&gt;
	                    self.fireworks = new FireworksConstructor(self.container, {&lt;br /&gt;
	                        autoresize: true,&lt;br /&gt;
	                        opacity: 0.5,&lt;br /&gt;
	                        // Замедляем фейерверки&lt;br /&gt;
	                        acceleration: 1.02,  // Уменьшено с 1.05 для более медленного движения&lt;br /&gt;
	                        friction: 0.98,     // Увеличено с 0.97 для большего сопротивления&lt;br /&gt;
	                        gravity: 1.2,       // Уменьшено с 1.5 для более медленного падения&lt;br /&gt;
	                        particles: 50,&lt;br /&gt;
	                        traceLength: 5,     // Увеличено с 3 для более длинного следа&lt;br /&gt;
	                        traceSpeed: 5,       // Уменьшено с 10 для более медленного следа&lt;br /&gt;
	                        explosion: 5,&lt;br /&gt;
	                        intensity: 30,&lt;br /&gt;
	                        flickering: 50,&lt;br /&gt;
	                        lineStyle: &#039;round&#039;,&lt;br /&gt;
	                        hue: { min: 0, max: 360 },&lt;br /&gt;
	                        // Увеличиваем задержку между запусками для более медленного темпа&lt;br /&gt;
	                        delay: { min: 30, max: 60 },  // Увеличено с 15-30 до 30-60&lt;br /&gt;
	                        rocketsPoint: { min: 50, max: 50 },&lt;br /&gt;
	                        lineWidth: { &lt;br /&gt;
	                            explosion: { min: 1, max: 3 }, &lt;br /&gt;
	                            trace: { min: 1, max: 2 } &lt;br /&gt;
	                        },&lt;br /&gt;
	                        brightness: { min: 50, max: 80 },&lt;br /&gt;
	                        decay: { min: 0.01, max: 0.02 },  // Уменьшено для более медленного затухания&lt;br /&gt;
	                        mouse: { click: false, move: false, max: 1 },&lt;br /&gt;
	                        // Включаем звук&lt;br /&gt;
	                        sound: {&lt;br /&gt;
	                            enable: true,&lt;br /&gt;
	                            files: [&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion0.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion1.mp3&#039;,&lt;br /&gt;
	                                &#039;https://fireworks.js.org/sounds/explosion2.mp3&#039;&lt;br /&gt;
	                            ],&lt;br /&gt;
	                            volume: { min: 0.3, max: 0.6 }  // Громкость от 30% до 60%&lt;br /&gt;
	                        }&lt;br /&gt;
	                    });&lt;br /&gt;
	                } catch (e) {&lt;br /&gt;
	                    console.error(&#039;Ошибка создания экземпляра Fireworks:&#039;, e);&lt;br /&gt;
	                    return;&lt;br /&gt;
	                }&lt;br /&gt;
	            }&lt;br /&gt;
	            &lt;br /&gt;
	            if (self.fireworks) {&lt;br /&gt;
	                self.fireworks.start();&lt;br /&gt;
	                self.isActive = true;&lt;br /&gt;
	            }&lt;br /&gt;
	        });&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    stopFireworks: function() {&lt;br /&gt;
	        if (this.fireworks) {&lt;br /&gt;
	            this.fireworks.stop();&lt;br /&gt;
	            this.isActive = false;&lt;br /&gt;
	        }&lt;br /&gt;
	    },&lt;br /&gt;
	    &lt;br /&gt;
	    toggleFireworks: function() {&lt;br /&gt;
	        if (this.isActive) {&lt;br /&gt;
	            this.stopFireworks();&lt;br /&gt;
	        } else {&lt;br /&gt;
	            this.startFireworks();&lt;br /&gt;
	        }&lt;br /&gt;
	    }&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	window.FireworksModule = FireworksModule;&lt;br /&gt;
	&lt;br /&gt;
	var EquipmentFilterModule = {&lt;br /&gt;
    init: function() {&lt;br /&gt;
        if ($(&#039;#enable-group-filter&#039;).length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var groups = {&lt;br /&gt;
            &#039;epsilon11&#039;: { label: &#039;Эпсилон-11&#039;, roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;nyu7&#039;:      { label: &#039;Ню-7&#039;,      roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;beta7&#039;:     { label: &#039;Бета-7&#039;,    roles: [&#039;Командир&#039;, &#039;Специалист&#039;, &#039;Кадет&#039;] },&lt;br /&gt;
            &#039;omega1&#039;:    { label: &#039;Омега-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] },&lt;br /&gt;
            &#039;alfa1&#039;:     { label: &#039;Альфа-1&#039;,   roles: [&#039;Командир&#039;, &#039;Специалист&#039;] }&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var tableClass = &#039;mogtable&#039;; &lt;br /&gt;
&lt;br /&gt;
        var $tables = $(&#039;.wikitable.noresize.&#039; + tableClass);&lt;br /&gt;
        if ($tables.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
        var $container = $(&#039;#filter-placeholder&#039;);&lt;br /&gt;
        if ($container.length) {&lt;br /&gt;
            $container.html(&#039;&#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $container = $(&#039;&amp;lt;div id=&amp;quot;group-filters&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $tables.first().before($container);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        var $tree = $(&#039;&amp;lt;div class=&amp;quot;filter-tree&amp;quot; style=&amp;quot;margin-bottom:10px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
        $container.append($tree);&lt;br /&gt;
&lt;br /&gt;
        // Функция транслитерации&lt;br /&gt;
        function transliterate(role) {&lt;br /&gt;
            var map = {&lt;br /&gt;
                &#039;Командир&#039;: &#039;commander&#039;,&lt;br /&gt;
                &#039;Специалист&#039;: &#039;specialist&#039;,&lt;br /&gt;
                &#039;Кадет&#039;: &#039;cadet&#039;&lt;br /&gt;
            };&lt;br /&gt;
            return map[role] || role.toLowerCase().replace(/ /g, &#039;-&#039;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Создаём элементы для каждого отряда (используем Object.keys для новой области видимости)&lt;br /&gt;
        Object.keys(groups).forEach(function(squadKey) {&lt;br /&gt;
            var squad = groups[squadKey];&lt;br /&gt;
            var $squadDiv = $(&#039;&amp;lt;div class=&amp;quot;squad-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            var $squadCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;squad-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot;&amp;gt; &amp;lt;strong&amp;gt;&#039; + squad.label + &#039;&amp;lt;/strong&amp;gt;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($squadCheckbox);&lt;br /&gt;
&lt;br /&gt;
            var $rolesDiv = $(&#039;&amp;lt;div class=&amp;quot;roles-container&amp;quot; style=&amp;quot;margin-left: 20px; display: none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;);&lt;br /&gt;
            $squadDiv.append($rolesDiv);&lt;br /&gt;
&lt;br /&gt;
            squad.roles.forEach(function(role) {&lt;br /&gt;
                var roleClass = squadKey + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                var $roleCheckbox = $(&#039;&amp;lt;label style=&amp;quot;display: block; margin-bottom: 2px;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;role-checkbox&amp;quot; data-squad=&amp;quot;&#039; + squadKey + &#039;&amp;quot; data-role=&amp;quot;&#039; + roleClass + &#039;&amp;quot;&amp;gt; &#039; + role + &#039;&amp;lt;/label&amp;gt;&#039;);&lt;br /&gt;
                $rolesDiv.append($roleCheckbox);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $tree.append($squadDiv);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        // Добавляем стрелки&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).after(&#039;&amp;lt;span class=&amp;quot;toggle-roles&amp;quot; style=&amp;quot;margin-left:5px; cursor:pointer;&amp;quot;&amp;gt;▶&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
&lt;br /&gt;
        // Функция обновления видимости строк&lt;br /&gt;
        function updateVisibility() {&lt;br /&gt;
            var activeClasses = [];&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.squad-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var squad = $(this).data(&#039;squad&#039;);&lt;br /&gt;
                groups[squad].roles.forEach(function(role) {&lt;br /&gt;
                    var roleClass = squad + &#039;-&#039; + transliterate(role);&lt;br /&gt;
                    activeClasses.push(roleClass);&lt;br /&gt;
                });&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            $(&#039;.role-checkbox:checked&#039;).each(function() {&lt;br /&gt;
                var roleClass = $(this).data(&#039;role&#039;);&lt;br /&gt;
                activeClasses.push(roleClass);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            activeClasses = [...new Set(activeClasses)];&lt;br /&gt;
&lt;br /&gt;
            $tables.find(&#039;tr[class*=&amp;quot;equip-&amp;quot;]&#039;).hide();&lt;br /&gt;
&lt;br /&gt;
            if (activeClasses.length === 0) return;&lt;br /&gt;
&lt;br /&gt;
            activeClasses.forEach(function(cls) {&lt;br /&gt;
                $tables.find(&#039;tr&#039;).filter(function() {&lt;br /&gt;
                    return $(this).hasClass(&#039;equip-&#039; + cls);&lt;br /&gt;
                }).show();&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Обработчики&lt;br /&gt;
        $(&#039;.squad-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            $roles.prop(&#039;checked&#039;, $(this).prop(&#039;checked&#039;));&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.role-checkbox&#039;).on(&#039;change&#039;, function() {&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $squadCheckbox = $squadDiv.find(&#039;.squad-checkbox&#039;);&lt;br /&gt;
            var $roles = $squadDiv.find(&#039;.role-checkbox&#039;);&lt;br /&gt;
            var allChecked = $roles.length === $roles.filter(&#039;:checked&#039;).length;&lt;br /&gt;
            $squadCheckbox.prop(&#039;checked&#039;, allChecked);&lt;br /&gt;
            updateVisibility();&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.toggle-roles&#039;).on(&#039;click&#039;, function(e) {&lt;br /&gt;
            e.stopPropagation();&lt;br /&gt;
            var $squadDiv = $(this).closest(&#039;.squad-item&#039;);&lt;br /&gt;
            var $rolesDiv = $squadDiv.find(&#039;.roles-container&#039;);&lt;br /&gt;
            var isVisible = $rolesDiv.is(&#039;:visible&#039;);&lt;br /&gt;
            $rolesDiv.slideToggle();&lt;br /&gt;
            $(this).text(isVisible ? &#039;▶&#039; : &#039;▼&#039;);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        $(&#039;.roles-container&#039;).hide();&lt;br /&gt;
        updateVisibility();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
    function initAllModules() {&lt;br /&gt;
        SidebarModule.init();&lt;br /&gt;
        AccessTooltipsModule.init();&lt;br /&gt;
        LawTooltipsModule.init();&lt;br /&gt;
        DataTooltipsModule.init();&lt;br /&gt;
        CopyTextModule.init();&lt;br /&gt;
        DocumentAutoFillModule.init();&lt;br /&gt;
        // SnowflakesModule.init()&lt;br /&gt;
        // FireworksModule.init();&lt;br /&gt;
        // LawCalculatorModule.init();&lt;br /&gt;
        EquipmentFilterModule.init()&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (document.readyState === &#039;loading&#039;) {&lt;br /&gt;
        document.addEventListener(&#039;DOMContentLoaded&#039;, initAllModules);&lt;br /&gt;
    } else {&lt;br /&gt;
        initAllModules();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A3%D1%81%D1%82%D0%B0%D0%B2_%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=17679</id>
		<title>Шаблон:Устав Участка</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A3%D1%81%D1%82%D0%B0%D0%B2_%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=17679"/>
		<updated>2026-03-30T07:30:37Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;center&amp;gt; Правовой кодекс Участка &amp;lt;center&amp;gt; ==&lt;br /&gt;
Преступления в уставе делятся на классы:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;text-align:left;width:100%;min-width:1078px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width: 20%&amp;quot; | &#039;&#039;&#039;Класс&#039;&#039;&#039; !! ! style=&amp;quot;background-color: ##536715; width: 75%&amp;quot; | &#039;&#039;&#039;Наказание&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| I || 10–15 минут&lt;br /&gt;
|-&lt;br /&gt;
| II || 15–20 минут&lt;br /&gt;
|-&lt;br /&gt;
| III || 20–25 минут&lt;br /&gt;
|-&lt;br /&gt;
| IV || 25–30 минут&lt;br /&gt;
|-&lt;br /&gt;
| V || Перевод в Д класс / казнь&lt;br /&gt;
|}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Справочник преступлений Устава участка&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=нет&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание=&amp;lt;div class=&amp;quot;law-tooltips&amp;quot;&amp;gt;{{Закон персонала ПКСВТ/Справочник нарушений}}&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{Модификаторы ДФ для персонала}}&lt;br /&gt;
&lt;br /&gt;
== Работа со сроками ==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Несколько преступлений разных разделов&amp;quot;&amp;gt;&lt;br /&gt;
Статьи разных категорий применяются вместе и их наказания складываются друг с другом.&amp;lt;br&amp;gt;&lt;br /&gt;
Так, офицер может предъявить какому-нибудь сотруднику, проникшего в Логистику и оскорбившего самого офицера, обвинения в нарушении § 5.1 Устава участка и Раздел 1, Глава 7 § 2.6 КЭ; при этом сроки заключения должны быть сложены вместе.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Несколько преступлений одного раздела&amp;quot;&amp;gt;&lt;br /&gt;
Преступления одного раздела (§ _.x) не применяются вместе и не складываются. В случае статьи одной категории, берётся статья более тяжёлая (при § 4.2 и § 4.3 - берётся § 4.3).&lt;br /&gt;
По итогу используется наиболее тяжёлая для правового поля и ущерба статья Устава участка.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Перевод в Д-класс и модификаторы&amp;quot;&amp;gt;&lt;br /&gt;
Отягчающие модификаторы при заведомым переводом в Д-класс всё-также следует учитывать для составления приговора, который может выступить основанием для проведения процедуры казни, либо с целью сохранения перевода на случай оправдания нарушителя по ряду нарушений.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Виды наказаний ==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Административный запрет&amp;quot;&amp;gt;&lt;br /&gt;
== Административный запрет ==&lt;br /&gt;
&#039;&#039;&#039;Административный запрет&#039;&#039;&#039; — вид наказания, подразумевающий ограничение действий сотрудника, нарушившего закон. Запрет может быть наложен [[Главный комендант|Главным комендантом]], [[Начальник службы безопасности|Начальником службы безопасности]], [[Представитель Комитета|Представителем Комитета по этике]] или [[Директор Участка|Директором учреждения]] в случае совершения &#039;&#039;&#039;лёгкого нарушения&#039;&#039;&#039; (класс I). &lt;br /&gt;
&lt;br /&gt;
Лицо, наложившее запрет, обязано составить два экземпляра документа «Постановление об административном запрете»: &lt;br /&gt;
*Один экземпляр документа остаётся у нарушителя;&lt;br /&gt;
*Другой экземпляр документа остаётся у инициатора запрета.&lt;br /&gt;
&lt;br /&gt;
=== Правила применения ===&lt;br /&gt;
* &#039;&#039;&#039;Срок действия&#039;&#039;&#039; административных запретов не ограничен.&lt;br /&gt;
* Запреты не могут противоречить &#039;&#039;&#039;Кодексу Этики&#039;&#039;&#039;.&lt;br /&gt;
* Меры, не включённые в стандартный перечень, требуют одобрения Директора или Начальника службы безопасности.&lt;br /&gt;
* Запрет не должен препятствовать выполнению сотрудником его прямых служебных обязанностей.&lt;br /&gt;
* Все ограничения должны быть чётко и ясно доведены до нарушителя, включая вручение письменного документа.&lt;br /&gt;
&lt;br /&gt;
Нарушение административного запрета квалифицируется как &#039;&#039;&#039;«Халатность»&#039;&#039;&#039; (§ 22 КЭ, Раздел 1, Глава 7).&lt;br /&gt;
&lt;br /&gt;
=== Примеры ограничений ===&lt;br /&gt;
* Ограничение доступа к определённым зонам и/или объектам содержания.&lt;br /&gt;
* Отзыв предоставленных привилегий.&lt;br /&gt;
* Перевод на другой проект или объект.&lt;br /&gt;
* Снижение заработной платы.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Исправительные работы&amp;quot;&amp;gt;&lt;br /&gt;
==&#039;&#039;&#039;Процедура «Исправительный контур»&#039;&#039;&#039;==&lt;br /&gt;
===&#039;&#039;&#039;1. Преамбула&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
Фонд SCP функционирует в условиях постоянной аномальной угрозы. Четкое следование Стандартных протоколов, закона и приказов является не просто вопросом дисциплины, а ключевым фактором выживания персонала и обеспечения глобальной безопасности. Любое отклонение от установленных норм, будь то халатность, неподчинение или умышленное нарушение, рассматривается как серьезный инцидент. Процедура исправительных работ (кодовое название «Исправительный контур») призвана не столько наказать провинившегося, сколько напомнить о фундаментальных принципах работы Фонда и предоставить возможность для реабилитации через непосредственный контакт с рутинной, но жизненно важной деятельностью Фонда.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;2. Основания для назначения&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
Исправительные работы назначаются решением Комитета по этике, Главного коменданта и выше по следующим типичным основаниям:&lt;br /&gt;
&lt;br /&gt;
*Нарушение, в случае &#039;&#039;&#039;средних нарушений и ниже&#039;&#039;&#039; (Класс II).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;В качестве условного наказания:&#039;&#039;&#039; Вместо более строгих мер, таких как понижение в должности или увольнение, если сотрудник имеет положительную историю службы или так решил ПКпЭ, или Главный комендант и выше .&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;3. Процедура назначения&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
1. &#039;&#039;&#039;Фиксация инцидента:&#039;&#039;&#039; Составляется документ о нарушении.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Рассмотрение:&#039;&#039;&#039; ПКпЭ или Главный комендант и выше изучает обстоятельства, заслушивает объяснения сотрудника и его непосредственного руководителя.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Вынесение постановления:&#039;&#039;&#039; Издается приказ с указанием:&lt;br /&gt;
&lt;br /&gt;
*ФИО и должности сотрудника.&lt;br /&gt;
&lt;br /&gt;
*Сути нарушения.&lt;br /&gt;
&lt;br /&gt;
*Продолжительности исправительных работ (от 5 до 30 минут).&lt;br /&gt;
&lt;br /&gt;
*Конкретного вида работ или подразделения, куда сотрудник прикрепляется.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Уведомление:&#039;&#039;&#039; Сотрудник знакомится с приказом под роспись. Ему разъясняются его новые обязанности и правила прохождения «Исправительного контура».&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;4. Виды исправительных работ&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
Работы подбираются таким образом, чтобы минимизировать риски, но максимально эффективно напомнить сотруднику о важности каждой детали в работе Фонда.&lt;br /&gt;
* &#039;&#039;&#039;Общие виды:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
**&#039;&#039;&#039; Физическая уборка и дезинфекция:&#039;&#039;&#039; Ручная очистка мест, которые должны быть указаны в документе.&lt;br /&gt;
**&#039;&#039;&#039; Сортировка:&#039;&#039;&#039; Работа сортированием разного оборудования, шкафов, предметов.&lt;br /&gt;
**&#039;&#039;&#039; Логистика:&#039;&#039;&#039; Работа в логистической службе. Может включать также в приказе то количество денег, которое надо набрать за энное количество времени.&lt;br /&gt;
*&#039;&#039;&#039;Для сотрудников службы безопасности:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
**&#039;&#039;&#039;Статичная охрана:&#039;&#039;&#039; Несение службы на постах с минимальной активностью (например, у выходов А и Б).&lt;br /&gt;
**&#039;&#039;&#039;КПП:&#039;&#039;&#039; Сидение на Контрольно-пропускных пунктах.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;5. Условия отбывания&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*&#039;&#039;&#039;Контроль:&#039;&#039;&#039; За всеми сотрудниками, выполняющие исправительные работы, следит [[Менеджер по персоналу|Менеджер по персоналу]] или глава соответствующего отдела.&lt;br /&gt;
*&#039;&#039;&#039;Последствия срыва:&#039;&#039;&#039; Невыполнение нормы, опоздание или нарушение правил во время отбывания исправительных работ ведет к аннулированию текущего срока и назначению нового, вдвое большего, а также к пересмотру первоначального нарушения в сторону ужесточения наказания.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;6. Завершение процедуры&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
После отбытия полного срока Менеджер по персоналу и/или глава соответствующего отдела сотрудника предоставляют ПКпЭ/Директору учреждения итоговый отчет. Если работа признана удовлетворительной, приказ о наказании считается исполненным, а запись об инциденте остается в личном деле сотрудника с пометкой «Дисциплинарное взыскание погашено».&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Заключение под стражу&amp;quot;&amp;gt;&lt;br /&gt;
Стандартный вид наказания, подразумевающий ограничение свободы на определённый срок. Заключение под стражу рассматривается как самый лояльный к преступнику метод наказания, призванный изолировать его от остальных сотрудников и предоставить время на осмысление совершённых им ошибок.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Процедура заключения под стражу:&#039;&#039;&#039;==&lt;br /&gt;
===&#039;&#039;&#039;1. Допрос&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Допрос&#039;&#039;&#039; - это процесс допрашивания определённого человека. Допрос создан для того, чтобы получше узнать информацию по нарушению, по нарушителю и вообще разобраться в ситуации. В конце допроса всегда выносится вердикт, в котором учитывается все применённые модификаторы.&lt;br /&gt;
&lt;br /&gt;
Помните, что допрос &#039;&#039;&#039;необязателен&#039;&#039;&#039;, если:&lt;br /&gt;
*Нарушение произошло на глазах сотрудников СБ.&lt;br /&gt;
**Даже в таком случае требуется применить модификаторы, если таковы будут.&lt;br /&gt;
**Сотрудник &#039;&#039;&#039;обязан&#039;&#039;&#039; сказать номер закона или описание нарушения при аресте или при заключении в камеру.&lt;br /&gt;
===&#039;&#039;&#039;2. Заключение в камеру&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
После вынесения вердикта, нарушитель отправляется в одиночную камеру для того, чтобы просидеть определённый срок. Срок можно установить на бриг-таймере.&amp;lt;br&amp;gt;&lt;br /&gt;
*Помните, что вердикт может не всегда включать обязательное отбывание срока за решёткой. При казни к примеру, нарушитель не отбывает срок за решёткой, а сразу приговаривается к казни. Тоже самое и с переводом в Д-класс: за решёткой сидеть отправлять нарушителя не надо, а сразу проводить процедуру перевода в Д-класс.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Перевод в Д-класс&amp;quot;&amp;gt;&lt;br /&gt;
Перевод в Д класс предусматривается за совершение особо тяжких преступлений (Класс V), либо общий срок заключения в 50 и более минут. Вид наказания который подразумевает перевод в Д-класс сотрудника, предварительно обработав его амнезиаком класса Д, на пожизненно.&lt;br /&gt;
Нарушители с общим сроком более 35 минут должны быть переведены в Д класс при наличии собственного желания.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Код протокола:&#039;&#039;&#039; Д-Перевод (&amp;quot;Последнее слово&amp;quot;)==&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;1. Преамбула и область применения&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
Данный протокол регулирует процедуру перевода сотрудника Фонда в класс D (далее – «Переводимый») в связи с вынесением приговора Фонда, добровольным зачетом приговора или иными причинами, утвержденными Комитетом по Этике. Протокол призван обеспечить:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Гуманность:&#039;&#039;&#039; Минимизацию психологической травмы для Переводимого.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Безопасность:&#039;&#039;&#039; Предотвращение инцидентов и актов неповиновения.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Административную ясность:&#039;&#039;&#039; Четкое документирование процесса.&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;2. Процедура перевода&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
====&#039;&#039;&#039;Этап 1: Уведомление и Подготовка&#039;&#039;&#039;====&lt;br /&gt;
*Переводимый помещается в камеру Брига под наблюдением вооруженной охраны.&lt;br /&gt;
*Ему вручается документ «Уведомление о переводе», где официально излагаются причины перевода (в общих чертах, без указания сверхсекретных деталей) и его новые права и обязанности как объекта класса D.&lt;br /&gt;
====&#039;&#039;&#039;Этап 2: Опция «Последнее слово»&#039;&#039;&#039;====&lt;br /&gt;
*Последний разговор.&lt;br /&gt;
**Переводимый имеет право вызвать одного сотрудника Фонда для последней беседы.&lt;br /&gt;
**Запрашиваемый сотрудник &#039;&#039;&#039;не обязан&#039;&#039;&#039; соглашаться на разговор. Его согласие является сугубо добровольным.&lt;br /&gt;
**Разговор происходит в комнате допроса под постоянным видеонаблюдением.&lt;br /&gt;
**Продолжительность разговора ограничена 5 минутами.&lt;br /&gt;
**Сотрудник службы безопасности имеет право прервать разговор в любой момент при нарушении протокола (попытка передачи кодов, угрозы, кодовые фразы).&lt;br /&gt;
====&#039;&#039;&#039;Этап 3: Отсрочка и Откат&#039;&#039;&#039; ====&lt;br /&gt;
*Переводимый имеет право отказаться от опции «Последнее слово». В этом случае процедура ускорена, и ему выражается благодарность за сотрудничество.&lt;br /&gt;
&lt;br /&gt;
*Запрос на разговор с конкретным сотрудником может быть отклонен [[Комитет по Этике|Комитетом по Этике]] или [[Начальник службы безопасности|НСБ]], или [[Директор учреждения|Директором Учреждения]], или [[Главный комендант|Главным комендантом]] по следующей причине:&lt;br /&gt;
**Имеются подозрения в сговоре.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Этап 4: Исполнение перевода&#039;&#039;&#039;====&lt;br /&gt;
*После реализации опции или отказа от нее, Переводимому вводится утвержденная доза амнезиака класса D.&lt;br /&gt;
&lt;br /&gt;
*После потери сознания с него снимается униформа сотрудника и выдается стандартная униформа персонала класса-Д.&lt;br /&gt;
&lt;br /&gt;
*Присваивается новый идентификационный номер (D-XXXX).&lt;br /&gt;
**Номер присвоить и поменять должность можно с помощью консоли ID карт.&lt;br /&gt;
&lt;br /&gt;
*Объект перемещается в ЗСД (Д-блок).&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Понижение&amp;quot;&amp;gt;&lt;br /&gt;
Вид обязательного добавочного наказания, предусматривающий понижение / отстранение от действующей смены с последующим разбирательством на РУ. Помните о необходимости [[Бюрократия|задокументировать]] понижение.&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Причины для понижения&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#536715&lt;br /&gt;
|Скрыто_по_умолчанию=нет&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала/Увольнение/Причины для понижения}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Казнь&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;Казнь - санкционированное убийство с последующим запретом на реанимирование.&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==&#039;&#039;&#039;Процедура казни:&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;==&lt;br /&gt;
===&#039;&#039;&#039;1. Основания для казни&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*Убийство члена руководящего состава и выше.&lt;br /&gt;
*Убийство более чем двух сотрудников комплекса.&lt;br /&gt;
*Попытку насильственного свержения власти на территории объекта фонда SCP.&lt;br /&gt;
*Враги Фонда.&lt;br /&gt;
*Нарушение одной и более статьей класса V&lt;br /&gt;
===&#039;&#039;&#039;2. Процедура принятия решения&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*Решение об казни принимает Директор учреждения или уполномоченное лицо (Главный комендант, Начальник службы безопасности)&lt;br /&gt;
*Решение должно быть &#039;&#039;&#039;задокументировано&#039;&#039;&#039;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;3. Исполнители&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*Непосредственными исполнителями являются сотрудники службы безопасности.&lt;br /&gt;
*Медицинский персонал должен присутствовать для подтверждения смерти.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;4. Метод казни&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*Инъекция быстродействующего летального препарата - это наиболее клинический и контролируемый метод.&lt;br /&gt;
*Огнестрельное оружие (в случаях, требующих немедленного реагирования на угрозу или невозможность выполнение 1 варианта).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Не забывайте, что сотрудник Фонда &#039;&#039;&#039;имеет право&#039;&#039;&#039; попросить на последок с кем-то поговорить или сказать своё последние слово.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Типы нарушений==&lt;br /&gt;
{{#tag:h3|Класс I|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс I&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс I&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс I}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h3|Класс II|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс II&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс II&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс II}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h3|Класс III|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс III&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс III&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс III}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h3|Класс IV|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс IV&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс IV&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс IV}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h3|Класс V|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс V&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс V&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс V}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A3%D1%81%D1%82%D0%B0%D0%B2_%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=17677</id>
		<title>Шаблон:Устав Участка</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A3%D1%81%D1%82%D0%B0%D0%B2_%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=17677"/>
		<updated>2026-03-29T18:05:08Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;center&amp;gt; Правовой кодекс Участка &amp;lt;center&amp;gt; ==&lt;br /&gt;
Преступления в уставе делятся на классы:&lt;br /&gt;
{| class=&amp;quot;wikitable sortable law-tooltips&amp;quot; style=&amp;quot;text-align:left;width:100%;min-width:1078px&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width: 20%&amp;quot; | &#039;&#039;&#039;Класс&#039;&#039;&#039; !! ! style=&amp;quot;background-color: ##536715; width: 75%&amp;quot; | &#039;&#039;&#039;Наказание&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| I || 10–15 минут&lt;br /&gt;
|-&lt;br /&gt;
| II || 15–20 минут&lt;br /&gt;
|-&lt;br /&gt;
| III || 20–25 минут&lt;br /&gt;
|-&lt;br /&gt;
| IV || 25–30 минут&lt;br /&gt;
|-&lt;br /&gt;
| V || Перевод в Д класс / казнь&lt;br /&gt;
|}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Справочник преступлений Устава участка&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#1b1b1f&lt;br /&gt;
|Скрыто_по_умолчанию=нет&lt;br /&gt;
|Содержимое_отступ=0px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Справочник нарушений}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{Модификаторы ДФ для персонала}}&lt;br /&gt;
&lt;br /&gt;
== Работа со сроками ==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Несколько преступлений разных разделов&amp;quot;&amp;gt;&lt;br /&gt;
Статьи разных категорий применяются вместе и их наказания складываются друг с другом.&amp;lt;br&amp;gt;&lt;br /&gt;
Так, офицер может предъявить какому-нибудь сотруднику, проникшего в Логистику и оскорбившего самого офицера, обвинения в нарушении § 5.1 Устава участка и Раздел 1, Глава 7 § 2.6 КЭ; при этом сроки заключения должны быть сложены вместе.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Несколько преступлений одного раздела&amp;quot;&amp;gt;&lt;br /&gt;
Преступления одного раздела (§ _.x) не применяются вместе и не складываются. В случае статьи одной категории, берётся статья более тяжёлая (при § 4.2 и § 4.3 - берётся § 4.3).&lt;br /&gt;
По итогу используется наиболее тяжёлая для правового поля и ущерба статья Устава участка.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Перевод в Д-класс и модификаторы&amp;quot;&amp;gt;&lt;br /&gt;
Отягчающие модификаторы при заведомым переводом в Д-класс всё-также следует учитывать для составления приговора, который может выступить основанием для проведения процедуры казни, либо с целью сохранения перевода на случай оправдания нарушителя по ряду нарушений.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Виды наказаний ==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Административный запрет&amp;quot;&amp;gt;&lt;br /&gt;
== Административный запрет ==&lt;br /&gt;
&#039;&#039;&#039;Административный запрет&#039;&#039;&#039; — вид наказания, подразумевающий ограничение действий сотрудника, нарушившего закон. Запрет может быть наложен [[Главный комендант|Главным комендантом]], [[Начальник службы безопасности|Начальником службы безопасности]], [[Представитель Комитета|Представителем Комитета по этике]] или [[Директор Участка|Директором учреждения]] в случае совершения &#039;&#039;&#039;лёгкого нарушения&#039;&#039;&#039; (класс I). &lt;br /&gt;
&lt;br /&gt;
Лицо, наложившее запрет, обязано составить два экземпляра документа «Постановление об административном запрете»: &lt;br /&gt;
*Один экземпляр документа остаётся у нарушителя;&lt;br /&gt;
*Другой экземпляр документа остаётся у инициатора запрета.&lt;br /&gt;
&lt;br /&gt;
=== Правила применения ===&lt;br /&gt;
* &#039;&#039;&#039;Срок действия&#039;&#039;&#039; административных запретов не ограничен.&lt;br /&gt;
* Запреты не могут противоречить &#039;&#039;&#039;Кодексу Этики&#039;&#039;&#039;.&lt;br /&gt;
* Меры, не включённые в стандартный перечень, требуют одобрения Директора или Начальника службы безопасности.&lt;br /&gt;
* Запрет не должен препятствовать выполнению сотрудником его прямых служебных обязанностей.&lt;br /&gt;
* Все ограничения должны быть чётко и ясно доведены до нарушителя, включая вручение письменного документа.&lt;br /&gt;
&lt;br /&gt;
Нарушение административного запрета квалифицируется как &#039;&#039;&#039;«Халатность»&#039;&#039;&#039; (§ 22 КЭ, Раздел 1, Глава 7).&lt;br /&gt;
&lt;br /&gt;
=== Примеры ограничений ===&lt;br /&gt;
* Ограничение доступа к определённым зонам и/или объектам содержания.&lt;br /&gt;
* Отзыв предоставленных привилегий.&lt;br /&gt;
* Перевод на другой проект или объект.&lt;br /&gt;
* Снижение заработной платы.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Исправительные работы&amp;quot;&amp;gt;&lt;br /&gt;
==&#039;&#039;&#039;Процедура «Исправительный контур»&#039;&#039;&#039;==&lt;br /&gt;
===&#039;&#039;&#039;1. Преамбула&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
Фонд SCP функционирует в условиях постоянной аномальной угрозы. Четкое следование Стандартных протоколов, закона и приказов является не просто вопросом дисциплины, а ключевым фактором выживания персонала и обеспечения глобальной безопасности. Любое отклонение от установленных норм, будь то халатность, неподчинение или умышленное нарушение, рассматривается как серьезный инцидент. Процедура исправительных работ (кодовое название «Исправительный контур») призвана не столько наказать провинившегося, сколько напомнить о фундаментальных принципах работы Фонда и предоставить возможность для реабилитации через непосредственный контакт с рутинной, но жизненно важной деятельностью Фонда.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;2. Основания для назначения&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
Исправительные работы назначаются решением Комитета по этике, Главного коменданта и выше по следующим типичным основаниям:&lt;br /&gt;
&lt;br /&gt;
*Нарушение, в случае &#039;&#039;&#039;средних нарушений и ниже&#039;&#039;&#039; (Класс II).&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;В качестве условного наказания:&#039;&#039;&#039; Вместо более строгих мер, таких как понижение в должности или увольнение, если сотрудник имеет положительную историю службы или так решил ПКпЭ, или Главный комендант и выше .&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;3. Процедура назначения&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
1. &#039;&#039;&#039;Фиксация инцидента:&#039;&#039;&#039; Составляется документ о нарушении.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Рассмотрение:&#039;&#039;&#039; ПКпЭ или Главный комендант и выше изучает обстоятельства, заслушивает объяснения сотрудника и его непосредственного руководителя.&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Вынесение постановления:&#039;&#039;&#039; Издается приказ с указанием:&lt;br /&gt;
&lt;br /&gt;
*ФИО и должности сотрудника.&lt;br /&gt;
&lt;br /&gt;
*Сути нарушения.&lt;br /&gt;
&lt;br /&gt;
*Продолжительности исправительных работ (от 5 до 30 минут).&lt;br /&gt;
&lt;br /&gt;
*Конкретного вида работ или подразделения, куда сотрудник прикрепляется.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Уведомление:&#039;&#039;&#039; Сотрудник знакомится с приказом под роспись. Ему разъясняются его новые обязанности и правила прохождения «Исправительного контура».&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;4. Виды исправительных работ&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
Работы подбираются таким образом, чтобы минимизировать риски, но максимально эффективно напомнить сотруднику о важности каждой детали в работе Фонда.&lt;br /&gt;
* &#039;&#039;&#039;Общие виды:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
**&#039;&#039;&#039; Физическая уборка и дезинфекция:&#039;&#039;&#039; Ручная очистка мест, которые должны быть указаны в документе.&lt;br /&gt;
**&#039;&#039;&#039; Сортировка:&#039;&#039;&#039; Работа сортированием разного оборудования, шкафов, предметов.&lt;br /&gt;
**&#039;&#039;&#039; Логистика:&#039;&#039;&#039; Работа в логистической службе. Может включать также в приказе то количество денег, которое надо набрать за энное количество времени.&lt;br /&gt;
*&#039;&#039;&#039;Для сотрудников службы безопасности:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
**&#039;&#039;&#039;Статичная охрана:&#039;&#039;&#039; Несение службы на постах с минимальной активностью (например, у выходов А и Б).&lt;br /&gt;
**&#039;&#039;&#039;КПП:&#039;&#039;&#039; Сидение на Контрольно-пропускных пунктах.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;5. Условия отбывания&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*&#039;&#039;&#039;Контроль:&#039;&#039;&#039; За всеми сотрудниками, выполняющие исправительные работы, следит [[Менеджер по персоналу|Менеджер по персоналу]] или глава соответствующего отдела.&lt;br /&gt;
*&#039;&#039;&#039;Последствия срыва:&#039;&#039;&#039; Невыполнение нормы, опоздание или нарушение правил во время отбывания исправительных работ ведет к аннулированию текущего срока и назначению нового, вдвое большего, а также к пересмотру первоначального нарушения в сторону ужесточения наказания.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;6. Завершение процедуры&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
После отбытия полного срока Менеджер по персоналу и/или глава соответствующего отдела сотрудника предоставляют ПКпЭ/Директору учреждения итоговый отчет. Если работа признана удовлетворительной, приказ о наказании считается исполненным, а запись об инциденте остается в личном деле сотрудника с пометкой «Дисциплинарное взыскание погашено».&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Заключение под стражу&amp;quot;&amp;gt;&lt;br /&gt;
Стандартный вид наказания, подразумевающий ограничение свободы на определённый срок. Заключение под стражу рассматривается как самый лояльный к преступнику метод наказания, призванный изолировать его от остальных сотрудников и предоставить время на осмысление совершённых им ошибок.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Процедура заключения под стражу:&#039;&#039;&#039;==&lt;br /&gt;
===&#039;&#039;&#039;1. Допрос&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
&#039;&#039;&#039;Допрос&#039;&#039;&#039; - это процесс допрашивания определённого человека. Допрос создан для того, чтобы получше узнать информацию по нарушению, по нарушителю и вообще разобраться в ситуации. В конце допроса всегда выносится вердикт, в котором учитывается все применённые модификаторы.&lt;br /&gt;
&lt;br /&gt;
Помните, что допрос &#039;&#039;&#039;необязателен&#039;&#039;&#039;, если:&lt;br /&gt;
*Нарушение произошло на глазах сотрудников СБ.&lt;br /&gt;
**Даже в таком случае требуется применить модификаторы, если таковы будут.&lt;br /&gt;
**Сотрудник &#039;&#039;&#039;обязан&#039;&#039;&#039; сказать номер закона или описание нарушения при аресте или при заключении в камеру.&lt;br /&gt;
===&#039;&#039;&#039;2. Заключение в камеру&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
После вынесения вердикта, нарушитель отправляется в одиночную камеру для того, чтобы просидеть определённый срок. Срок можно установить на бриг-таймере.&amp;lt;br&amp;gt;&lt;br /&gt;
*Помните, что вердикт может не всегда включать обязательное отбывание срока за решёткой. При казни к примеру, нарушитель не отбывает срок за решёткой, а сразу приговаривается к казни. Тоже самое и с переводом в Д-класс: за решёткой сидеть отправлять нарушителя не надо, а сразу проводить процедуру перевода в Д-класс.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Перевод в Д-класс&amp;quot;&amp;gt;&lt;br /&gt;
Перевод в Д класс предусматривается за совершение особо тяжких преступлений (Класс V), либо общий срок заключения в 50 и более минут. Вид наказания который подразумевает перевод в Д-класс сотрудника, предварительно обработав его амнезиаком класса Д, на пожизненно.&lt;br /&gt;
Нарушители с общим сроком более 35 минут должны быть переведены в Д класс при наличии собственного желания.&lt;br /&gt;
&lt;br /&gt;
==&#039;&#039;&#039;Код протокола:&#039;&#039;&#039; Д-Перевод (&amp;quot;Последнее слово&amp;quot;)==&lt;br /&gt;
&lt;br /&gt;
===&#039;&#039;&#039;1. Преамбула и область применения&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
Данный протокол регулирует процедуру перевода сотрудника Фонда в класс D (далее – «Переводимый») в связи с вынесением приговора Фонда, добровольным зачетом приговора или иными причинами, утвержденными Комитетом по Этике. Протокол призван обеспечить:&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Гуманность:&#039;&#039;&#039; Минимизацию психологической травмы для Переводимого.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Безопасность:&#039;&#039;&#039; Предотвращение инцидентов и актов неповиновения.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Административную ясность:&#039;&#039;&#039; Четкое документирование процесса.&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;2. Процедура перевода&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
====&#039;&#039;&#039;Этап 1: Уведомление и Подготовка&#039;&#039;&#039;====&lt;br /&gt;
*Переводимый помещается в камеру Брига под наблюдением вооруженной охраны.&lt;br /&gt;
*Ему вручается документ «Уведомление о переводе», где официально излагаются причины перевода (в общих чертах, без указания сверхсекретных деталей) и его новые права и обязанности как объекта класса D.&lt;br /&gt;
====&#039;&#039;&#039;Этап 2: Опция «Последнее слово»&#039;&#039;&#039;====&lt;br /&gt;
*Последний разговор.&lt;br /&gt;
**Переводимый имеет право вызвать одного сотрудника Фонда для последней беседы.&lt;br /&gt;
**Запрашиваемый сотрудник &#039;&#039;&#039;не обязан&#039;&#039;&#039; соглашаться на разговор. Его согласие является сугубо добровольным.&lt;br /&gt;
**Разговор происходит в комнате допроса под постоянным видеонаблюдением.&lt;br /&gt;
**Продолжительность разговора ограничена 5 минутами.&lt;br /&gt;
**Сотрудник службы безопасности имеет право прервать разговор в любой момент при нарушении протокола (попытка передачи кодов, угрозы, кодовые фразы).&lt;br /&gt;
====&#039;&#039;&#039;Этап 3: Отсрочка и Откат&#039;&#039;&#039; ====&lt;br /&gt;
*Переводимый имеет право отказаться от опции «Последнее слово». В этом случае процедура ускорена, и ему выражается благодарность за сотрудничество.&lt;br /&gt;
&lt;br /&gt;
*Запрос на разговор с конкретным сотрудником может быть отклонен [[Комитет по Этике|Комитетом по Этике]] или [[Начальник службы безопасности|НСБ]], или [[Директор учреждения|Директором Учреждения]], или [[Главный комендант|Главным комендантом]] по следующей причине:&lt;br /&gt;
**Имеются подозрения в сговоре.&lt;br /&gt;
&lt;br /&gt;
====&#039;&#039;&#039;Этап 4: Исполнение перевода&#039;&#039;&#039;====&lt;br /&gt;
*После реализации опции или отказа от нее, Переводимому вводится утвержденная доза амнезиака класса D.&lt;br /&gt;
&lt;br /&gt;
*После потери сознания с него снимается униформа сотрудника и выдается стандартная униформа персонала класса-Д.&lt;br /&gt;
&lt;br /&gt;
*Присваивается новый идентификационный номер (D-XXXX).&lt;br /&gt;
**Номер присвоить и поменять должность можно с помощью консоли ID карт.&lt;br /&gt;
&lt;br /&gt;
*Объект перемещается в ЗСД (Д-блок).&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Понижение&amp;quot;&amp;gt;&lt;br /&gt;
Вид обязательного добавочного наказания, предусматривающий понижение / отстранение от действующей смены с последующим разбирательством на РУ. Помните о необходимости [[Бюрократия|задокументировать]] понижение.&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Причины для понижения&lt;br /&gt;
|Цвет_карточки=#000000&lt;br /&gt;
|Цвет_заголовка=#536715&lt;br /&gt;
|Скрыто_по_умолчанию=нет&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала/Увольнение/Причины для понижения}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Казнь&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;Казнь - санкционированное убийство с последующим запретом на реанимирование.&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
==&#039;&#039;&#039;Процедура казни:&#039;&#039;&#039;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;==&lt;br /&gt;
===&#039;&#039;&#039;1. Основания для казни&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*Убийство члена руководящего состава и выше.&lt;br /&gt;
*Убийство более чем двух сотрудников комплекса.&lt;br /&gt;
*Попытку насильственного свержения власти на территории объекта фонда SCP.&lt;br /&gt;
*Враги Фонда.&lt;br /&gt;
*Нарушение одной и более статьей класса V&lt;br /&gt;
===&#039;&#039;&#039;2. Процедура принятия решения&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*Решение об казни принимает Директор учреждения или уполномоченное лицо (Главный комендант, Начальник службы безопасности)&lt;br /&gt;
*Решение должно быть &#039;&#039;&#039;задокументировано&#039;&#039;&#039;.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;3. Исполнители&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*Непосредственными исполнителями являются сотрудники службы безопасности.&lt;br /&gt;
*Медицинский персонал должен присутствовать для подтверждения смерти.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
===&#039;&#039;&#039;4. Метод казни&#039;&#039;&#039;&amp;lt;br&amp;gt;===&lt;br /&gt;
*Инъекция быстродействующего летального препарата - это наиболее клинический и контролируемый метод.&lt;br /&gt;
*Огнестрельное оружие (в случаях, требующих немедленного реагирования на угрозу или невозможность выполнение 1 варианта).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Не забывайте, что сотрудник Фонда &#039;&#039;&#039;имеет право&#039;&#039;&#039; попросить на последок с кем-то поговорить или сказать своё последние слово.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Типы нарушений==&lt;br /&gt;
{{#tag:h3|Класс I|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс I&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс I&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс I}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h3|Класс II|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс II&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс II&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс II}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h3|Класс III|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс III&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс III&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс III}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h3|Класс IV|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс IV&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс IV&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс IV}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h3|Класс V|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Класс V&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Класс V&lt;br /&gt;
|Цвет_карточки=#1A1A1A&lt;br /&gt;
|Цвет_заголовка=#1A1A1A&lt;br /&gt;
|Скрыто_по_умолчанию=да&lt;br /&gt;
|Содержимое_отступ=6px&lt;br /&gt;
|Содержание={{Закон персонала ПКСВТ/Типы нарушений/Класс V}}&lt;br /&gt;
|}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%91%D1%8E%D1%80%D0%BE%D0%BA%D1%80%D0%B0%D1%82%D0%B8%D1%8F&amp;diff=17631</id>
		<title>Обсуждение:Бюрократия</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%91%D1%8E%D1%80%D0%BE%D0%BA%D1%80%D0%B0%D1%82%D0%B8%D1%8F&amp;diff=17631"/>
		<updated>2026-03-29T17:56:42Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Эта страница является руководством по ведению документации и работе с бюрократической машиной Фонда.&lt;br /&gt;
&lt;br /&gt;
== Структура управления Фонда ==&lt;br /&gt;
Прежде введём базовые понятия:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Иерархия&#039;&#039;&#039; — это система отношений, регулирующих распределение власти, ресурсов, ответственности и престижа внутри организации. Она представляет собой последовательное подчинение элементов от низшего уровня к высшему, что подчёркивает многоуровневую природу социальной структуры.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Бюрократия&#039;&#039;&#039; — форма управления, основанная на деятельности специализированного аппарата должностных лиц, обладающих профессиональной подготовкой и действующих строго в пределах установленных полномочий. В рамках бюрократии решения принимаются по формализованным процедурам, что обеспечивает устойчивость, предсказуемость и порядок в работе организации.&lt;br /&gt;
&lt;br /&gt;
Фонд использует &#039;&#039;&#039;матричную модель организации&#039;&#039;&#039; — структуру управления, при которой сотрудники могут подчиняться сразу нескольким руководителям. Такой подход позволяет сочетать гибкость и функциональную специализацию, в отличие от классической линейной системы управления. Иными словами, у рядового сотрудника может быть более одного руководителя, при этом из разных отделов.&lt;br /&gt;
&amp;lt;hr style=&amp;quot;border-color:#606264; margin: 0 0 0 0;&amp;quot;&amp;gt;&lt;br /&gt;
== Кодификация документов ==&lt;br /&gt;
При составлении документа, которого нет в перечне шаблонов, следует включить основные элементы документа. Для написания документа от руки предлагается следующее:&lt;br /&gt;
&lt;br /&gt;
* КОД-КОД: указывается код отправляющего отдела и код принимающего отдела. Если документ предназначен для внутреннего использования отдела, то пишется только код этого отдела. В случае личного обращения код не указывается.&lt;br /&gt;
&lt;br /&gt;
* Если документ напрямую касается объекта на содержании, то должен указываться код администрации учреждения.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Коды отделов&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;АДМ&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Администрация учреждения&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;КПЭ&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Комитет по этике&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;О4&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Штаб О4&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;РУ&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Региональное управление&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;O5&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Фактотум O5&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;ОСН&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Служба отряда специального назначения&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;КОМ&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Комендатура&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;НС&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Научная служба&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;МС&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Медицинская служба&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;ИТС&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Инженерно-техническая служба&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;ОЛ&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Служба логистики&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;СЕР&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Сервисная служба&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | &#039;&#039;&#039;КD&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;text-align:center;&amp;quot; | Класс D&lt;br /&gt;
|}&lt;br /&gt;
Для корректной обработки документа необходимо указаны следующие:&lt;br /&gt;
* Идентификатор учреждения — номер текущего Участка. Документы внешних служб указывают свою Зону, либо Участок, для которого предназначен документ.&lt;br /&gt;
* Составитель — полное имя составителя документа.&lt;br /&gt;
* Должность — полное наименование должности составителя.&lt;br /&gt;
* Отправитель и получатель — код отдела, либо полное имя или должность, если документ относится именно к отдельному сотруднику. Указываются в формате КОД-КОД (к прим.: АДМ-РУ)&lt;br /&gt;
Необязательным пунктом является подпись. Она заполняется произвольно и может включать полное имя, должность сотрудника, его отдел или любую информацию, позволяющую идентифицировать его (к прим.: Альфред Голдштейн, директор)&lt;br /&gt;
&lt;br /&gt;
=Уровни допуска и гриф секретности=&lt;br /&gt;
Уровень допуска сотрудника Фонда соответствует максимальному уровню секретности информации, к которой он может получить доступ. Однако это не означает автоматического получения доступа ко всей соответствующей информации: доступ к данным предоставляется по принципу служебной необходимости и на усмотрение сотрудников конкретных отделов, уполномоченных раскрывать эту информацию.&lt;br /&gt;
&lt;br /&gt;
=== Уровень 0 (Для общего пользования) ===&lt;br /&gt;
Уровень допуска 0 выдаётся сотрудникам, не представляющим особой ценности, которым не требуется доступ к информации об аномальных артефактах или существах, содержащихся Фондом. Как правило, уровень допуска 0 имеется у сотрудников, занимающих должности в канцелярии и отделе снабжения учреждений, непосредственно не связанных с содержанием объектов, а также у обслуживающего персонала таких учреждений.&lt;br /&gt;
&lt;br /&gt;
В редких случаях по разрешению Комитета по этике уровень допуска 0 могут быть получен членами семьи сотрудника.&lt;br /&gt;
&lt;br /&gt;
=== Уровень 1 (Для служебного пользования, Общий) ===&lt;br /&gt;
Уровень допуска 1 выдаётся сотрудникам, работающим в непосредственной близости от аномальных объектов или существ, но не обладающих к ним прямым, непрямым или информационным доступом, а также сотрудникам, имеющим дело с засекреченной информацией. Как правило, уровень допуска 1 имеется у сотрудников, занимающих должности в канцелярии и отделе снабжения учреждений, непосредственно занимающихся содержанием объектов, а также у обслуживающего персонала таких учреждений.&lt;br /&gt;
&lt;br /&gt;
Документ с этим уровнем доступен всем сотрудникам Фонда, осведомлённым о его деятельности. Если кто-то получает зарплату от Фонда, он сможет увидеть этот документ.&lt;br /&gt;
&lt;br /&gt;
=== Уровень 2 (Для ограниченного пользования, Ограничен) ===&lt;br /&gt;
Уровень допуска 2 выдаётся сотрудникам службы безопасности и научным сотрудникам, которым необходим прямой доступ к базовой информации касательно аномальных объектов или существ, находящихся на содержании. Большинство научных сотрудников, полевых агентов и специалистов по содержанию обладают уровнем допуска 2.&lt;br /&gt;
&lt;br /&gt;
Документ с этим уровнем доступен большинству сотрудников по запросу. Если у сотрудника есть подчиненный, то он уже владеет 2 уровнем допуска. Если у сотрудника нет подчиненных, то доступ к документу они должны запросить у своего руководителя.&lt;br /&gt;
&lt;br /&gt;
=== Уровень 3 (Служебный) ===&lt;br /&gt;
Уровень допуска 3 выдаётся старшим сотрудникам службы безопасности и научным сотрудникам, которым необходим доступ к подробной информации касательно аномальных объектов или существ, находящихся на содержании, включая их происхождение, обстоятельства изъятия и долгосрочные планы на них. Большинство старших научных сотрудников, руководителей проектов, офицеров службы безопасности, членов групп реагирования и оперативников МОГ обладают уровнем допуска 3.&lt;br /&gt;
&lt;br /&gt;
Документ с этим уровнем доступен меньшинству сотрудников. Основной административный персонал Зоны имеет 3 уровень допуска. Если у сотрудника есть подчиненный, но он не имеет 3 уровень допуска, он должен запросить доступ к документу у административного персонала своей зоны. Если у сотрудника нет подчиненного, он должен запросить доступ у своего руководителя, который затем запросит доступ у административного персонала зоны.&lt;br /&gt;
&lt;br /&gt;
=== Уровень 4 (Секретно) ===&lt;br /&gt;
Уровень допуска 4 выдаётся старшему управленческому персоналу, которому необходим доступ ко всей информации отдельного учреждения и/или региона, а также к долгосрочным планам касательно операций и научных проектов Фонда. Как правило, 4 уровнем допуска обладают только руководители Зон, руководители служб безопасности учреждений и командующие МОГ.&lt;br /&gt;
&lt;br /&gt;
Документ с этим уровнем доступен ТОЛЬКО административному персоналу Зоны и Фонда. Доступ сотрудникам без 4 уровня допуска, как правило, будет отклонен и одобрен только для очень конкретных целей.&lt;br /&gt;
&lt;br /&gt;
=== Уровень 5 (Строго секретно) ===&lt;br /&gt;
Уровень допуска 5 выдаётся сотрудникам высшего управленческого звена Фонда и гарантирует практически полный доступ ко всей стратегической и секретной информации.&lt;br /&gt;
&lt;br /&gt;
Документ с этим уровнем доступен ТОЛЬКО высшему административному персоналу Фонда, например Комитету по этике или Совету O5. Всем, у кого нет доступа 5-го уровня, точно будет отказано в доступе.&lt;br /&gt;
&lt;br /&gt;
== Связь с внешними отделами ==&lt;br /&gt;
Нередко руководству учреждения необходимо связываться с остальным Фондом. Прежде всего это: &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Региональное управление&#039;&#039;&#039; — это штаб-квартира в крупнейшей Зоне страны или региона, координирующие работу учреждений в своей зоне ответственности. Через региональный штаб проходят отчёты о состоянии Участка, логистике и важной проектной деятельности. Они также дают рекомендации и спускают вниз решения других отделов. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Штаб О4&#039;&#039;&#039; — Отвечают за Изоляцию и локализацию угроз в учреждениях Фонда. Штаб отвечает на запросы при чрезвычайных ситуациях и курируют процесс Изоляции назначенными силами МОГ. К штабу также следует обращаться в случае множественных нарушений условий содержания, вторжения, мятежа, шпионажа и прочих происшествий, с локализацией Участок не может справится собственными силами. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Комитет по этике&#039;&#039;&#039; — это независимая контора, занимающуюся рецензированием особых условий содержания и проверкой проводимых экспериментов на предмет избыточного или нецелевого расхода ресурсов. Комитет отвечают за то, чтобы Фонд не сошёл со своей дороги. К ним необходимо обращаться в случае злоупотребления властью со стороны администрации, а также крупных этических нарушений.&lt;br /&gt;
&lt;br /&gt;
Связь с отделами осуществляется посредством факсов.&lt;br /&gt;
&amp;lt;hr style=&amp;quot;border-color:#606264; margin: 0 0 0 0;&amp;quot;&amp;gt;&lt;br /&gt;
== Шаблоны документов ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;copyable-pre-container auto-fill-enabled&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot; style=&amp;quot;background-color:#3a3a3a; width:100%;&amp;quot;&lt;br /&gt;
! colspan=2 style=&amp;quot;font-weight: normal; line-height: 1; font-size: 18x; padding: 10px; background-color:#2d2d35; color:white; text-align:center;&amp;quot; | Стандартная форма документа&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|style=&amp;quot;width:1080px&amp;quot;|&lt;br /&gt;
&amp;lt;pre class=&amp;quot;copyable-text&amp;quot; style=&amp;quot;white-space: pre-wrap; background-color: #303037;color:white;color:white;font-family:monospace&amp;quot;&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|   [head=1]SCP[/head]&lt;br /&gt;
|   [bold]Обезопасить. Удержать. Сохранить.[/bold]&lt;br /&gt;
|   Предназначается для класса С+.&lt;br /&gt;
|   Является юридической собственностью Фонда SCP.&lt;br /&gt;
|   Участок-XX | Код-Код&lt;br /&gt;
▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬&lt;br /&gt;
|   [head=3]Тема документа[/head]&lt;br /&gt;
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾&lt;br /&gt;
|   [bold]Дата и время:[/bold]&lt;br /&gt;
|   [bold]Автор документа:[/bold]&lt;br /&gt;
|   [bold]Должность:[/bold]&lt;br /&gt;
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾&lt;br /&gt;
|   [bold]Содержание:[/bold] &lt;br /&gt;
|   [bold]Обращение:[/bold]&lt;br /&gt;
|   [bold]Подпись:[/bold]_&lt;br /&gt;
‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾&lt;br /&gt;
|   [italic]Место для печатей[/italic]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;hr style=&amp;quot;border-color:#606264; margin: 0 0 0 0;&amp;quot;&amp;gt;&lt;br /&gt;
 {{Документы/Руководство_учреждения}}&lt;br /&gt;
 {{Документы/Комендатура}}&lt;br /&gt;
 {{Документы/Отряд_особого_назначения}}&lt;br /&gt;
 {{Документы/Научная_служба}}&lt;br /&gt;
 {{Документы/Медицинская_служба}}&lt;br /&gt;
 {{Документы/Инженерно_техническая_служба}}&lt;br /&gt;
 {{Документы/Служба_логистики}}&lt;br /&gt;
 {{Документы/Сервисная_служба}}&lt;br /&gt;
 {{Документы/Связь_с_руководством_фонда}}&lt;br /&gt;
&amp;lt;hr style=&amp;quot;border-color:#606264; margin: 0 0 0 0;&amp;quot;&amp;gt;&lt;br /&gt;
 {{Документы/Руководство_Фонда}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;hr style=&amp;quot;border-color:#606264; margin: 0 0 0 0;&amp;quot;&amp;gt;&lt;br /&gt;
== Справочная информация по форматированию документов ==&lt;br /&gt;
Составляя документ вы можете использовать следующий синтаксис:&lt;br /&gt;
&lt;br /&gt;
Для изменения цвета текста используется &amp;lt;code&amp;gt;[color=tan]&amp;lt;/code&amp;gt;. [color=tan] &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Это будет выглядеть так &amp;lt;/span&amp;gt;[/color]&lt;br /&gt;
&lt;br /&gt;
Для создания заголовка используется &amp;lt;code&amp;gt;[head=n]&amp;lt;/code&amp;gt;. [head=n] &amp;lt;big&amp;gt;&amp;lt;big&amp;gt;Заголовок&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt; [/head], где n уровень (размер) заголовка от 1 до 3. n1 — самый большой заголовок, n3 — самый маленький заголовок.&lt;br /&gt;
&lt;br /&gt;
[bullet] ◦ Пункт списка — для вставки маркера списка&lt;br /&gt;
&lt;br /&gt;
[bold] &#039;&#039;&#039;Полужирный текст&#039;&#039;&#039; [/bold] — чтобы выделить текст полужирным шрифтом (bold)&lt;br /&gt;
&lt;br /&gt;
[italic] &#039;&#039;Курсивный текст&#039;&#039; [/italic] — чтобы выделить текст курсивом (italic)&lt;br /&gt;
&lt;br /&gt;
Можно комбинировать теги bold и italic, или использовать сокращение [bolditalic] для выделения текста и полужирным шрифтом, и курсивом. &lt;br /&gt;
&lt;br /&gt;
Цвет можно указать как в виде трёх пар шестнадцатеричных цифр, так и ключевым словом (на английском), например:&lt;br /&gt;
&lt;br /&gt;
[color=#57a343] &amp;lt;span style=&amp;quot;color: #57a343;&amp;quot;&amp;gt; Текст цвета #57a343 по hex &amp;lt;/span&amp;gt; [/color] — [https://csscolor.ru/| Палитра цветов hex]&lt;br /&gt;
&lt;br /&gt;
[color=yellow] &amp;lt;span style=&amp;quot;color: yellow;&amp;quot;&amp;gt; Жёлтый текст &amp;lt;/span&amp;gt; [/color] — цвета на английском&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B1%D1%89%D0%B5%D0%B5_%D0%A1%D0%9F_%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B0_%D1%83%D1%87%D1%80%D0%B5%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=17510</id>
		<title>Шаблон:Общее СП Руководства учреждения</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9E%D0%B1%D1%89%D0%B5%D0%B5_%D0%A1%D0%9F_%D0%A0%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B0_%D1%83%D1%87%D1%80%D0%B5%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F&amp;diff=17510"/>
		<updated>2026-03-24T16:03:21Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#tag:h2|Стандартные Протоколы Руководства учреждения|style=&amp;quot;width: 0; overflow: hidden; height: 0; margin: 0;&amp;quot;|id=&amp;quot;Стандартные Рабочие Процедуры&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Название=Стандартные Протоколы Руководства учреждения&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Член руководства обязан&amp;quot;&amp;gt;&lt;br /&gt;
;1. Обеспечить продуктивность при выполнении отделом должностных обязанностей и указаний Регионального Управления, при необходимости выполнять работу самому.&lt;br /&gt;
;2. Исполнять процедуры и протоколы командования.&lt;br /&gt;
:2.1 В случае если процедура или протокол оказываются невозможными для исполнения и/или существует намного более эффективный способ исполнять процедуру или протокол другим методом, следует исполнить именно его.&lt;br /&gt;
;3. Удостовериться, что сотрудники, проходящие в комплексе стажировку, имеют наставника для обучения. При необходимости провести обучение самостоятельно.&lt;br /&gt;
;4. Осуществлять руководство своими сотрудниками и действовать в соответствии с Рабочим стандартом, КЭ, ПК и установленной этикой.&lt;br /&gt;
;5. Обеспечить ведение всей документации по работе отдела.&lt;br /&gt;
;6. По запросу Сотрудника 4 УД имеющего основания, предоставить интересующий его документ. В случае отсутствия запрашиваемого документа, составить его.&lt;br /&gt;
:6.1 Если составление документа не представляется возможным/не имеет смысла - Возможно отклонить запрос.&lt;br /&gt;
;7. При запросе отчета Директором учреждения, РУ и другими вышестоящими лицами - составить в течение 10 минут и доставить его факси́милиальным аппаратом на место работы сотрудника.&lt;br /&gt;
:7.1 Допускается доставка из рук в руки составленного отчета.&lt;br /&gt;
;8. В случае объявления важного мероприятие высокопоставленным сотрудником на котором требуется присутствовать, следует явиться на него.&lt;br /&gt;
;9. Своевременно отвечать на запросы по рации.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Член руководства имеет право&amp;quot;&amp;gt;&lt;br /&gt;
;1. Проводить брифинги, инструктажи и индивидуальные беседы с подчиненными и другие профессионально-организационные виды деятельности необходимые по мнению главы мероприятия.&lt;br /&gt;
;2. Создавать правила работы в отделе на свое усмотрение и/или отдавать правомерные приказы сотрудникам, если они не противоречат Рабочим Стандартам, Этичности и Правовому Кодексу. А так если не уменьшают эффективность отдела.&lt;br /&gt;
;3. Ограничить реализацию любых прав (дозволений) сотрудников отдела, прописанных в его рабочем стандарте, если это необходимо для повышения эффективности работы отдела. Если это не противоречит Этичности.&lt;br /&gt;
;4. В любой код носить ручное короткоствольное стрелковое оружие малого калибра в количестве 1 единицы.&lt;br /&gt;
:4.1 Использовать любые не аномальные средства в случае угрозы жизни или чрезвычайную ситуацию.&lt;br /&gt;
;5. В случае невозможности связаться с Директором учреждения, написать запрос на вызов любого подразделения МОГ.&lt;br /&gt;
;6. Написать запрос на вызов членов Регионального Управления.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Члену руководства запрещено&amp;quot;&amp;gt;&lt;br /&gt;
;1. Сквернословить, а так же проявлять открытое неуважение к сотрудникам фонда.&lt;br /&gt;
;2. Входить в Д-блок начиная с 4 Уровня Допуска. &lt;br /&gt;
:2.1 Исключения: Начальник службы безопасности, Представитель Комитета по Этике.&lt;br /&gt;
;3. Контактировать с неразумными и\или опасными SCP объектами начиная с 4 Уровня Допуска. &lt;br /&gt;
:3.1 Исключения: Главный научный сотрудник, Начальник службы безопасности&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:SCP-049&amp;diff=17024</id>
		<title>Обсуждение:SCP-049</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:SCP-049&amp;diff=17024"/>
		<updated>2026-03-07T12:45:31Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#seo:&lt;br /&gt;
 |title={{BASEPAGENAME}}&lt;br /&gt;
 |description=Статья о игре за {{BASEPAGENAME}} на сервере Fire Station!&lt;br /&gt;
 |keywords=Space Station 14, Космическая Станция 14, ss14, сс14, кс14, ss13, сс13, кс13, вики, wiki, фаер, игра, ролевая, roleplay, рп, 2d песочница, космос, игровой сервер, Fire Station, FireStation 14, Fire Station SS14, FireStation, FS14.&lt;br /&gt;
 |type=website&lt;br /&gt;
 |image=SCP049.png&lt;br /&gt;
 |site_name=Fire Station WIKIPEDIA&lt;br /&gt;
 |locale=ru_RU}}&lt;br /&gt;
{{Карточка&lt;br /&gt;
|Название=SCP-049 «Чумной доктор»&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Изображение=[[File:SCP049.png|128px]]&lt;br /&gt;
|1_название=Класс объекта&lt;br /&gt;
|1_текст=&amp;lt;b style=&amp;quot;color: #c07d1e&amp;quot;&amp;gt;Евклид&amp;lt;/b&amp;gt;&lt;br /&gt;
|2_название=Условия для открытия&lt;br /&gt;
|2_текст=• 200 &#039;&#039;&#039;&amp;lt;span style=&amp;quot;color:gray&amp;quot;&amp;gt;Общих&amp;lt;/span&amp;gt;&#039;&#039;&#039; часов&lt;br /&gt;
|3_название=Вайтлист&lt;br /&gt;
|3_текст={{Вайтлист}}&lt;br /&gt;
}}&lt;br /&gt;
{{quote|Из розочек веночки, карман полный цветочков. Апчхи, апчхи! И мы упали вниз.}}&lt;br /&gt;
:&#039;&#039;&#039;{{BASEPAGENAME}}&#039;&#039;&#039; - SCP класса &amp;quot;&amp;lt;span style=&amp;quot;color:  #c07d1e&amp;quot;&amp;gt;Евклид&amp;lt;/span&amp;gt;&amp;quot; который был ему присвоен из-за крайней непредсказуемости.&lt;br /&gt;
= Будучи SCP =&lt;br /&gt;
== Кто такой {{BASEPAGENAME}} в Space Station 14 ==&lt;br /&gt;
SCP-049 &amp;quot;Чумной доктор&amp;quot; представляет из себя гуманоидное существо с выраженным клювом, который является частью его тела. &lt;br /&gt;
=== Как нарушить условия содержания? ===&lt;br /&gt;
В случае если Фонд в наглую нарушает [[Контракт_SCP-049|контракт]], не предоставляет вам необходимые и разрешенные инструменты для операций, а также пациентов не реже раза 20 минут по вашему запросу - вы можете начать буйствовать, сломать выход из своей камеры содержания и уйти за необходимым.&lt;br /&gt;
&lt;br /&gt;
=== Что можно делать, после нарушения условий содержания? ===&lt;br /&gt;
==== Поиск необходимого ====&lt;br /&gt;
В случае, если Фонд не выдал вам разрешенного оборудования - вы можете сами пойти за ним.&lt;br /&gt;
==== Лечение мертвых ====&lt;br /&gt;
Если на вашем пути повстречаются трупы - вы в праве исцелить их сделав ходячими мертвецами. После лечения возникают [[SCP-049-2]].&lt;br /&gt;
&lt;br /&gt;
==== SCP-049-2 ====&lt;br /&gt;
[[SCP-049-2]] имеет такой же порог вхождения в критическое состояние как и обычные люди. Однако субъекты 049-2 более уязвимы к термическому урону (лазерное оружие, импульсное оружие, горение и т.д.). [[SCP-049-2]] можно стать только после операции объекта 049. Впоследствии лечения, [[SCP-049-2]] обретает очень сильные физические и атлетические способности, что позволяет ему прокусывать стены, ломать мебель и стёкла, а также прыгать на расстояние до 3-х из точки А в точку В, скидывая с ног свою жертву. Внешне [[SCP-049-2]]И отличается от обычного человека лишь красными глазами. [[SCP-049-2]] крайне агрессивен к другим живым существам (животные, люди, носитель SCP-035) и поэтому их следует устранять и кремировать почти сразу же после появления кроме случаев синтезации [[Амбузол|Амбузола]], в медицинском отсеке есть крематорий для данных функций.&lt;br /&gt;
&lt;br /&gt;
== Советы по отыгрышу ==&lt;br /&gt;
# SCP-049 считает себя доктором 15-го века, и общается на манер этих времён.&lt;br /&gt;
# SCP-049 охотно идёт на контакт со своими “коллегами по цеху” т.е. Научным и Медицинским персоналом. &lt;br /&gt;
# В обычном состоянии SCP-049 не проявляет агрессии и зачастую подчиняется требованиям Фонда, но при наличии раздражающих факторов - SCP-049 может проявлять агрессию, которую Фонд пресекает как диалогом, так и силовыми методами. &lt;br /&gt;
# SCP-049 зачастую сменяет гнев на милость, когда ему предоставляют “подопытных”.&lt;br /&gt;
# Цель SCP-049 - излечить мир от поветрия, в связи с чем он и ставит опыты над людьми.&lt;br /&gt;
# Вы как разумный SCP можете кооперироваться с другими разумными объектами если это выгодно вам.&lt;br /&gt;
&lt;br /&gt;
== Отношения к другим SCP ==&lt;br /&gt;
* SCP-999 для вас интересная форма жизни. Вы дружелюбны к нему.&lt;br /&gt;
* SCP-173 для вас не интересен. Это статуя, проявляющая агрессию к пациентам.&lt;br /&gt;
* SCP-131 для вас интересная форма жизни. Странные био-механические шарики.&lt;br /&gt;
* SCP-106 вас не интересует, он неизлечим.&lt;br /&gt;
* SCP-096 вас не интересует, считаете его психически не излечимым.&lt;br /&gt;
* SCP-939 вас не интересует, так как это не человек и не болеет поветрием.&lt;br /&gt;
&lt;br /&gt;
Вы опасаетесь всех агрессивных [[Объекты|SCP]], так как они несут вред пациентам.&lt;br /&gt;
&lt;br /&gt;
== Правила игры ==&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Разрешено&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;!--Все, что разрешено--&amp;gt;&lt;br /&gt;
; 1. Взаимодействовать с людьми в ролевом ключе: выполнять роль доктора, лечить людей, проводить операции и консультировать.&lt;br /&gt;
; 2. Ставить различные опыты над предоставляемыми людьми для опытов (Включая обращение в SCP-049-2, или же Зомби).&lt;br /&gt;
; 3. Обращать любой персонал в SCP-049-2 (Зомби) во время Нарушения Особых Условия Содержания при условии агрессии с их стороны.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Запрещено&amp;quot;&amp;gt;  &lt;br /&gt;
&amp;lt;!--Все, что запрещено--&amp;gt;&lt;br /&gt;
; 1. Без особых на то причин нарушать [[Контракт SCP-049|контракт]],  Особые Условия Сдерживания и покидать Камеру (Примеры причин для НУС - Явное неуважение со стороны персонала Фонда (Исключение - Класс Д); Подрыв камеры содержания; Открытая дверь и отсутствие персонала).&lt;br /&gt;
; 2. Беспричинно атаковать персонал фонда. (так же приказывать SCP 049-2 атаковать людей просто так).&lt;br /&gt;
; 3. Игнорировать требования психолога при условии, что к вам не было проявлено агрессии и все доводы психолога были логичны.&lt;br /&gt;
; 4. Вы не знаете, что [[SCP-035]] есть в зоне, вам нельзя намеренно идти в сторону его КС.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ваши способности ==&lt;br /&gt;
=== Способности в основном теле ===&lt;br /&gt;
{| class=&amp;quot;wikitable noresize&amp;quot; style=&amp;quot;width: 100%&amp;quot;&lt;br /&gt;
! style=&amp;quot;background-color: ##536715;&amp;quot; | Изображение&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width: 30%&amp;quot; | Способность&lt;br /&gt;
! style=&amp;quot;background-color: ##536715; width: 60%&amp;quot; | Описание&lt;br /&gt;
! style=&amp;quot;background-color: ##536715;&amp;quot; | КД (секунды)&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
[[Файл:SCP049Воскрешение.png|центр|64px|альт=Воскрешение|link=]]&lt;br /&gt;
| Воскрешение&lt;br /&gt;
| Превратить мертвое тело в вашего верного пациента. Требует наличия определенного хирургического инструмента.&lt;br /&gt;
| 120 секунд&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
[[Файл:SCP049Умертвить.png|центр|64px|альт=Умертвить воскрешенного|link=]]&lt;br /&gt;
| Умертвить воскрешенного&lt;br /&gt;
| Мгновенно убить ранее воскрешенного пациента.&lt;br /&gt;
| 5 секунд&lt;br /&gt;
|-&lt;br /&gt;
| [[Файл:SCP049СмертельноеПрикосновение.png|центр|64px|альт=Смертельное прикосновение|link=]]&lt;br /&gt;
| Смертельное прикосновение&lt;br /&gt;
| Мгновенно убить живое существо прикосновением.&lt;br /&gt;
| 180 секунд&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
[[Файл:SCP049Исцеление.png|центр|64px|альт=Самоисцеление|link=]]&lt;br /&gt;
| Самоисцеление&lt;br /&gt;
| Восстановить здоровье и снять все негативные эффекты.&lt;br /&gt;
| 300 секунд&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
[[Файл:SCP049Исцеление.png|центр|64px|альт=Исцеление пациента|link=]]&lt;br /&gt;
| Исцеление пациента&lt;br /&gt;
| Возвращает жизненные силы и снимает все негативные эффекты с вашего пациента.&lt;br /&gt;
| 300 секунд&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Будучи сотрудником фонда =&lt;br /&gt;
{{#tag:h2|Особые Условия Содержания, как избежать побега объекта|style=&amp;quot;width: 0; overflow: hidden; margin: 0; height: 0;&amp;quot;|id=&amp;quot;Особые Условия Содержания, как избежать побега объекта&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Название=Особые Условия Содержания, как избежать побега объекта&lt;br /&gt;
|Содержание= &lt;br /&gt;
Чтобы избежать побега SCP-049 требуется своевременное выполнение адекватных запросов объекта, а так же обслуживание камеры содержания. Чтобы не злить объект стоит называть его &amp;quot;Доктором&amp;quot;.&lt;br /&gt;
}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Название=Предметы, помогающие в ОУС объекта&lt;br /&gt;
|Содержание=&lt;br /&gt;
{{Снаряжение049}}&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h2|Протокол возврата SCP|style=&amp;quot;width: 0; overflow: hidden; margin: 0; height: 0;&amp;quot;|id=&amp;quot;Протокол возврата SCP&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Название=Протокол возврата SCP&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;div class=&amp;quot;dt-plain&amp;quot;&amp;gt;&lt;br /&gt;
; 1. В случае нарушений условий содержания объектом, требуется отремонтировать его камеру содержания и вербальным способом вернуть объект обратно.&lt;br /&gt;
: 1.1. Для вербального возвращения объекта в камеру содержания следует использовать медицинского сотрудника с познанием в психологии. &lt;br /&gt;
: 1.2. Если объект разъярен следует использовать успокаивающие чаи.&lt;br /&gt;
: 1.3. Если медицинского персонала нет в комплексе можно предложить объекту подопытных за возвращение в камеру.&lt;br /&gt;
; 2. Ни при каких обстоятельствах не разговаривать с объектом с позиции силы. &lt;br /&gt;
: 2.1. Применение силы к объекту является последней и крайней мерой.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{#tag:h2|Знания персонала о {{BASEPAGENAME}}|style=&amp;quot;width: 0; overflow: hidden; margin: 0; height: 0;&amp;quot;|id=&amp;quot;Знания экипажа о {{BASEPAGENAME}}&amp;quot;}}&lt;br /&gt;
{{Рамка&lt;br /&gt;
|Цвет_карточки=#c07d1e&lt;br /&gt;
|Цвет_заголовка=#c07d1e&lt;br /&gt;
|Название=Знания персонала о {{BASEPAGENAME}}&lt;br /&gt;
|Содержание=&lt;br /&gt;
&amp;lt;tabs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;Ниже 2 УД&amp;quot;&amp;gt;&lt;br /&gt;
Вы впервые видите этого человека. Вас слегка настораживает его &amp;quot;маска&amp;quot; с длинным клювом. &lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tab name=&amp;quot;2 УД и выше&amp;quot;&amp;gt;&lt;br /&gt;
Вам известно, что {{BASEPAGENAME}} это существо способное убивать касанием и воскрешать мертвых, превращая их в послушных ходячих мертвецов. Вам известно о [[Контракт_SCP-049|контракте]] с объектом.&lt;br /&gt;
&amp;lt;/tab&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tabs&amp;gt;&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
	<entry>
		<id>https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D0%BD%D0%B0%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5049&amp;diff=17023</id>
		<title>Шаблон:Снаряжение049</title>
		<link rel="alternate" type="text/html" href="https://fire.station.wiki.shizainc.com/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A1%D0%BD%D0%B0%D1%80%D1%8F%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5049&amp;diff=17023"/>
		<updated>2026-03-07T12:45:21Z</updated>

		<summary type="html">&lt;p&gt;Mr. Samuel: Mr. Samuel переименовал страницу Шаблон:Снаряжение096 в Шаблон:Снаряжение049 без оставления перенаправления&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Снаряжение !! Описание !!&lt;br /&gt;
|-&lt;br /&gt;
|[[Файл:Имплантер аегис.png|128px]]&lt;br /&gt;
|&#039;&#039;&#039;Имплантер аегис&#039;&#039;&#039; - Переносное устройство, содержащее одноразовый имплант из биосовместимого материала. После установки в организм блокирует воздействие [[SCP-049]] на ткани пользователя, предотвращая хирургическую трансформацию. Разработка на стадии прототипа, возможны побочные эффекты.&lt;br /&gt;
*&amp;quot;Аегис&amp;quot; - простыми словами, &amp;lt;s&amp;gt;позволяет возродится после смерти&amp;lt;/s&amp;gt; не даёт SCP-049 сделать их Вас зомби, &#039;&#039;&#039;НО&#039;&#039;&#039; не защищает от прикосновения SCP-049.&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mr. Samuel</name></author>
	</entry>
</feed>