RAFAEL BENITEZ ВОСХОДЯЩЕЕ СОЛНЦЕ

vrs

Пользователь
14.02.2014
107
177
ПЛЮСАНУЛ С ПОТЕРЕЙ ДВУХ АККАУНТОВ
 

Claymont_Pringles

Пользователь
21.07.2024
45
99
Данный пользователь был заблокирован.
плюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюсплюс
 
Даже Cesar_Benitez зашёл спустя 12 лет насрать на лица этих ублюдков
 
В 17:00 заходим, будем рвать жопы оппонентам
 

iamamiwhoami

Пользователь
Premium
22.09.2012
4 717
6 782
Apple City
Данный пользователь был заблокирован.
Ыал р икки тыһыынча сыллар усталарыгар сэбиэскэй былаас кэмигэр дьадаҥы дьон куттара эмиэ ханна баарый харах
 

Sizzle Yorkz

Пользователь
12.03.2014
372
703
АФК плюс, не приехали.
Предлогаю след капт у респы каптануть, оппоненты все ровно не приезжают в кв.
И сняться по победе.