Wiki source code of Доступ в выходные и праздничные дни
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | Контроллер БОРЕЙ совместно с Платформой НЕЙРОСС позволяют указывать перечень выходных и праздничных дней и ограничивать либо разрешать доступ в такие дни. | ||
| 2 | |||
| 3 | == {{id name="Доступввыходныеипраздничныедни-Общиесведения"/}}Общие сведения == | ||
| 4 | |||
| 5 | При наличии лицензии на графики работы, управление доступом в выходные и праздничные дни обеспечивается посредством функционала [[neyross.АРМ НЕЙРОСС Доступ.Графики работы.Специальные дни.WebHome]]. | ||
| 6 | |||
| 7 | {{info}} | ||
| 8 | (% style="color: rgb(23,43,77);" %)[[neyross.АРМ НЕЙРОСС Доступ.Графики работы.График работы.WebHome]] строится на основе шаблонов графиков и назначения индивидуальных правил: дней нетрудоспособности, отпуска и дополнительных выходных (отгулов), неполного рабочего дня и прочих данных. При этом учитываются специальные дни: государственные праздники, предпраздничные дни, корпоративные праздники и любые другие дни, график работы в которые зависит от календарной даты. (% style="color: rgb(70,70,70);" %)Доступ сотрудника на предприятие осуществляется строго в соответствии с его индивидуальным графиком и только к точкам доступа, заданных Маршрутом. | ||
| 9 | {{/info}} | ||
| 10 | |||
| 11 | При отсутствии необходимости в полновесном функционале графиков работы, доступ в выходные дни ограничивается уровнем доступа (или режимом доступа как совокупности уровней доступа), которые позволяют задать набор временных интервалов доступа в зависимости от дня недели, например, — ограничить доступ в субботу и воскресенье ~[[[neyross.АРМ НЕЙРОСС Доступ.Уровни доступа.WebHome]]]. Однако уровни доступа не позволяют учитывать праздничные дни, а также сдвиг выходных дней. | ||
| 12 | |||
| 13 | {{info}} | ||
| 14 | Для решения задачи управления доступом в выходные и праздничные дни реализован LUA-скрипт, который выполняется непосредственно на контроллере БОРЕЙ и переопределяет (% style="color: rgb(23,43,77);" %)«заводскую» логику работы контроллера. Скрипт позволяет осуществлять дополнительную проверку прав доступа в конкретные дни календаря и принимать решение о разрешении или запрете доступа. Перечень выходных и праздничных дней задаётся пользователем самостоятельно в текстовом формате и обновляется ежегодно. | ||
| 15 | {{/info}} | ||
| 16 | |||
| 17 | == {{id name="Доступввыходныеипраздничныедни-Алгоритмработы"/}}Алгоритм работы == | ||
| 18 | |||
| 19 | При предъявлении валидного идентификатора (карты и проч.) на контроллер БОРЕЙ выполняется базовая проверка прав пользователя. Проверка, является ли текущий день выходным или праздничным, а также проверка прав пользователя на доступ в такие дни выполняется на последнем этапе. Пример последовательности шагов приведен в таблице ниже. | ||
| 20 | |||
| 21 | (% class="wrapped" %) | ||
| 22 | |=((( | ||
| 23 | № шага | ||
| 24 | )))|=((( | ||
| 25 | Название | ||
| 26 | )))|=((( | ||
| 27 | Комментарий | ||
| 28 | ))) | ||
| 29 | |((( | ||
| 30 | 1 | ||
| 31 | )))|((( | ||
| 32 | Поиск пропуска | ||
| 33 | )))|((( | ||
| 34 | По предъявленному идентификатору производится поиск пропуска. Если пропуск не найден, доступ блокируется. Если найден, производится переход к следующему шагу. | ||
| 35 | ))) | ||
| 36 | |((( | ||
| 37 | 2 | ||
| 38 | )))|((( | ||
| 39 | Проверка второго идентификатора (если задано) | ||
| 40 | )))|((( | ||
| 41 | При двухфакторной идентификации осуществляется проверка второго фактора (биометрия по лицам или отпечаткам пальцев, ожидание ввода пин-кода). Если второй этап идентификации не пройден, доступ блокируется. В противном случае производится переход к следующему шагу. | ||
| 42 | ))) | ||
| 43 | |((( | ||
| 44 | 3 | ||
| 45 | )))|((( | ||
| 46 | Проверка режима или уровня доступа | ||
| 47 | )))|((( | ||
| 48 | Производится проверка наличия текущей точки доступа (точки доступа, на которую предъявлен идентификатор) в режиме или уровне доступа пропуска, если режим не задан. Если точки доступа нет в списке, доступ блокируется. В противном случае производится переход к следующему шагу. | ||
| 49 | ))) | ||
| 50 | |((( | ||
| 51 | 4 | ||
| 52 | )))|((( | ||
| 53 | Проверка временных интервалов | ||
| 54 | )))|((( | ||
| 55 | (% class="content-wrapper" %) | ||
| 56 | ((( | ||
| 57 | Проверяется, заданы ли в уровне/режиме доступа временные зоны, и разрешен ли доступ в текущий день недели и в текущее время. Если день недели «выключен» в уровне доступа или текущее время вне временного интервала, доступ блокируется. В противном случае производится переход к следующему шагу. | ||
| 58 | ))) | ||
| 59 | ))) | ||
| 60 | |((( | ||
| 61 | 5 | ||
| 62 | )))|((( | ||
| 63 | Проверка, является ли день выходным/праздничным | ||
| 64 | )))|((( | ||
| 65 | Если день не является выходным или праздничным (не перечислен в конфигурационном файле скрипта), доступ разрешается. Если да, производится переход к следующему шагу. | ||
| 66 | ))) | ||
| 67 | |((( | ||
| 68 | 6 | ||
| 69 | )))|((( | ||
| 70 | Проверка разрешения на доступ в выходные и праздничные дни | ||
| 71 | )))|((( | ||
| 72 | Проверяется, задано ли в свойствах пропуска право доступа в выходные и праздничные дни. Если не задано, доступ блокируется, если задано — разрешается. | ||
| 73 | ))) | ||
| 74 | |||
| 75 | {{info}} | ||
| 76 | **ОБРАТИТЕ ВНИМАНИЕ** | ||
| 77 | |||
| 78 | Проверка разрешения доступа в выходные и праздничные дни производится после проверки наличия ограничений на дни недели во временных зонах. Во избежание наложений рекомендуется в уровне доступа разрешить доступ во все дни, при необходимости задав временные интервалы. | ||
| 79 | {{/info}} | ||
| 80 | |||
| 81 | \\ | ||
| 82 | |||
| 83 | == {{id name="Доступввыходныеипраздничныедни-Порядокнастройки"/}}Порядок настройки == | ||
| 84 | |||
| 85 | === {{id name="Доступввыходныеипраздничныедни-НастройкаПлатформыНЕЙРОСС"/}}Настройка Платформы НЕЙРОСС === | ||
| 86 | |||
| 87 | {{info}} | ||
| 88 | Вам потребуется: | ||
| 89 | |||
| 90 | * Сформировать и загрузить конфигурационный файл со списком выходных и праздничных дней; | ||
| 91 | * Добавить пользовательское свойство, которое будет «отвечать» за разрешение или запрет доступа в выходные и праздничные дни определённым сотрудникам, в конфигурацию системы; | ||
| 92 | * Добавить в форму пропуска поле со свойством, сконфигурированным на предыдущем этапе. | ||
| 93 | {{/info}} | ||
| 94 | |||
| 95 | \\ | ||
| 96 | |||
| 97 | (% style="color: rgb(23,43,77);" %)Скопируйте приведённый ниже код и сохраните в файле calendar.json.(%%) | ||
| 98 | |||
| 99 | {{code}} | ||
| 100 | { | ||
| 101 | "1": [1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 20, 21, 27, 28], | ||
| 102 | "2": [3, 4, 10, 11, 17, 18, 23, 24, 25], | ||
| 103 | "3": [2, 3, 8, 9, 10, 16, 17, 23, 24, 30, 31], | ||
| 104 | "4": [6, 7, 13, 14, 21, 21, 28, 29, 30], | ||
| 105 | "5": [1, 4, 5, 9, 10, 11, 12, 18, 19, 25, 26], | ||
| 106 | "6": [1, 2, 8, 9, 12, 15, 16, 22, 23, 29, 30], | ||
| 107 | "7": [6, 7, 13, 14, 20, 21, 27, 28], | ||
| 108 | "8": [3, 4, 10, 11, 17, 18, 24, 25, 31], | ||
| 109 | "9": [1, 7, 8, 14, 15, 21, 22, 29, 30, 31], | ||
| 110 | "10": [5, 6, 12, 13, 19, 20, 26, 27], | ||
| 111 | "11": [3, 4, 9, 10, 16, 17, 23, 24, 30], | ||
| 112 | "12": [1, 7, 8, 14, 15, 21, 22, 29, 30, 31] | ||
| 113 | } | ||
| 114 | {{/code}} | ||
| 115 | |||
| 116 | {{info}} | ||
| 117 | Файл calendar.json содержит список выходных и праздничных дней на 2024 согласно общероссийскому трудовому календарю. В кавычках указан номер месяца (например, "3" означает Март), далее в квадратных скобках через запятую перечислены выходные и праздничные дни этого месяца (например в марте это дни: 2, 3, 8, 9, 10, 16, 17, 23, 24, 30, 31). | ||
| 118 | {{/info}} | ||
| 119 | |||
| 120 | \\ | ||
| 121 | |||
| 122 | Отредактируйте данные согласно внутреннему трудовому распорядку вашей организации. Сохраните изменения. Файл можно откорректировать в любом текстовом редакторе, например, Блокнот, Notepad++ и другие. | ||
| 123 | |||
| 124 | {{info}} | ||
| 125 | **ПОДСКАЗКА** | ||
| 126 | |||
| 127 | Если вы заполняете календарь в середине года, указывайте даты текущего года для текущего и всех последующих месяцев. Для уже прошедших месяцев есть смысл указывать даты следующего года. | ||
| 128 | {{/info}} | ||
| 129 | |||
| 130 | \\ | ||
| 131 | |||
| 132 | {{id name="Доступввыходныеипраздничныедни-JSON_link"/}}Загрузите полученный конфигурационный файл в файловое хранилище Платформы НЕЙРОСС ~[[[ui.Параметры узла.Накопители и файлы.Файловое хранилище.WebHome]]]. | ||
| 133 | |||
| 134 | [[image:attach:file_storage_calendar.png||width="900"]] | ||
| 135 | |||
| 136 | Скопируйте ссылку на файл. Ссылка потребуется для настройки скрипта в контроллере БОРЕЙ. | ||
| 137 | |||
| 138 | \\ | ||
| 139 | |||
| 140 | Добавьте в конфигурацию Платформы НЕЙРОСС пользовательское свойство пропуска, в котором будет храниться разрешение на доступ в выходные и праздничные дни для определённых сотрудников ~[[[neyross.Настройка Платформы НЕЙРОСС.Настройка функций контроля доступа.Добавление пользовательских свойств.WebHome]]]. | ||
| 141 | |||
| 142 | {{error}} | ||
| 143 | **ВАЖНО** | ||
| 144 | |||
| 145 | Обратите внимание, что требуется добавить пользовательское свойство Пропуска, а не Владельца. | ||
| 146 | {{/error}} | ||
| 147 | |||
| 148 | \\ | ||
| 149 | |||
| 150 | [[image:attach:userfields_days_off_allowed.png||height="250"]] | ||
| 151 | |||
| 152 | |=(% style="width: 82.0px;" %)((( | ||
| 153 | Поле | ||
| 154 | )))|=(% style="width: 29.0px;" %)((( | ||
| 155 | Значение | ||
| 156 | )))|=(% style="width: 517.0px;" %)((( | ||
| 157 | Комментарий | ||
| 158 | ))) | ||
| 159 | |(% style="width: 82.0px;" %)((( | ||
| 160 | Название | ||
| 161 | )))|(% style="width: 29.0px;" %)((( | ||
| 162 | Проход в выходные и праздничные дни | ||
| 163 | )))|(% style="width: 517.0px;" %)((( | ||
| 164 | Название поля может быть любым. | ||
| 165 | ))) | ||
| 166 | |(% style="width: 82.0px;" %)((( | ||
| 167 | Уникальный ключ | ||
| 168 | )))|(% style="width: 29.0px;" %)((( | ||
| 169 | days_off_allowed | ||
| 170 | )))|(% style="width: 517.0px;" %)((( | ||
| 171 | Ключ используется в коде скрипта контроллера БОРЕЙ. Изменение не рекомендуется. | ||
| 172 | ))) | ||
| 173 | |(% style="width: 82.0px;" %)((( | ||
| 174 | Тип данных | ||
| 175 | )))|(% style="width: 29.0px;" %)((( | ||
| 176 | Переключатель | ||
| 177 | )))|(% style="width: 517.0px;" %)((( | ||
| 178 | Другие типы полей скриптом не поддерживаются. | ||
| 179 | ))) | ||
| 180 | |||
| 181 | \\ | ||
| 182 | |||
| 183 | Добавьте новое свойство в форму пропуска ~[[[neyross.Настройка Платформы НЕЙРОСС.Настройка функций контроля доступа.Настройка форм ввода данных.WebHome]]]. Это легко сделать с помощью конструктора форм. | ||
| 184 | |||
| 185 | [[image:attach:userfields_days_off_allowed_to_form.png||width="550"]] | ||
| 186 | |||
| 187 | {{info}} | ||
| 188 | Если вы используете пользовательские HTML-формы, обратитесь к специалистам компании ИТРИУМ за инструкциями по добавлению поля. | ||
| 189 | {{/info}} | ||
| 190 | |||
| 191 | \\ | ||
| 192 | |||
| 193 | === {{id name="Доступввыходныеипраздничныедни-НастройкаБОРЕЙ"/}}Настройка БОРЕЙ === | ||
| 194 | |||
| 195 | {{info}} | ||
| 196 | Вам потребуется с(% style="letter-spacing: 0.0px;" %)формировать и загрузить LUA-скрипт во все контроллеры БОРЕЙ, отвечающие за доступ в выходные и праздничные дни. | ||
| 197 | {{/info}} | ||
| 198 | |||
| 199 | Скопируйте приведённый ниже код. | ||
| 200 | |||
| 201 | {{code}} | ||
| 202 | local pacs = require("pacs") | ||
| 203 | local log = require("log") | ||
| 204 | local common = require("common") | ||
| 205 | local http = require("http") | ||
| 206 | |||
| 207 | local logger = log.get_logger("days_off.lua") | ||
| 208 | |||
| 209 | local CALENDAR_URL = "http://10.1.29.39/api/v1/storage/get_content/?uuid=552370fa-8bb1-47c8-b433-a23d1c5c76ff" | ||
| 210 | local DAYS_OFF_ALLOWED_PROPERTY = "days_off_allowed" | ||
| 211 | |||
| 212 | local DAYS_OFF = {} | ||
| 213 | |||
| 214 | local function is_day_off(date_to_check) | ||
| 215 | logger:debug("checking if day off today") | ||
| 216 | if date_to_check ~=nil then | ||
| 217 | for i,days in pairs(DAYS_OFF) do | ||
| 218 | if i == tostring(date_to_check.tm_mon+1) then | ||
| 219 | for idx,day in pairs(days) do | ||
| 220 | if idx ~= "__type" then | ||
| 221 | if day == date_to_check.tm_mday then | ||
| 222 | logger:debug("It is day off today!") | ||
| 223 | return true | ||
| 224 | end | ||
| 225 | end | ||
| 226 | end | ||
| 227 | end | ||
| 228 | end | ||
| 229 | end | ||
| 230 | logger:debug("It is not day off today!") | ||
| 231 | return false | ||
| 232 | end | ||
| 233 | |||
| 234 | local function days_off_allowed(token) | ||
| 235 | logger:debug("checking process_data for point="..token) | ||
| 236 | if pacs.process_data ~= nil and type(pacs.process_data) == "table" and pacs.process_data[token] ~= nil then | ||
| 237 | for _,process_data in pairs(pacs.process_data[token]) do | ||
| 238 | if process_data.pass then | ||
| 239 | logger:debug("found pass="..process_data.pass.uuid) | ||
| 240 | if process_data.pass.properties then | ||
| 241 | for _,property in pairs(process_data.pass.properties) do | ||
| 242 | if string.sub(property.key,1,string.len(DAYS_OFF_ALLOWED_PROPERTY)) == DAYS_OFF_ALLOWED_PROPERTY then | ||
| 243 | return property.value == "true" | ||
| 244 | end | ||
| 245 | end | ||
| 246 | end | ||
| 247 | end | ||
| 248 | end | ||
| 249 | end | ||
| 250 | return false | ||
| 251 | end | ||
| 252 | |||
| 253 | local function check_day_off_right(token) | ||
| 254 | if days_off_allowed(token) == false then | ||
| 255 | local currenttime = common.now() | ||
| 256 | local datetime = common.localtime(currenttime) | ||
| 257 | logger:info( tostring(datetime.tm_mday) .. "/" .. tostring(datetime.tm_mon+1) .. "/" .. tostring(datetime.tm_year+1900)) | ||
| 258 | logger:info( tostring(datetime.tm_hour) .. ":" .. tostring(datetime.tm_min) .. ":" .. tostring(datetime.tm_sec)) | ||
| 259 | |||
| 260 | if is_day_off(datetime) then | ||
| 261 | return false | ||
| 262 | end | ||
| 263 | end | ||
| 264 | return true | ||
| 265 | end | ||
| 266 | |||
| 267 | -- calendar | ||
| 268 | local calendar_http_handler = {} | ||
| 269 | |||
| 270 | function calendar_http_handler:on_http_response(response_data) | ||
| 271 | if response_data == nil then | ||
| 272 | logger:error("connection has failed; no response received") | ||
| 273 | else | ||
| 274 | logger:debug("response received; status="..response_data.status..", type(body)="..log.stringify(response_data.body)); | ||
| 275 | DAYS_OFF = response_data.body | ||
| 276 | end | ||
| 277 | end | ||
| 278 | |||
| 279 | function check_calendar_update(period) | ||
| 280 | logger:info("Starting timeout on "..tostring(period).." seconds") | ||
| 281 | set_timeout("check_calendar_update_timeout", period*1000) | ||
| 282 | end | ||
| 283 | |||
| 284 | function get_calendar() | ||
| 285 | local http_request = { | ||
| 286 | url = CALENDAR_URL, | ||
| 287 | method = http.METHOD.GET, | ||
| 288 | version = http.VERSION.HTTP10, | ||
| 289 | timeout = 5000 | ||
| 290 | } | ||
| 291 | http.with(calendar_http_handler):transmit(http_request) | ||
| 292 | end | ||
| 293 | |||
| 294 | function check_calendar_update_timeout() | ||
| 295 | logger:info("Timeout!") | ||
| 296 | local currenttime = common.now() | ||
| 297 | local datetime = common.localtime(currenttime) | ||
| 298 | if datetime.tm_hour == 0 and datetime.tm_min == 30 then | ||
| 299 | get_calendar() | ||
| 300 | end | ||
| 301 | check_calendar_update(60) | ||
| 302 | end | ||
| 303 | |||
| 304 | get_calendar() | ||
| 305 | check_calendar_update(60) | ||
| 306 | |||
| 307 | local function inject_patch(instance) | ||
| 308 | |||
| 309 | instance.process_granted = function(self) | ||
| 310 | if (self.anonymous_mode == 0) then | ||
| 311 | local ready = true | ||
| 312 | if (self.state ~= pacs.STATE.READY) then | ||
| 313 | ready = false | ||
| 314 | end | ||
| 315 | |||
| 316 | if ready then | ||
| 317 | logger:debug("all points are ready; checking timezone for pacs") | ||
| 318 | |||
| 319 | if check_day_off_right(self.token) then | ||
| 320 | getmetatable(self).__index.process_granted(self) | ||
| 321 | else | ||
| 322 | pacs_notify(self.token, "A2") | ||
| 323 | getmetatable(self).__index.process_denied(self) | ||
| 324 | end | ||
| 325 | else | ||
| 326 | -- invoke base process_granted implementation | ||
| 327 | logger:debug("access point not ready; DENIE ACCESS") | ||
| 328 | pacs_notify(self.token, "A2") | ||
| 329 | getmetatable(self).__index.process_denied(self) | ||
| 330 | end -- if ready check | ||
| 331 | else | ||
| 332 | logger:debug("Exit pushbutton pressed; GRANTING ACCESS") | ||
| 333 | getmetatable(self).__index.process_granted(self) | ||
| 334 | end | ||
| 335 | end -- process_granted | ||
| 336 | end | ||
| 337 | |||
| 338 | -- inject to every access point if needed | ||
| 339 | for key,instance in pairs(pacs.ap_instance) do | ||
| 340 | logger:debug("injecting patch to ap with id="..instance.id.." (token="..instance.token..")") | ||
| 341 | inject_patch(instance) | ||
| 342 | end | ||
| 343 | |||
| 344 | logger:info("days off script loaded!") | ||
| 345 | |||
| 346 | {{/code}} | ||
| 347 | |||
| 348 | В веб-интерфейсе контроллера БОРЕЙ перейдите к разделу настройки скриптов ~[[[ui.Параметры узла.Скрипты.WebHome]]]. | ||
| 349 | |||
| 350 | В группе **Скрипты автоматизации** нажмите на кнопку **Перейти в редактор скриптов**. | ||
| 351 | |||
| 352 | [[image:attach:scrypt_redactor_btn.png||height="160"]] | ||
| 353 | |||
| 354 | В открывшемся редакторе скриптов вставьте скопированный код скрипта. | ||
| 355 | |||
| 356 | Измените параметр | ||
| 357 | |||
| 358 | {{code}} | ||
| 359 | local CALENDAR_URL | ||
| 360 | {{/code}} | ||
| 361 | |||
| 362 | Указав в кавычках ссылку на загруженный в Платформу НЕЙРОСС конфигурационный файл ([[ссылка>>doc:||anchor="Доступввыходныеипраздничныедни-JSON_link"]]). В вашей ссылке будет IP-адрес вашей Платформы и другой уникальный идентификатор (uuid). | ||
| 363 | |||
| 364 | {{code}} | ||
| 365 | local CALENDAR_URL = "http://10.1.29.39/api/v1/storage/get_content/?uuid=552370fa-8bb1-47c8-b433-a23d1c5c76ff" | ||
| 366 | {{/code}} | ||
| 367 | |||
| 368 | [[image:attach:days_off_script_redactor.png||width="650"]] | ||
| 369 | |||
| 370 | Сохраните изменения. | ||
| 371 | |||
| 372 | Загрузите скрипт во все контроллеры БОРЕЙ, отвечающие за доступ в выходные и праздничные дни. | ||
| 373 | |||
| 374 | {{info}} | ||
| 375 | Скрипт меняет алгоритм доступа для всех точек доступа контроллера. включая точки доступа модулей М1 и М3. При необходимости ограничения точек доступа обратитесь к специалистам компании ИТРИУМ с запросом на доработку скрипта. | ||
| 376 | {{/info}} | ||
| 377 | |||
| 378 | === {{id name="Доступввыходныеипраздничныедни-Обновлениедаткалендаря"/}}Обновление дат календаря === | ||
| 379 | |||
| 380 | При необходимости изменения календаря на следующий год, скачайте файл из файлового хранилища, измените даты на требуемые месяцы, загрузите файл обратно согласно инструкции «Замена содержимого файла» ~[[[ui.Параметры узла.Накопители и файлы.Файловое хранилище.WebHome]]]. | ||
| 381 | |||
| 382 | Изменения календаря обновляются на контроллерах раз в сутки (около полуночи). При необходимости применить изменения сразу требуется зайти в редактор скриптов и повторно сохранить скрипт или перезагрузить контроллер. | ||
| 383 | |||
| 384 | == {{id name="Доступввыходныеипраздничныедни-Порядокиспользования"/}}Порядок использования == | ||
| 385 | |||
| 386 | Оператор [[neyross.АРМ НЕЙРОСС Доступ.WebHome]] задаёт право прохода в выходные и праздничные дни. Для этого он в свойствах пропуска задаёт в поле **Проход в выходные и праздничные дни** значение [[image:confluenceAttach:page:ui.Параметры узла@fa-on.png||thumbnail="true" height="18"]] **Установлено**. | ||
| 387 | |||
| 388 | Владелец пропуска предъявляет пропуск на точку доступа в выходной день, доступ разрешается. | ||
| 389 | |||
| 390 | {{info}} | ||
| 391 | Если пропуску не надо разрешение на проход в выходные и праздничные дни, доступ в такие дни запрещается, формируется стандартное событие «Доступ запрещен. Пропуск неавторизован» ~[[[doc:borey3.Руководство администратора БОРЕЙ Н.События БОРЕЙ.WebHome]]]. | ||
| 392 | {{/info}} |