IRCaBot 2.1.0
GPLv3 © acetone, 2021-2022
#dev
/2024/04/26
~AreEnn
~R4SAS
~acetone
~orignal
~villain
&N00B
+relaybot
DUHOVKIN
Leopold
Most2
Nausicaa
Vort
Xeha
anon2
b3t4f4c3
karamba_i2p
nemiga
not_bob_afk
poriori_
profetikla
soos
un
weko
whothefuckami_
orignal починил все эти запросы
relaybot 13mittwerkz: смысле
Vort orignal: с последним коммитом дублей запросов в дропах уже не вижу, так что, похоже, починено
Vort да и запросов из треда, обрабатывающего дропы, стало меньше, что тоже хорошо
Vort заметил разве что признак гонки между этими двумя тредами:
Vort но с этим, наверно, стоит уже позже разбираться
Vort ещё одну проблему заметил, рассматривая логи: относительно много сообщений вида SSU2: Send exception: Требуемый адрес для своего контекста неверен to 0.0.0.0:18595
Vort с очень большой вероятностью это регрессия - раньше таких сообщний не было
Vort и, вероятно, эти сообщения лезут при попытках подключения к U узлам (недоступным по IPv4, но доступным по IPv6)
Vort подумай, пожалуйста, не могли ли какие-то последние коммиты поломать такую конфигурацию
tetrimer_ Как бы еще сделать дефолтный запуск узла с флагом U до решения пир-теста?
Vort там хитрый какой-то код, опасно поломать. да и не похоже, что это может сильно мешать. всё равно IP адреса публичны
tetrimer_ Может оттуда грабли и растут?
Vort пир тест глюченый, да, но в целом, эта конкретная особенность, скорее всего, мало на что влияет
tetrimer_ ВОт смотри: пир-тест работает минут 5-10, и все это время роутер считает себя доступным и рассылает анонсы с внешним адресом.
tetrimer_ Сколько времени живет эта недостоверная инфрмация?
Vort он должен за несколько секунд отработать. но он зависает из-за всяких багов. если его починить, то недостоверная информация будет висеть очень недолго
tetrimer_ Так а что мешает сейчас стартовать с флагом U вместо R?
tetrimer_ Я же не говорю, что надо менять логику пир-теста, а просто поменять исходные параметры при старте.
tetrimer_ Зачем-то мы в конфиге пишем про nat = true ?
Vort "<tetrimer_> Так а что мешает сейчас стартовать с флагом U вместо R?" я же сказал - запутанный код, который легко поломать. старт с R был сделан специально, об этом в коде написано. но по какой причине так было сделано - не написано
колдобина щас сначала доделаю, а потом заберите реп github.com/nonlin-lin-chaos-order-etc-etal/i2pd-android-libs в PurpleI2P org - этот коммент будет в pr62 R4SAS
колдобина выношу либы в соседний реп чтоб андроид студия бусты всякие не индексила по 2 часа
колдобина orignal, ты тут? форкни реп github.com/nonlin-lin-chaos-order-etc-etal/i2pd-android-libs в PurpleI2P плиз, я CI сразу туда сделаю
orignal я не думаю что это регрессия
orignal в этой части вообще ничего не трогали
orignal по какой причине сделан запуск с R?
orignal с той что когда то роутер с i2pd был едиснтвнным ))
orignal и он был с R
Vort так для защиты от атаки варианты подключения к SSU2 ведь иногда отклоняются. я подумал, может, это изменение что-то сломало
orignal у тебя есть сам ipv6?
Vort есть. два даже
Vort реальный и ygg
orignal нет насч интерасует только SSU2
Vort есть
orignal вроде с SSU2 там только игонорируетрся адрес
orignal я думаю этот связано когда тест или релай идут 6 по 4 или 4 по 6
orignal я начал с этим разбираться так и не разбообрался
Vort NTCP2 NTCP2v6 SSU2 SSU2v6 NTCP2v6
Vort странно, что раньше такого не было
onon1 А кто выбирает Чарли для пиртеста, мы или Боб?
orignal это что такое?
Vort раньше была проблема с 0.0.0.0:0, но её более-менее починили. а тут реальный порт, похоже. а адрес - 0.0.0.0
orignal нет с портом тоже было часто
orignal а если есть порт можешь поискать его в netdb?
Vort а, всё, вижу. нашёл за 14/Mar/2024 такое в логе
Vort значит, не регрессия. тогда хрен с ней
Vort по порту и искал
orignal так а что не так с последовательностью?
orignal или что это вообще?
Vort с какой? Try Ft6- вот это?
Vort не понял вопроса
orignal <Vort> NTCP2 NTCP2v6 SSU2 SSU2v6 NTCP2v6
orignal что это такое?
Vort это я просто показал, какие у меня транспорты есть
orignal ну а что с ними не так?
Vort а "раньше не было" - это я порта в ошибке не видел. но потом уже нашёл
orignal а все понял
Vort всё с ними так
orignal эта бага точно с этим связана
Vort в общем, по багам мне кажется, что сейчас самая важная проблема - гонки с m_Peers. как минимум в некоторых случаях это приводит к OOM и крешам
Vort по защитам от атак - тут я хз, что важнее
Vort "<onon1> А кто выбирает Чарли для пиртеста, мы или Боб?" вот такую фразу в стандарте вижу: Bob must select a Charlie
orignal m_Peers я займусь сегодня
orignal сегодня время есть
relaybot 13sha512sum: Так я тут
orignal привет
orignal давай поделись с нами своими сообржанием как бороться с нынешней атакой
Guest34650 не скажет.
orignal а жаль
orignal sha512sum у нас тут проблема как раз по твоей части
orignal UB с Transports::m_Peers
orignal и при большой нагрузке все идет вразнос
relaybot 13sha512sum: > orignal: давай поделись с нами своими сообржанием как бороться с нынешней атакой
relaybot 13sha512sum: Да я даже пока не знаю в чём её суть
orignal суть в том что атакующий берет реальные флудфилы копирует из них адреса и засирает сеть несуществующими ротуерами с адресами реальных улдфилов внутри
orignal ну и вот какие у тебя будут предложения кроме как переписать на C++20
onon Шутки про раст ещё актуальны?
orignal ну я предлодил sha512sum принять деятельное участие
orignal в ответ на ее жалобы на низкий рейт
relaybot 13sha512sum: > orignal: ну и вот какие у тебя будут предложения кроме как переписать на C++20
relaybot 13sha512sum: На DPDK переделать
onon Она не знает как сеть устроена, что она сможет предложить
orignal ну так а что мешает изучать?
onon Зачем изучать, если можно не изучать.
onon Вариант с флулдфилом от флудфила уже реализовал, или сейчас над чем-то другим работаешь?
orignal я вчера своими делами был занят
relaybot 13sha512sum: > orignal: ну так а что мешает изучать?
relaybot 13sha512sum: Да ничего не мешает
orignal починил только то что Vort нашел с запросами
relaybot 13sha512sum: Кроме своих дел
orignal счас вот сначала эти пиры починю
onon Тогда подождё, может и дед к тому времени что-нибудь решит по поводу подписи публикации
orignal я к той впс не могу подключиться
orignal у меня тут какие то локальные проблемы
orignal он ниче не сказал насчет подписывания DatabaseStore
onon Он вообще ничего не писал, только дрозд тебя хотел
tetrimer А подписывать-то кто будет? Фальшивый флудфил?
orignal tetrimer флудфил который флудит
orignal подписывать только тогда когда отпраляешь чужой RouterInfo
orignal тогда поулчатель его получит и сможет проверить подпись с ключом того откуда получил
tetrimer Для начала достаточно отвергать чужой RI, пришедший не с флудфила?
orignal ну так аткаующий будет строить тоннели с концами на флудфилах
orignal и прикидываться флудом
orignal ты ж понимаешь что это полумера
tetrimer Прикидываясь флудфилом - он не будет светить свой внешний IP?
orignal я сказал флудом а не флудфилом
orignal он свое говно будет выдавать за флуд
onon А может он не настолько умный?
onon Как мы считаеим
orignal ну там целая команда работает
orignal они сообразят быстро
tetrimer Флуд - это просто трафик? Не оседающий в netDB всех узлов?
orignal и они же коммиты смотрят
orignal tetrimer флуд это перепосылка флудфилом полученных роутеров другим флудфилам
orignal потому мы и не можем требовать чтобы флудфил отправлял только себя
tetrimer Не можем. А вот "от кого получено" - можем?
orignal ну так и чем это поможет?
tetrimer "Входной для спама флудфил" - видит: кто ему шлет RI?
onon И, кстати, про расстояние, атакующий, вероятно сможет строить туннели с фф на конце, ближайшим к тем фейкам, которые собирается вбросить.
orignal нет
orignal может и через тоннели быть
onon Т.е. срать избирательно
orignal понятно что если не флуд то можно дропнуть
orignal но атакующий начнет выдавать свои сообщения как будто флудфил пересылает им полученные
orignal onon разумеется может
orignal скорее всего он так и сделает
orignal потому я и говорю что это не окончательное решение
orignal окончательное решение это подпись
tetrimer Если никто ничего не видит и не знает - остается только растягивать все это во времени.
orignal но дед опять сопли жует
onon Тогда ждём, пока дед что-нибудь решит.
tetrimer orignal: >окончательное решение это подпись
tetrimer Подпись-то чья?
tetrimer Мы же, по условиям задачи, не знаем отправителя.
onon tetrimer: Подпись-то чья? - Флудфила, который нам запись отправляет
onon Он как бы "поручается" за достоверность
tetrimer А толку? Флудфил получает эту информацию неизвестно от кого
onon Если атакующий сам станет флудфилом и будет впаривать фейки, мы его сможем быстро вычислить
tetrimer Как он может поручиться?
onon Нет, к нему подключаются напрямую для публикации
orignal подптсб того флуила который флудит
tetrimer Зачем ему это? Он будет строить туннели до флудфилов. А мы их будем отстреливать за фейки. Что может пойти не так? :)
onon Только в некоторых случаях он принимает RI через туннели
orignal tetrimer толк в том чтобы быть уверенными что это именно флуд
orignal а не транзит
orignal то есть флудфил послал сообщение DatabaseStore потому что флудит
orignal а не потому что через транзит пришло
orignal транзит то он перешлет как есть
orignal а для флуда он формирует сам
tetrimer А сейчас что мешает в RI добавить информацию о флудфиле?
tetrimer Который сформировал это сообщение...
onon Кстати, про случаи, когда флудфил принимает массовую публикацию через туннели для меня пока вопрос остался открытым.
orignal не понял вопроса
orignal информацию ты добавишь так ведь и аткаующий может
orignal потому и нужно подпись
tetrimer Так и с подписями - будет ровно то же самое.
orignal почему?
onon И как он подпишет своё сообщение, если он не тот флудфил за который себя выдаёт?
tetrimer У нас нет паблик-кея отправителя.
orignal атакуюший не сможет добавить подпись того флудфила который на конце тоннля
orignal tetrimer есть
orignal мы же видим соединение
orignal и кого прилетает сообщение
orignal там есть его RI с ключом
orignal с которым мы и проверяем подпись
orignal а флудфил обязан флудить напрмямую а не через тоннели
tetrimer Ну так значит мы можем приходящую от него RI - маркировать его же паблик-ключом?
tetrimer Дальше-то мы эту инфрмацию - рассылаем по сети уже как-бы от себя?
tetrimer Правда тут соотношение: один ко многим и одна и та же RI может придти с разных сторон.
orignal у него то нет своих флудфилов
orignal потому если мы будем принимать флудфилы только от других флудилов напрямую
orignal при это он должен быть или собственный или с его подписью
tetrimer Дальше-то информация - насколько далеко уходит?
orignal тогда у атакующего потоклнуть мусор не будет
tetrimer Т.е. второй флудфил знает и видит первого. А третий или четвертый?
onon Один раунд флуда у нас только
tetrimer Тогда непонятно: зачем нужна подпись?
onon Чтобы мы были уверены, что получаем I2NP сообщение от флудфила, а не от атакующего
onon Т.е. что сформировал его флудфил а не атакующий
onon А не сформировал атакующий а фф нам только переслал
onon Как транзит
tetrimer А, понятно: мы получаем некий пакет, в нем RI якобы от флудфила, а он нам её не посылал.
onon Да
orignal флуд одношаговый
orignal откулючать транзит заведомо плохая идея
tetrimer Но при отключенном транзите - нам уже не зальют фейковую информацию о роутерах?
tetrimer Т.е. получаем "чистый" флудфил.
onon Это если только все разом отключат, и будет введено правило - флудфил от флудфила.
orignal почему не зальют?
onon Но это плохая идея
orignal ты получишь роутер от лругого флудфила
orignal ты ж не знаешь что это
orignal на отключение транзитов на флуфдилах никто не согласится
tetrimer onon: >только все разом отключат
tetrimer Все разом - в такой сети всё равно не получится, только постепенно.
tetrimer Тогда первым шагом можно начать подписывать флудфилом RI - кашу маслом не испортишь.
tetrimer А вторым - ввести уровни доверия к приходящей информации. Подписано - доверяем полностью, нет - доверяем частично.
tetrimer Это - тоже не должно повлиять на связность.
orignal ну вот подпись это вполне кокретное и простое решние
Vort не знаю, нужно ли это, но я придумал ещё один показатель, характеризующий "здоровье" сети: можно на флудфиле следить за средним значением Non Expired Leases: в опубликованных лизсетах
Vort у меня, в основном, сейчас опубликованы лизсеты с количеством 1 и 2
Vort кто-то помнит, сколько обычно до атаки было? 3? 5?
orignal дед ставит 2 обычно
orignal я ставлю 3
orignal по умолчанию 5
orignal дрозд вон предлагает тор забанить
onon Насколько будет проблемным вариант всё-таки запретить публикацию через туннели. Если транспорт несовместим, пусть ищет совместимого флудфила
onon А тот уже перешлёт нам если мы самый близкий флудфил
orignal ну да догично
orignal я не понимаю его
onon Есть же фф и с ипв6
orignal нет там не про 6
orignal там про NTCP/SSU
onon Ну так фф много
onon найдет себе
orignal я вообще сомневаюсь что есть такие
onon Через exploratory флудфилы же не собираются?
onon Только regular
onon А каким способом мы можем запросить себе ещё фф, если нам не хватает?
orignal можно запросить с обычного роутера
orignal у меня вроде это не сделано
onon Я думаю о случае, если роутер хочет опубликоваться, а подходящих флудфилов нет
orignal то есть если ты обычному роутеру книнешь запрос от ответит списком ближайщих флудфилов
onon А через туннели мы запретили
orignal можно это сделать
onon Что бы он тогда начинал искать подходящий
onon целенаправленно
orignal просто код для этого не наисан
orignal дрозд подсказал одну проблему
orignal надо починить
orignal счас
onon1 Отключусь на несколько часов, без меня радикальных изменений не делайте, атаку не отбивайте, я тоже хочу примазаться...
Vort orignal: похоже, после моего изменения с интервалами стало чаще крешить в NetDbRequests::SendNextRequest из-за пустого GetExploratoryPool
Vort может там просто проверку на нулевой указатель воткнуть?
orignal обязательно воткнуть
orignal но вопрос как получилось что его нет?
Vort не успел ещё создаться
orignal до этого надо докопаться
orignal Vort все ясно
orignal пул создается в ManageInboundTunnels
Vort ну поэтому я про "гонку" и пишу
Vort там ещё секунда ожидания вначале
orignal а там видимо начинает раньще
Vort ещё вопрос, зачем та секнуда ) что сломается, если её выкинуть
orignal так перенести в начало Run и все дела
orignal ну когда то давно была
Vort вообще, надо бы сигналы делать по-хорошему или что-то около того
Vort а не надеятся, что секунды хватит
orignal из-за чего я уже забыл ))
` Доложить обстОнОффку.
orignal так это было когда я только начинал код писать
Vort похоже, теперь только вариант убрать секнуду и смотреть, где будет крешить :))
orignal полагаю потому что контекс создается позже
Vort "<~orignal> так перенести в начало Run и все дела" - разве потоки всё равно не могут задержаться так, как им хочется?
Vort шансы другие, но всё же
Vort просто гонки традиционно синхронизацией исправляются
Vort но если хочешь хак, можно и хак
Vort а потом сделать нормально
orignal ты плохо сделал с секндой
Vort чем?
orignal uint64_t ts = i2p::util::GetSecondsSinceEpoch ();
orignal if (ts - lastManageRequest >= MANAGE_REQUESTS_INTERVAL
orignal тем что у тебя все время скачки будут неравномерные
orignal или надо больше секнуд или в миллисекнудах
Vort можно монотонные миллисекунды поставить
Vort и вот то второе условие будет не нужно, да?
Vort я себе все мозги сломал об него )
orignal не нужно если ты поставишь монтонный таймер
Vort значит надо
orignal второе условие из-за немонтонности таймера
orignal if (!i2p::transport::transports.IsOnline ()) continue; // don't manage netdb when offline
orignal вот смотри какое усллвие
Vort монотонный даже "дешевле" должен быть
orignal вот надо бы заменить на монтонный
Vort сделаешь или мне?
Vort я просто боюсь опять попутать ))
orignal давай я сделаю
Vort ок. ну и миллисекунды же вместо секунд
Vort и переменные ts стоит переименовать в mts, чтобы никто потом не захотел сравнивать несравниваемое
orignal ну да
orignal счас
orignal может кстати на это Orion жаловался?
Vort у него что-то про файлы было
Vort тут же креш как креш
orignal говорил что вообще не стратовало
orignal счас закоммичу
orignal закоммитил
Vort выглядит нормально, потестирую немного
orignal я тоже попробую попозже
Vort orignal: подозреваю, что этого изменения недостаточно
Vort у меня креш лез из HandleDatabaseSearchReplyMsg
Vort а не из ManageRequests
Vort или всё же достаточно? плохо понимаю это место
Vort i2pd.exe!i2p::tunnel::TunnelPool::GetNextOutboundTunnel(std::shared_ptr<i2p::tunnel::OutboundTunnel> excluded, unsigned char compatible) Line 215 C++
Vort i2pd.exe!i2p::data::NetDbRequests::SendNextRequest(std::shared_ptr<i2p::data::RequestedDestination> dest) Line 202 C++
Vort > i2pd.exe!i2p::data::NetDb::HandleDatabaseSearchReplyMsg(std::shared_ptr<i2p::I2NPMessage const > msg) Line 951 C++
Vort i2pd.exe!i2p::data::NetDb::Run() Line 131 C++
orignal думаю все таки оттуда
Vort вот где было
orignal ну да но запрос то был инициирован этим request
Vort ну окей
orignal но я погляжу да
Vort orignal: всё же продолжает крешить
orignal при старте?
Vort да
Vort ManageRequests срабатывает когда происходят таймауты
Vort а без таймаута идёт вызов напрямик из HandleDatabaseSearchReplyMsg
orignal ну жа
orignal а откуда он там взялся?
Vort сейчас покажу
orignal смотри
orignal как вообще это сообщение может взяться?
Vort а, ну это надо поискать
orignal это я понимаю
orignal я не понимаю откуда взялся request этот
Vort конкретно этот стек пока что ещё раз воспроизвести не смог. но словил похожий креш - через дроп
Vort Peer::Done -> I2NPMessage::Drop
orignal а ну такое да может быть
Vort так а в чём проблема создать request?
Vort узел же много request`ов создаёт
Vort я не пойму, что тут необычного
Vort ну создал и создал
orignal тупо добавил проверку
orignal счас закину
orignal пробуй
Vort додёргался тестовый узел, что стриггерил утечку памяти на основном узле
Vort где-то 2 мегабайта/секунду течёт
Vort я с него сейчас пишу, он работает. но скоро придётся перезапускать
orignal запустился в итоге?
Vort тестовый? да я его раз 20 уже перезапустил, пока ни одного "not ready" в логе. но я уверен, что будут - надо просто ещё подёргать
Vort но после того, как с основным узлом разберусь
Vort есть идеи, что на основном узле можно быстро проверить?
Vort или ничего без изменения кода не выйдет?
Vort уже 3 мегабайта/сек течёт - ускоряется
orignal а вот x3
Vort хм. до 2 гигов потребление RAM дошло, начало сильно CPU грузить
Vort а затем потребление RAM "сдулось" до обычных 500 мегов
Vort я успел профилировщиком эту нагрузку глянуть, может что-то пойму
weko_ Обычных 500 мегов?
weko_ Не очень то обычно
Vort после того, как началась атака - вполне
Vort профилировщик этот бестолковый - ничего я так не пойму :(
Vort у меня подозрение, что утечка связана с профилировщиком i2pd
Vort но доказательств нету
orignal скорее всего
Vort точнее я вот эту картинку кину, а удастся ли кому-то что-то по ней понять - хз
Vort такс, продолжу дёргать тестовый узел
Vort по поводу утечки - нормально ли i2pd обрабатывает ситуацию, когда винчестер призадумался секунд на 10-20, а i2pd надо прочитать профиль узла с диска?
orignal а что делать?
Vort так я не знаю, какая вообще сейчас реакция. поэтому и не могу предположить, насколько она нормальная и как её можно и нужно ли менять
Vort пока что у меня только подозрения, так как доступы к файлам у меня лагают постоянно, а многие программы это не любят
Vort вот и думаю, нормально ли i2pd на такое реагирует
orignal ты прав это надо продумать
tetrimer У меня за полчаса последний коммит прибавил 31Мб (184 -> 215).
orignal вот надо разбираться что именно дрет
orignal жрет
tetrimer А как? Оно в тредах - одно и то же показывает.
Vort раза с сотого удалось таки из тестового узла вытрусить "NetDbReq: Exploratory pool is not ready", пойду на гитхаб отвечать
Vort как тому юзеру удаётся каждый раз креш ловить - не представляю. может, у него другой креш...
tetrimer Зависит от нагрузки, наверное.
tetrimer У меня вот сейчас, на одной из машинок, i2pd за последние пару дней уже второй раз падает.
Vort ага, у того юзера другой креш. и как это ловить - хз
orignal R4SAS выходи из засады
tetrimer Надо вспоминать: как анализировать корки.
orignal gdb i2pd core
orignal where
R4SAS orignal: по мере возможностей
R4SAS сейчас немного релиз докручу
R4SAS и пересоберусь везде
orignal у тебя узлы не валтся?
R4SAS только штучно
R4SAS 16 дней аптайма
tetrimer Program terminated with signal SIGSEGV, Segmentation fault.
tetrimer Address not mapped to object.
tetrimer --Type <RET> for more, q to quit, c to continue without paging--where
tetrimer #0 0x00000000006632d1 in i2p::CreateRouterInfoDatabaseLookupMsg (
tetrimer key=0x808285aa0 "8k\016\215|\271\3779\361h\002\342DW\352;>\271\352\223\214\v5.[m\264\247ܡ\301\374",
tetrimer from=0x8018b93a0 "\017\204}\213\226P\315t?\370\004\207\244\276\b\261\240[\a\225\361ױ\n<\256CNC7#\362\020u\213\001\b", replyTunnelID=0, exploratory=false, excludedPeers=0x808285ac8)
tetrimer at libi2pd/I2NPProtocol.cpp:178
tetrimer 178memcpy (buf, it, 32);
R4SAS о, извращенец
R4SAS слать дамп в чатик
tetrimer Могу не слать.
orignal эта место и у Vort -а валазило
R4SAS паста в помощь
orignal обращение к exludedPeers
Vort да, это оно, скорее всего
Vort подозреваю гонку между потоками, а там хз
orignal а в чем она заключается?
orignal этот set битый?
orignal R4SAS джависты хотят сделать промжутоный релиз в середине мая
Vort в том, что NetDbRequests::SendNextRequest идёт одновременно из Manage и из дропа
Vort я подробностей не знаю, пока просто догадки
Vort ну и гонка - это плохо в любом случае
Vort точнее, в том, что есть гонка, я уверен на 90%. а вот из-за неё креш или нет - не знаю
orignal да согласен с дропом там непорядок
tetrimer И не отключить, как peerProfiles
orignal ну счас починим
R4SAS orignal: видал
tetrimer Перед тем, как упасть в корку - в системе был всплеск потребления свопа, т.е. память всю выжрало.
tetrimer Хотя, возможно, это оно слюну копило, чтобы полгига корки сплюнуть.
Vort tetrimer: полезная информация. я уже не раз замечал, что некоторые проблемы рандомно дают креши или OOM
orignal поставил там мьютекс счас закоммичу
tetrimer Я вот еще заметил, что пока скорость зажата на О - оно нигде не падает. Видимо хватает ресурсов.
orignal закоммитил
orignal в отличие от прошлогодней атаки времени в меня хыватает
tetrimer Спасибо, сейчас ппопробуем.
Vort опечатка что ли? m_ExcludedPeerstMutex
Vort поставлю сразу на основной узел тестировать
Vort orignal: юзер на гитхабе подтвердил, что креш связан с UPnP. для себя он проблему то решил, но вообще надо её будет и для всех решить не забыть
orignal ну да опечатка