{"id":375446,"date":"2024-05-21T06:24:40","date_gmt":"2024-05-21T06:24:40","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=375446"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=375446","title":{"rendered":"<span>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0432\u043e\u044e \u0441\u0442\u0440\u0438\u043c\u0435\u0440-\u0442\u044f\u043d \u0438\u0437 \u0437\u0435\u0444\u0438\u0440\u0430 \u0438 \u043f\u0430\u043b\u043e\u043a<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u043f\u043e\u0437\u0434\u0430\u043b \u0441 \u0442\u0440\u0435\u043d\u0434\u043e\u043c, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0436\u0435 \u0434\u043e\u0431\u0440\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a. \u041c\u043e\u0436\u0435\u0442, \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f <span class=\"habrahidden\">(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u0435\u044f\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u043a\u0440\u0438\u043d\u0436\u0430\u043d\u0443\u0442\u044c \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0434 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e).<\/span><\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u044b \u0441\u043b\u044b\u0448\u0430\u043b\u0438 \u043e <a href=\"https:\/\/dtf.ru\/life\/1566723-twitch-vremenno-zablokiroval-ii-strimershu-za-razzhiganie-nenavisti-ranee-ona-otricala-holokost\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0448\u0443\u043c\u0435\u0432\u0448\u0435\u0439<\/a> \u0432\u00a0\u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f \u0418\u0418 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0435 <a href=\"https:\/\/www.youtube.com\/channel\/UCLHmLrj4pHHg3-iBJn_CqxA\" rel=\"noopener noreferrer nofollow\">NeuroSama<\/a>. \u041c\u0435\u043d\u044f \u0442\u043e\u0433\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430, \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u043e\u00a0\u0447\u0442\u043e\u00a0\u0431\u044b \u0442\u043e \u043d\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u0434\u0443\u043c\u043a\u0443 \u0430\u0432\u0442\u043e\u0440\u0430, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438 \u0443\u00a0\u043c\u0435\u043d\u044f \u043a\u043e\u0435\u2011\u043a\u0430\u043a\u0438\u0435 <abbr class=\"habraabbr\" title=\"\u041d\u0430\u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0442\u0440\u0438\u043c\u0435 \u0431\u044b\u043b\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0443\u0442 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043a\u043b\u0438\u043a \u0431\u0435\u0439\u0442 \u0434\u043b\u044f \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u0430\u043a \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0417\u0434\u0435\u0441\u044c \u0445\u043e\u0447\u0443 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043d\u0435 \u043e\u0431 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0432 \u0447\u0430\u0442\u0435 (\u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e), \u0430 \u043e \u0431\u0443\u0434\u0442\u043e \u0431\u044b &quot;\u0441\u0432\u044f\u0437\u0438&quot; \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430.\" data-title=\"&lt;p>\u041d\u0430\u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0442\u0440\u0438\u043c\u0435 \u0431\u044b\u043b\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0443\u0442 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043a\u043b\u0438\u043a \u0431\u0435\u0439\u0442 \u0434\u043b\u044f \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u0430\u043a \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0417\u0434\u0435\u0441\u044c \u0445\u043e\u0447\u0443 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043d\u0435 \u043e\u0431 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0432 \u0447\u0430\u0442\u0435 (\u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e), &lt;strong>\u0430 \u043e \u0431\u0443\u0434\u0442\u043e \u0431\u044b &quot;\u0441\u0432\u044f\u0437\u0438&quot; \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430.&lt;\/strong>&lt;\/p>&#187; data-abbr=&#187;\u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f&#187;>\u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f<\/abbr>.<\/p>\n<p>\u041c\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u043b\u043e \u043d\u0435\u00a0\u0441\u0430\u043c\u043e \u0448\u043e\u0443 \u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043d\u0430\u0448\u0443\u043c\u0435\u0432\u0448\u0438\u0435 \u0441\u0430\u043c\u044b\u0435 \u00ab\u043a\u0440\u0443\u0442\u0435\u0439\u0448\u0438\u0435\u00bb \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u0430\u00a0\u0441\u0430\u043c \u0444\u0430\u043a\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e <strong>\u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0432\u0435\u0441\u0442\u0438 \u0441\u0442\u0440\u0438\u043c<\/strong>, \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439!<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u00a0\u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c <strong>\u0441\u0432\u043e\u044e<\/strong> \u043d\u0435\u0439\u0440\u043e\u2011\u0442\u044f\u043d \u0434\u043b\u044f\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043c\u043e\u0436\u0435\u0442 <strong>\u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u0438 \u0431\u0435\u0437\u00a0\u043f\u0435\u0440\u0435\u0440\u044b\u0432\u043e\u0432 \u0438\u0433\u0440\u0430\u0442\u044c \u0438 \u0432\u0435\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438<\/strong> \u043d\u0430\u00a0\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u2011\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 \u0438 <s>\u0431\u0443\u043b\u043b\u0438\u0442\u044c \u043a\u043e\u0436\u0430\u043d\u044b\u0445 \u043c\u0435\u0448\u043a\u043e\u0432<\/s> \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, <abbr class=\"habraabbr\" title=\"\u0418\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u0445 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u043e\" data-title=\"&lt;p>\u0418\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u0445 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u043e&lt;\/p>&#187; data-abbr=&#187;\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0431\u0430\u043d\u044b&#187;>\u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0431\u0430\u043d\u044b<\/abbr>!<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0431\u0435\u0437\u00a0\u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f <strong>\u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439<\/strong> \u0438\u0437\u2011\u0437\u0430 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e <strong>\u0422\u0423\u0427\u0418<\/strong> \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0430\u0441\u0430\u0439\u0442\u0435\u0441\u044c \u0431\u043e\u0447\u043a\u043e\u0439 <strong>\u043a\u0432\u0430\u0441\u0430<\/strong> \u0438 \u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u043f\u043a\u0440\u043e\u043d\u0430, \u043a\u0430\u043a\u00a0\u0438 \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u044b\u0439<\/a> \u0440\u0430\u0437, \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0435\u0449\u0430\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0436\u0430\u0440\u043a\u0438\u043c, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u00a0\u0441\u043a\u043e\u0440\u043e \u043b\u0435\u0442\u043e, \u0430\u00a0\u0435\u0449\u0451 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u00a0\u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0441\u043d\u0430 (<em>\u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0432\u0435\u0441\u0435\u043d\u043d\u0435\u0435 \u043e\u0431\u043e\u0441\u0442\u0440\u0435\u043d\u0438\u0435<\/em>), \u0432\u0435\u0434\u044c \u043c\u044b \u0441\u00a0\u0432\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e) \u0434\u0435\u0432\u0443\u0448\u043a\u0443\u2011\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430!<\/p>\n<p>\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0435\u043b\u043e, \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a\u0430\u043a\u00a0\u043e\u043f\u044b\u0442\u043d\u043e\u043c\u0443 \u0431\u043e\u0439\u0446\u0443, \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0432\u0430\u0442\u0435\u043b\u044e!<\/p>\n<p><em>\u0415\u0441\u043b\u0438 \u043d\u0435\u00a0\u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0451\u00a0\u2014\u00a0\u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u00ab\u043f\u043e\u0440\u0442\u0430\u043b\u00bb.<\/em><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0440\u0442\u0430\u043b (\u0432 \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u2014 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f, \u043d\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c, \u043d\u0435\u0442 \u0447\u0435\u0442\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041e\u0442\u0441\u044e\u0434\u0430 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u043c \u0441\u0442\u0430\u0442\u044c\u0438! \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u043c\u0430\u043a\u0430\u0435\u043c \u043d\u0430\u00a0\u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 (\u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043c\u0430\u0433\u0438\u044f: \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a\u00a0\u044f\u043a\u043e\u0440\u044e\u00a0\u2014 \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u0443)!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/630\/26e\/7d5\/63026e7d5d5f6f3b4ca165ef30eb4aa9.png\" width=\"1280\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/630\/26e\/7d5\/63026e7d5d5f6f3b4ca165ef30eb4aa9.png\"\/><\/figure>\n<p><a class=\"anchor\" name=\"Portal\" id=\"Portal\"><\/a><\/p>\n<p>\u26a0\ufe0f\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u043b\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0435\u0451 \u0447\u0430\u0441\u0442\u044c, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 <strong>\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440\u0430\u043c\u0438<\/strong>!<\/p>\n<p><em>\u042d\u0442\u043e \u2014 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435. \u042d\u0442\u043e \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b.<\/em><\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u0449\u0435\u0435 \u043e\u0431\u043c\u043e\u0437\u0433\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435<\/p>\n<ul>\n<li>\n<p><a href=\"#Game\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0431\u043e\u0440 \u0438\u0433\u0440\u044b<\/a> (\u0443\u0433\u0430\u0434\u0430\u0439\u0442\u0435 \u0441 1 \u043f\u043e\u043f\u044b\u0442\u043a\u0438)<\/p>\n<\/li>\n<li>\n<p><a href=\"#GptCry\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0424\u0440\u0435\u0434<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#MainProject\" rel=\"noopener noreferrer nofollow\">\u0421\u0445\u0435\u043c\u0430 \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/a> (\u043f\u0438\u043a\u0447\u0430, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 (Java-\u0447\u0430\u0441\u0442\u044c)<\/p>\n<ul>\n<li>\n<p><strong>\u26a0\ufe0f<\/strong><a href=\"#CodeDisclaimer\" rel=\"noopener noreferrer nofollow\"><strong><em>CodeDisclaimer<\/em><\/strong><\/a> (\u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u0430\u043b\u044c\u0448\u0435, <strong>\u0432\u0430\u0436\u043d\u043e<\/strong>)<\/p>\n<\/li>\n<li>\n<p><a href=\"#JavaBot\" rel=\"noopener noreferrer nofollow\">\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 Java-\u0447\u0430\u0441\u0442\u0438 \u0431\u043e\u0442\u0430<\/a> (\u043a\u043e\u0434 Java, \u043c\u043d\u043e\u0433\u043e)<\/p>\n<\/li>\n<li>\n<p><a href=\"#MCChatParser\" rel=\"noopener noreferrer nofollow\">\u0410\u0414 \u0438\u043b\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0447\u0430\u0442\u0430<\/a> \u0438\u0437 <em>\u044d\u0442\u043e\u0439<\/em> \u0438\u0433\u0440\u044b (\u043a\u043e\u0434 Java, regex, \u043f\u0438\u043a\u0447\u0438)<\/p>\n<\/li>\n<li>\n<p><strong>?<\/strong><a href=\"#SkyWarsBot\" rel=\"noopener noreferrer nofollow\"><strong>\u041a\u0438\u0431\u043e\u0440\u0433-\u0443\u0431\u0438\u0439\u0446\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438<\/strong><\/a> (<strong>\u0433\u0438\u0444\u043a\u0438, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/strong>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u0432\u0430\u0442\u0430\u0440\u043e\u043c<\/p>\n<ul>\n<li>\n<p><a href=\"#MCMapCaptchaSolver\" rel=\"noopener noreferrer nofollow\">InGameCaptchaSolver.useless<\/a> (\u043f\u0438\u043a\u0447\u0438, \u043a\u043e\u0434 Java, Python, Tensorflow OCR)<\/p>\n<\/li>\n<li>\n<p><a href=\"#MineBridge.py\" rel=\"noopener noreferrer nofollow\">MineBridge.py<\/a> (\u043a\u043e\u0434 Python, Py4j. \u041d\u0435 \u043e\u0441\u043e\u0431\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f..)<\/p>\n<\/li>\n<li>\n<p><strong>?<\/strong><a href=\"#MineEyeBridge\" rel=\"noopener noreferrer nofollow\"><strong>\u0425\u0432\u043e\u0441\u0442\u0430\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u0438\u0442 \u0433\u043b\u0430\u0437\u043a\u0438<\/strong><\/a> (<strong>\u0433\u0438\u0444\u043a\u0438, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/strong>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#TyanGptStart\" rel=\"noopener noreferrer nofollow\">\u0412\u0430\u0440\u0438\u043c \u043a\u0438\u0441\u0435\u043b\u044c TyanGpt<\/a> (\u043c\u043d\u043e\u0433\u043e code)<\/p>\n<ul>\n<li>\n<p><strong>\u26a0\ufe0f<\/strong><a href=\"#Disclaimer\" rel=\"noopener noreferrer nofollow\"><strong><em>Disclaimer<\/em><\/strong><\/a> (<strong>\u0432\u0430\u0436\u043d\u043e, <\/strong>\u0435\u0441\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0434\u0430\u043b\u0435\u0435)<\/p>\n<\/li>\n<li>\n<p><a href=\"#NameBrainstorm\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c \u0445\u0432\u043e\u0441\u0442\u0430\u0442\u043e\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/a> (\u0442\u0435\u043a\u0441\u0442, \u043d\u043e <em>\u0432\u0435\u0441\u0435\u043b\u043e<\/em>)<\/p>\n<\/li>\n<li>\n<p><strong>?\ufe0f<\/strong><a href=\"#NickAnalyzer\" rel=\"noopener noreferrer nofollow\"><strong>\u0410\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u0451\u0442 \u0436\u0430\u0440\u0443<\/strong><\/a> (\u0432\u044b\u0440\u0435\u0437\u043a\u0438 \u0447\u0430\u0442\u0430, \u0432\u0435\u0441\u0435\u043b\u043e)<\/p>\n<\/li>\n<li>\n<p><a href=\"#ChatSystem\" rel=\"noopener noreferrer nofollow\">\u0414\u0443\u043c\u0430\u0435\u043c \u043d\u0430\u0434 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439<\/a> (\u0442\u0435\u043a\u0441\u0442, \u0432\u0432\u043e\u0434\u043d\u044b\u0435)<\/p>\n<ul>\n<li>\n<p>\u043c\u043d\u043e\u0433\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0432\u0432\u043e\u0434\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"#%D0%A0%D0%B0%D0%BD%D0%B3%D0%B8%D0%AD%D0%BC%D0%BE%D1%86%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u043d\u0433\u0438 \u0438 \u044d\u043c\u043e\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0430\u0431\u0437\u0430\u0446<\/a> \u043f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%94%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F%D0%A1%D1%85%D0%B5%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0421\u0445\u0435\u043c\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/a> (\u043f\u0438\u043a\u0447\u0430, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f)<\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F%D0%94%D0%B5%D0%BC%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438<\/a> (\u043f\u0438\u043a\u0447\u0430, \u0430 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 Python)<\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%91%D0%94\" rel=\"noopener noreferrer nofollow\">\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/a> (\u043f\u0438\u043a\u0447\u0430 \u0438 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434 Python &amp; sql)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0412\u0435\u0441\u0435\u043b\u0438\u043c\u0441\u044f! <em>(\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0439\u0442\u0435 <\/em><a href=\"#Disclaimer\" rel=\"noopener noreferrer nofollow\"><strong><em>Disclaimer<\/em><\/strong><\/a><em>)<\/em><\/p>\n<ul>\n<li>\n<p><strong>?\ufe0f<\/strong><a href=\"#RudeChatDemo\" rel=\"noopener noreferrer nofollow\"><strong>\u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u0432 \u00ab\u0441\u043e\u0446\u0438\u0443\u043c\u0435\u00bb<\/strong><\/a><strong> <\/strong>(\u0432\u044b\u0440\u0435\u0437\u043a\u0438 \u0447\u0430\u0442\u0430)<\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0434\u0443\u0448\u0435\u0432\u043d\u044b\u0435 \u0431\u0435\u0441\u0435\u0434\u044b (ref: \u0434\u0436\u0435\u043d\u0442\u043b\u044c\u043c\u0435\u043d\u044b \u0443 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430 \u043d\u0430 \u043b\u0430\u0432\u043e\u0447\u043a\u0430\u0445)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0443\u0433\u0430\u0441\u0448\u0435\u0439 \u043b\u044e\u0431\u0432\u0438&#8230;<\/p>\n<\/li>\n<li>\n<p><a href=\"#ChatBugs\" rel=\"noopener noreferrer nofollow\"><strong>\u0411\u0430\u0433\u0438<\/strong><\/a> (\u0442\u043e\u0436\u0435 \u0432\u0435\u0441\u0435\u043b\u043e)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>?\ufe0f<\/strong><a href=\"#ChatDemo\" rel=\"noopener noreferrer nofollow\"><strong>\u0412\u0437\u0440\u043e\u0441\u043b\u0435\u043d\u0438\u0435<\/strong><\/a> (\u0432\u0435\u0441\u0451\u043b\u044b\u0435 \u0432\u044b\u0440\u0435\u0437\u043a\u0438 \u0447\u0430\u0442\u0430)<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#AnotherCode\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/a> (TTS \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u043a\u043e\u0434)<\/p>\n<\/li>\n<li>\n<p><a href=\"#Summary\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0434\u0432\u043e\u0434\u0438\u043c \u0438\u0442\u043e\u0433\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Now\" rel=\"noopener noreferrer nofollow\"><strong>\u0427\u0442\u043e \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441\u0435\u0439\u0447\u0430\u0441?<\/strong><\/a><\/p>\n<ul>\n<li>\n<p>\u0421\u0442\u0430\u0442\u0443\u0441<\/p>\n<\/li>\n<li>\n<p><a href=\"#Sponsors\" rel=\"noopener noreferrer nofollow\">\u0414\u043b\u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Future\" rel=\"noopener noreferrer nofollow\">\u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u043b\u0430\u043d\u044b<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"#Links\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0438<\/a> (\u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043d\u0430\u043b \u0438 \u0442.\u043f.)<\/p>\n<\/li>\n<li>\n<p>\u0422\u044b\u043a\u043d\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u043f\u0440\u043e\u0441 <a href=\"#End\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043b\u0435 <\/a>\u0441\u0442\u0430\u0442\u044c\u0438)<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f (\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u044b)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438: NLP (\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f LLM, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b), TTS, STT, \u0447\u0443\u0442\u043e\u043a CV<\/p>\n<p><em>(\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440 \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u043d\u044b \u0434\u0430\u043b\u0435\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435)<\/em><\/p>\n<p>\u042f\u0437\u044b\u043a\u0438:<code>Python, \u043d\u0435\u043c\u043d\u043e\u0433\u043e Java<\/code><\/p>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b Python:<code>pytorch, multiprocessing &amp; multithreading, flask, websocket, asyncio, pysimplegui, py4j, sqlite, a bit tensorflow<\/code><\/p>\n<p>\u041f\u041e: IDE JetBrains PyCharm Community \u0438 Intellij Idea, OBS, VTube Studio, Docker Desktop (WSL)<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0432\u00a0\u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u0430\u043a\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f, \u0441\u0442\u0430\u0442\u044c\u044e \u0434\u0435\u043b\u044f\u0442 \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u00ab\u043a\u043b\u0430\u0441\u0441\u043e\u0432\u00bb \u0438 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0433\u0434\u0430\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u00a0\u043f\u043e\u0442\u043e\u043c. \u041d\u043e\u00a0\u044f \u043d\u0435\u00a0\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c \u0442\u044f\u043d\u0443\u0442\u044c\u00a0\u0431\u044b\u043a\u0430 \u0437\u0430\u00a0\u044f\u0439\u0446\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u043e\u043b\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0441\u0440\u0430\u0437\u0443! <span class=\"habrahidden\">\u0410\u00a0\u0435\u0449\u0451 \u043c\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0435\u043d\u044c \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u00a0\u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438, \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u043d\u0438\u0445, \u0441\u043d\u043e\u0432\u0430 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0435\u0433\u0438 \u0438\u00a0\u0442.\u00a0\u0434. =)<\/span><\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0449\u0451 \u043f\u0440\u043e \u0444\u043e\u0440\u043c\u0430\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u0430\u0441\u0430\u0435\u043c\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b \u0441\u0442\u0430\u0442\u0435\u0439\u043a\u0443 \u043a\u0430\u043a\u00a0\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b, \u043d\u043e\u00a0\u043f\u043e\u00a0\u0444\u0430\u043a\u0442\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 <strong>\u043e\u0447\u0435\u043d\u044c<\/strong> \u0442\u0440\u0443\u0434\u043d\u043e, \u0438 \u0443\u0436 \u0442\u043e\u0447\u043d\u043e \u0432\u0440\u044f\u0434\u00a0\u043b\u0438 \u043a\u0442\u043e\u2011\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u044b \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u043d\u0430\u00a0\u043f\u043e\u043b\u043d\u043e\u0435 \u00ab\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u00bb \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0443. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f <strong>\u043d\u0435<\/strong> \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b <strong>\u0432\u0435\u0441\u044c<\/strong> \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u00a0GitHub (\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u0438) \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430 \u0434\u043b\u044f <strong>\u0441\u0430\u043c\u044b\u0445 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 (<\/strong><a href=\"#CodeDisclaimer\" rel=\"noopener noreferrer nofollow\"><strong>\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435<\/strong><\/a><strong>)<\/strong>. \u041f\u043e\u00a0\u044d\u0442\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u044f \u0443\u0431\u0440\u0430\u043b \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043c\u0435\u0442\u043a\u0443 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a\u00a0\u0432\u00a0\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435, \u0432\u00a0\u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043f\u043e\u0445\u043e\u0436\u0435\u043c \u043d\u0430\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0447\u0435\u0433\u043e\u2011\u043b\u0438\u0431\u043e.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u00a0\u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e. \u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f <span class=\"habrahidden\">(\u043d\u043e \u043d\u0435\u00a0\u0432\u0435\u0437\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c)<\/span> \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0442\u0430\u043a,\u00a0\u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0434\u043b\u044f\u00a0\u043d\u043e\u0432\u0438\u0447\u043a\u0430 \u0438 \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u043e \u043d\u0435\u0441\u043a\u0443\u0447\u043d\u044b\u043c \u0447\u0442\u0438\u0432\u043e\u043c \u043a\u0440\u0443\u0442\u043e\u043c\u0443 \u0441\u043f\u0435\u0446\u0443.<\/p>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u044d\u0442\u043e\u0442 \u043e\u043f\u044b\u0442 \u043c\u043e\u0436\u0435\u0442 \u0433\u0434\u0435\u2011\u0442\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f, \u043f\u0440\u0430\u0432\u0434\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u00a0\u043a\u0443\u0447\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439&#8230; \u041a\u0440\u0443\u0442\u044b\u043c \u0441\u043f\u0435\u0446\u0430\u043c\u00a0\u2014 \u043f\u043e\u0440\u0436\u0430\u0442\u044c \u0441\u00a0\u043a\u043e\u0441\u0442\u044b\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0440\u0435\u0434\u043e\u043a\u043e\u0434\u0430 \u0438 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u00a0\u043b\u0443\u0447\u0448\u0435 \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0442\u044c. \u0410\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u0431\u0435\u0437\u00a0\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0432\u00a0\u043f\u0440\u043e\u0444\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u0444\u0435\u0440\u0435\u00a0\u2014 \u0441\u00a0\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u043c \u043f\u043e\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0437\u0430\u00a0\u043c\u043e\u0438\u043c\u0438 <s>\u043c\u0443\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/s> <s>\u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u044f\u043c\u0438<\/s> <s>\u043f\u044b\u0442\u043a\u0430\u043c\u0438<\/s> (\u0442\u0430\u043a \u0438 \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0441\u0438\u043d\u043e\u043d\u0438\u043c \u043f\u043e\u0434\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u00a0\u043d\u0443\u043b\u044f), \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u043b \u043a \u0443\u0441\u043f\u0435\u0445\u0443 (\u0421\u041f\u041e\u0419\u041b\u0415\u0420: \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 0.0001) \u0438 \u043f\u043e\u0434\u0447\u0435\u0440\u043f\u043d\u0443\u0442\u044c \u0434\u043b\u044f\u00a0\u0441\u0435\u0431\u044f \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0437\u044c\u044f\u043c.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u044d\u0442\u0438 \u0432\u0430\u0448\u0438 \u0442\u044f\u043d, \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0442.\u0434.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u043f\u043e\u00a0\u0441\u0435\u0431\u0435 (<em>\u0434\u0430-\u0434\u0430, \u0441\u0430\u043c \u0438\u0437\u00a0\u0447\u0438\u0441\u043b\u0430 \u0442\u0435\u0445, \u0434\u043e\u00a0\u043a\u043e\u0433\u043e \u00ab\u0442\u0440\u0435\u043d\u0434\u044b\u00bb, \u0435\u0441\u043b\u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u0442\u044c, \u0434\u043e\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c<\/em>), \u0447\u0442\u043e\u00a0\u043a\u0442\u043e\u2011\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u00a0\u0432\u044a\u0435\u0437\u0436\u0430\u0442\u044c \u0432\u043e\u00a0\u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043c\u043e\u043b\u043e\u0434\u0451\u0436\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 \u00ab\u0442\u044f\u043d\u043a\u0430\u00bb \u0438 \u043f\u0440. \u0412\u00a0\u044d\u0442\u043e\u043c \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u0439, <strong>\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u0435\u0435 \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u0435<\/strong>. <em>\u0414\u043b\u044f\u00a0\u0432\u0441\u0435\u0437\u043d\u0430\u044e\u0449\u0438\u0445, \u043a\u0441\u0442\u0430\u0442\u0438, \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u043d\u0430\u0432\u0435\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u043d\u043e\u0441\u0442\u0430\u043b\u044c\u0433\u0438\u044e&#8230;<\/em><\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0433\u0443\u0433\u043b\u0430 \u2013 \u0434\u0430, \u044d\u0442\u0430 \u0431\u0430\u0437\u0430&#8230; \u041d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0445 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c, \u0432\u0435\u0434\u044c \u0442\u043e\u0442 \u0436\u0435 \u0433\u0443\u0433\u043b \u043c\u043e\u0436\u0435\u0442 (\u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043c\u043e\u0436\u0435\u0442) \u0432\u044b\u0434\u0430\u0442\u044c \u043d\u0435\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u0443\u044e \u0438\u043d\u0444\u0443 \u0438 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u00ab\u0437\u0435\u043b\u0451\u043d\u044b\u0439\u00bb \u043d\u043e\u0432\u0438\u0447\u043e\u043a.<\/p>\n<ul>\n<li>\n<p>\u0421\u0442\u0440\u0438\u043c\u00a0\u2014 \u043f\u0440\u044f\u043c\u0430\u044f \u043e\u043d\u043b\u0430\u0439\u043d\u2011\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0434\u043b\u044f\u00a0\u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Twitch, YouTube, Trovo \u0438 \u0434\u0440. \u041a\u0430\u043a\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0435\u0434\u0443\u0442 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u043d\u0430\u0442\u044b (\u043e\u0442 donate\u00a0\u2014 \u00ab\u0436\u0435\u0440\u0432\u0442\u043e\u0432\u0430\u0442\u044c\u00bb)\u00a0\u2014 \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f. \u0420\u0430\u0434\u0438 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0434\u043e\u043d\u0430\u0442\u043e\u0432, \u0430\u00a0\u0435\u0449\u0451 \u0434\u043b\u044f\u00a0\u0440\u043e\u0441\u0442\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0439 (\u043b\u0430\u0439\u043a\u043e\u0432, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 \u0438 \u043f\u0440.) <em>\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435<\/em> \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0442\u0432\u043e\u0440\u0438\u0442\u044c \u0432\u0441\u044f\u043a\u0443\u044e <strong>\u0434\u0438\u0447\u044c<\/strong>, \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e\u00a0\u0440\u0430\u0437\u0434\u0435\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u0438\u043b\u0438\u00a0\u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430. <em>\u0421\u0442\u0440\u0438\u043c\u0435\u0440\u044b<\/em>, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0433\u0440, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 \u0432\u0438\u0434\u043e\u0441\u0438\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e. <em>\u0421\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0438<\/em> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0438\u0445 \u043d\u0430 \u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c, \u043a\u0445\u043c, \u043a\u0430\u043a \u0431\u044b \u044d\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u00ab<em>\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b<\/em>\u00bb&#8230;<\/p>\n<\/li>\n<li>\n<p><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p>&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/85f\/295\/7dc\/85f2957dcb356a4fe2e1b974fbe26c03.jpg&#187; data-abbr=&#187;\u0422\u044f\u043d&#187; data-image-width=&#187;736&#8243; data-image-height=&#187;1102&#8243;>\u0422\u044f\u043d<\/abbr> (\u0442\u044f\u043d\u043a\u0430, tyan)\u00a0\u2014 <abbr class=\"habraabbr\" title=\"\u0440\u0435\u0434. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 &quot;\u0442\u044f\u043d&quot; \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u0434\u0435\u0432\u0443\u0448\u043a\u0443, \u043d\u043e \u0432 \u042f\u043f\u043e\u043d\u0441\u043a\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0432\u0443\u0448\u043a\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441. \u0422\u044f\u043d, \u043a\u0443\u043d, \u0441\u0430\u043d, \u0441\u0430\u043c\u0430 - \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b. &quot;\u0422\u044f\u043d&quot; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0431\u044f \u043c\u043b\u0430\u0434\u0448\u0435. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e &quot;\u0442\u044f\u043d&quot; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0434\u0435\u0432\u043e\u0447\u043a\u0435. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043c\u0443\u0436\u0441\u043a\u043e\u043c \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0443\u0436\u0447\u0438\u043d\u0430\u043c.\" data-title=\"&lt;p>\u0440\u0435\u0434. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 &quot;\u0442\u044f\u043d&quot; \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u0434\u0435\u0432\u0443\u0448\u043a\u0443, \u043d\u043e \u0432 \u042f\u043f\u043e\u043d\u0441\u043a\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0432\u0443\u0448\u043a\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441. \u0422\u044f\u043d, \u043a\u0443\u043d, \u0441\u0430\u043d, \u0441\u0430\u043c\u0430 &#8212; \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b. &quot;\u0422\u044f\u043d&quot; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0431\u044f \u043c\u043b\u0430\u0434\u0448\u0435. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e &quot;\u0442\u044f\u043d&quot; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0434\u0435\u0432\u043e\u0447\u043a\u0435.&lt;em>&amp;nbsp;\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043c\u0443\u0436\u0441\u043a\u043e\u043c \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0443\u0436\u0447\u0438\u043d\u0430\u043c.&lt;\/em>&lt;\/p>&#187; data-abbr=&#187;\u0434\u0435\u0432\u0443\u0448\u043a\u0430? \u041d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c&#187;>\u0434\u0435\u0432\u0443\u0448\u043a\u0430<\/abbr> \u0432\u00a0\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441\u00a0\u044f\u043f\u043e\u043d\u0441\u043a\u043e\u0433\u043e. \u041f\u043e\u043d\u044f\u0442\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u043c\u043e\u043b\u043e\u0434\u0451\u0436\u043d\u044b\u043c, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u00ab\u0442\u044f\u043d\u00bb \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0445 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f\u0445 \u2013 <strong><abbr class=\"habraabbr\" title=\"\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u0432, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u044b\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u043a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c \u0438 \u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u044f\u043c. \u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435\u00a0 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u0430\u043d\u0438\u043c\u0435 &quot;\u0421\u0443\u0434\u044c\u0431\u0430\/\u043d\u043e\u0447\u044c \u0441\u0445\u0432\u0430\u0442\u043a\u0438&quot;\" data-title=\"&lt;p>\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u0432, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u044b\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u043a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c \u0438 \u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u044f\u043c.&lt;\/p>&lt;p>\u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435&amp;nbsp; \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u0430\u043d\u0438\u043c\u0435 &quot;\u0421\u0443\u0434\u044c\u0431\u0430\/\u043d\u043e\u0447\u044c \u0441\u0445\u0432\u0430\u0442\u043a\u0438&quot;&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a13\/384\/831\/a1338483130d49ab0ad77c31ebb7f544.gif&#187; data-abbr=&#187;\u0430\u043d\u0438\u043c\u0435&#187; data-image-width=&#187;540&#8243; data-image-height=&#187;304&#8243;>\u0430\u043d\u0438\u043c\u0435<\/abbr><\/strong>. \u0412\u043e\u043e\u0431\u0449\u0435, \u0441 \u0430\u043d\u0438\u043c\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0435\u043d\u0434\u043e\u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u043b\u043e\u0434\u0451\u0436\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442\u00a0\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u043a\u043e\u0432 \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0441\u0430\u043c\u044b\u043c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0430\u043d\u0438\u043c\u0435\u2011\u0441\u0435\u043a\u0442\u0430\u043d\u0442\u0441\u0442\u0432\u043e\u043c (\u0448\u0443\u0442\u043a\u0430). <abbr class=\"habraabbr\" title=\"\u041d\u0430 \u0444\u043e\u0442\u043e \u043b\u044e\u0434\u0438, \u043f\u0435\u0440\u0435\u043e\u0434\u0435\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 &quot;\u0410\u043a\u0430\u0442\u0441\u0443\u043a\u0438&quot; \u0438\u0437 \u0430\u043d\u0438\u043c\u0435 &quot;\u041d\u0430\u0440\u0443\u0442\u043e&quot;\" data-title=\"&lt;p>\u041d\u0430 \u0444\u043e\u0442\u043e \u043b\u044e\u0434\u0438, \u043f\u0435\u0440\u0435\u043e\u0434\u0435\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 &quot;\u0410\u043a\u0430\u0442\u0441\u0443\u043a\u0438&quot; \u0438\u0437 \u0430\u043d\u0438\u043c\u0435 &quot;\u041d\u0430\u0440\u0443\u0442\u043e&quot;&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/091\/a00\/8d7\/091a008d75d2270b751dc3853ee13d03.jpg&#187; data-abbr=&#187;\u0410\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u0438&#187; data-image-width=&#187;604&#8243; data-image-height=&#187;453&#8243;>\u0410\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u0438<\/abbr>\u00a0\u2014 \u043e\u0441\u043e\u0431\u043e \u044f\u0440\u044b\u0435 \u0437\u043d\u0430\u0442\u043e\u043a\u0438 \u0430\u043d\u0438\u043c\u0435, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0441\u0432\u043e\u044e \u0431\u0435\u0437\u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u044c, \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0437\u0430\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u043b\u0438\u0441\u044c \u0431\u0443\u043b\u043b\u0438\u043d\u0433\u0443 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0441\u043e\u0431\u043e \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0430\u043b\u043e\u043b\u0435\u0442\u043d\u0438\u0445 \u043d\u0435\u0430\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u043e\u0432, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0442\u043e\u0436\u0435 \u0441\u0442\u0430\u043b\u0438 \u0430\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u0430\u043c\u0438. \u0412\u00a0\u043e\u0431\u0449\u0435\u043c, \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0438 \u0432\u00a0\u0433\u0443\u0433\u043b\u0435.<\/p>\n<\/li>\n<li>\n<p><abbr class=\"habraabbr\" title=\"\u041c\u043d\u043e\u0433\u0438\u0435 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435) \u043f\u0438\u0448\u0443\u0442 \u0434\u043e\u043a\u0438\u043c\u0430\u0442\u0443\u0440\u0430, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 &quot;\u0434\u0430\u043a\u0438\u043c\u0430\u043a\u0443\u0440\u0430&quot;.\" data-title=\"&lt;p>\u041c\u043d\u043e\u0433\u0438\u0435 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435) \u043f\u0438\u0448\u0443\u0442 \u0434\u043e\u043a\u0438\u043c\u0430\u0442\u0443\u0440\u0430, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 &quot;\u0434\u0430\u043a\u0438\u043c\u0430\u043a\u0443\u0440\u0430&quot;.&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ec3\/e31\/e07\/ec3e31e070223e7b0536df4958c5597e.jpg&#187; data-abbr=&#187;\u0414\u043e\u043a\u0438\u043c\u0430\u0442\u0443\u0440\u0430&#187; data-image-width=&#187;1200&#8243; data-image-height=&#187;800&#8243;>\u0414\u0430\u043a\u0438\u043c\u0430\u043a\u0443\u0440\u0430<\/abbr>\u00a0\u2014 \u043f\u043e\u0434\u0443\u0448\u043a\u0430 \u0441\u00a0\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c <abbr class=\"habraabbr\" title=\"\u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\" data-title=\"&lt;p>\u0438\u043b\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430&lt;\/p>&#187; data-abbr=&#187;\u0442\u044f\u043d\u043a\u0438&#187;>\u0442\u044f\u043d\u043a\u0438<\/abbr> \u0438\u0437\u00a0\u0430\u043d\u0438\u043c\u0435. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0442\u0440\u0438\u0431\u0443\u0442 \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u0435\u0431\u044f \u0430\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u0430 (<em>\u0448\u0443\u0442\u043a\u0430<\/em>).<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u043a\u0441\u0438\u043a \u2014 \u043d\u0435\u0434\u043e\u0431\u0440\u043e\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0447\u0430\u0441\u0442\u043e \u0437\u043b\u043e\u0439, \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u0441\u044f \u0437\u0430\u0434\u0435\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0430 \u0434\u0440\u0443\u0433\u0438\u0445.<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<h2>\u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438<\/h2>\n<p>\u0414\u043e\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u044f \u0441\u0440\u0430\u0437\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043c\u043e\u0433\u043b\u0430 \u0432\u043e\u00a0\u0447\u0442\u043e\u2011\u0442\u043e \u0438\u0433\u0440\u0430\u0442\u044c. \u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0430\u043c\u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c, \u043d\u043e\u00a0\u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439 \u0434\u043e\u043b\u0436\u0435\u043d\u00a0\u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u044d\u0442\u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043c\u043e\u0433\u043b\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u00a0\u0438\u0433\u0440\u043e\u0439, \u043a\u0430\u043a\u00a0\u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u0441\u00a0\u0438\u0433\u0440\u043e\u0432\u044b\u043c \u0447\u0430\u0442\u043e\u043c \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043f\u0443\u0442\u0451\u043c \u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u0418\u0433\u0440\u0430 \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u0430\u00a0\u0431\u044b\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c <abbr class=\"habraabbr\" title=\"\u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u0432\u0430\u0442\u0430\u0440\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a, \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b. \u041e\u0431\u044b\u0447\u043d\u043e \u043b\u044e\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0432\u0430\u0442\u0430\u0440\u044b \u0432 \u043f\u0430\u0440\u0435 \u0441 \u0432\u0435\u0431\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0442\u0440\u0435\u043a\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0435\u0439\u0441\u044b \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0430\u0432\u0430\u0442\u0430\u0440\u0430 \u0438 \u0431\u044b\u0442\u044c \u043e\u0441\u043e\u0431\u043e &quot;\u043c\u043e\u0434\u043d\u044b\u043c\u0438&quot;. \u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u043d\u0435 \u0431\u043e\u0439\u0442\u0435\u0441\u044c, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 =)\" data-title=\"&lt;p>\u0412 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u0432\u0430\u0442\u0430\u0440\u043e\u043c \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0432\u0438\u0434\u0435\u043e\u043f\u043e\u0442\u043e\u043a, \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u0435\u0431-\u043a\u0430\u043c\u0435\u0440\u044b. \u041e\u0431\u044b\u0447\u043d\u043e \u043b\u044e\u0434\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0430\u0432\u0430\u0442\u0430\u0440\u044b \u0432 \u043f\u0430\u0440\u0435 \u0441 \u0432\u0435\u0431\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u0442\u0440\u0435\u043a\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0444\u0435\u0439\u0441\u044b \u043d\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u0430\u0432\u0430\u0442\u0430\u0440\u0430 \u0438 \u0431\u044b\u0442\u044c \u043e\u0441\u043e\u0431\u043e &quot;\u043c\u043e\u0434\u043d\u044b\u043c\u0438&quot;.&lt;\/p>&lt;p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b\u0438, \u043d\u0435 \u0431\u043e\u0439\u0442\u0435\u0441\u044c, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 =)&lt;\/p>&#187; data-abbr=&#187;\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0432\u0430\u0442\u0430\u0440&#187;>\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0432\u0430\u0442\u0430\u0440<\/abbr>, \u043b\u044e\u0431\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u00a0\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432\u00a0\u0438\u0433\u0440\u0435 (\u043d\u0430\u043c \u043d\u0443\u0436\u043d\u0430 \u0436\u0438\u0432\u0430\u044f 2\u0434 \u0442\u044f\u043d, \u0430\u00a0\u043d\u0435\u00a0\u0434\u0430\u043a\u0438\u043c\u0430\u043a\u0443\u0440\u0430).<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0430 \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430 \u0431\u0430\u043d \u043d\u0430\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0441\u0440\u0430\u0437\u0443\u00a0\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 (\u044d\u0442\u043e\u0442 \u043f\u0443\u043d\u043a\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u00a0\u0441\u0435\u0431\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438) \u0438 \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043c\u043e\u0433\u043b\u0430 \u00ab\u0432\u0435\u0441\u0435\u043b\u043e\u00bb \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u00a0\u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u00ab\u043f\u043e\u0434\u043a\u0430\u043b\u044b\u0432\u0430\u044f\u00bb \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u00a0\u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043c\u0443\u043d\u0438\u043a\u0430\u0446\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u0430\u0445: \u0432\u00a0\u0443\u0441\u0442\u043d\u043e\u043c (\u0441\u0438\u043d\u0442\u0435\u0437 \u0438 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0447\u0438) \u0438 \u043f\u0438\u0441\u044c\u043c\u0435\u043d\u043d\u043e\u043c (\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u00a0\u0438\u0433\u0440\u0435, \u0432\u00a0\u0447\u0430\u0442\u0435 \u043d\u0430\u00a0\u042e\u0442\u0443\u0431\u0435, \u0422\u0432\u0438\u0442\u0447\u0435 \u0438\u00a0\u0442.\u00a0\u0434.)<\/p>\n<\/li>\n<li>\n<p>\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u0431\u0435\u0437\u00a0\u0443\u0447\u0430\u0441\u0442\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043a\u0430\u043a\u00a0\u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0437\u044e\u043c\u0438\u0440\u0443\u044f \u0432\u044b\u0448\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435, \u043d\u0430\u0448\u0430 (\u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u044f \u0432\u0430\u043c \u043d\u0435\u00a0\u043d\u0440\u0430\u0432\u043b\u044e\u0441\u044c, \u043c\u043e\u044f) \u0446\u0435\u043b\u044c\u00a0\u2014 \u0441\u0432\u0430\u0440\u0433\u0430\u043d\u0438\u0442\u044c \u0418\u0418 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0443 \u0441\u00a0\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u0432\u0430\u0442\u0430\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0431\u0435\u0437\u00a0\u043f\u0435\u0440\u0435\u0440\u044b\u0432\u043e\u0432 \u0438\u0433\u0440\u0430\u0442\u044c \u0432\u00a0\u0438\u0433\u0440\u0443, \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430\u00a0\u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0438\u0445 \u0438 \u043f\u043e\u0434\u043a\u0430\u043b\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043a\u0441\u0438\u043a\u043e\u0432! \u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430\u00a0\u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0438 \u00ab\u0432\u0435\u0441\u0451\u043b\u043e\u0439\u00bb, \u0430\u00a0\u0442\u0430\u043a\u0436\u0435 \u0437\u043d\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u00ab\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f\u00bb \u0432\u00a0\u0441\u0432\u043e\u0451\u043c \u00ab\u0432\u0435\u0441\u0435\u043b\u044c\u0435\u00bb, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0443.<\/p>\n<p>\u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <\/p>\n<ol>\n<li>\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u0442\u0435\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439. \u041f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043c \u0446\u0435\u043b\u044c \u0432\u00a0\u0437\u0430\u0434\u0430\u0447\u0438. \u0421\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u0449\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 (\u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0431\u043e\u0442).<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0432\u044f\u0436\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0451\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0442\u0440\u0438\u043c.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0443\u0434\u0435\u043c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u043f\u0443\u043d\u043a\u0442\u044b 5\u20136\u00a0\u0434\u043e\u00a0\u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442\u043e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p><s>\u041f\u043e\u0439\u043c\u0451\u043c, \u0447\u0442\u043e\u00a0\u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0438\u0441\u044c \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0444\u0438\u0433\u043d\u0435\u0439 \u0438 \u0432\u043f\u0430\u0434\u0451\u043c \u0432\u00a0\u0434\u0435\u043f\u0440\u0435\u0441\u0441\u0438\u044e<\/s> \u041e\u0442\u043f\u0440\u0430\u0437\u0434\u043d\u0443\u0435\u043c \u043a\u0430\u0441\u0442\u0440\u044e\u043b\u0435\u0439 \u043a\u0432\u0430\u0441\u0430 \u043d\u0430\u0448\u0435 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0435 \u0442\u0432\u043e\u0440\u0435\u043d\u0438\u0435 \u0438 \u043d\u0430\u043a\u043e\u043d\u0435\u0446 \u043b\u044f\u0436\u0435\u043c \u043f\u043e\u0441\u043f\u0430\u0442\u044c \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0437\u0430\u00a0\u0433\u043e\u0434. <span class=\"habrahidden\">\u0412\u00a0\u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u0441\u0442\u0430\u0442\u0438, \u043f\u043e\u0441\u043f\u0430\u0442\u044c \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0432\u0435\u0434\u044c \u0443\u00a0\u043c\u0435\u043d\u044f \u043d\u0430\u00a0\u043d\u043e\u0441\u0443 \u0437\u0430\u0449\u0438\u0442\u0430 \u0434\u0438\u043f\u043b\u043e\u043c\u0430, \u0430\u00a0\u0435\u0449\u0451 \u043d\u0430\u0434\u043e \u0441\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0441\u0442\u0443\u043f\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u00a0\u0432\u0443\u0437, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u00a0\u0442\u043e\u043c\u0443\u00a0\u0436\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0449\u0451 \u0432\u044b\u0431\u0440\u0430\u0442\u044c&#8230;<\/span><\/p>\n<\/li>\n<\/ol>\n<h2>\u0412\u044b\u0431\u043e\u0440 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0438 \u043a\u00a0\u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0432\u0435\u0449\u0430\u043c. \u0414\u043b\u044f\u00a0\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e <em>(\u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u044f\u0433\u043a\u043e \u0441\u043a\u0430\u0437\u0430\u043d\u043e)<\/em> \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u043a\u0430\u043a\u00a0\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0430, \u043d\u0443\u0436\u043d\u043e, \u043a\u0430\u043a\u00a0\u043c\u0438\u043d\u0438\u043c\u0443\u043c, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0435\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0437\u00a0\u043d\u0438\u0445 \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u043a\u00a0\u043d\u0430\u0448\u0435\u043c\u0443 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h3>\u0418\u0433\u0440\u0430<\/h3>\n<p><a class=\"anchor\" name=\"Game\" id=\"Game\"><\/a><\/p>\n<p>Minecraft. \u041d\u0443 \u044d\u0442\u043e\u0442 \u0432\u044b\u0431\u043e\u0440 \u0434\u0430\u0436\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043d\u0435\u00a0\u043d\u0443\u0436\u043d\u043e, \u043e\u043d \u043e\u0447\u0435\u0432\u0438\u0434\u0435\u043d.<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"float bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b01\/bff\/07c\/b01bff07c40ad22fc2cbdac04482c293.png\" alt=\"\u042d\u0442\u0430 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u0430...\" title=\"\u042d\u0442\u0430 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u0430...\" width=\"1024\" height=\"809\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b01\/bff\/07c\/b01bff07c40ad22fc2cbdac04482c293.png\"\/><\/p>\n<div><figcaption>\u042d\u0442\u0430 \u0430\u0442\u043c\u043e\u0441\u0444\u0435\u0440\u0430&#8230;<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f\u00a0\u0432\u0441\u0435\u0445 <s>\u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0445 \u0441\u0444\u0435\u0440\u043e\u0438\u0434\u043e\u0432<\/s> \u043e\u0431\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u043b\u044e\u0434\u0435\u0439 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u044e, \u0447\u0442\u043e <a href=\"https:\/\/www.youtube.com\/watch?v=7a1Utq6PVHc\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u00a0\u2014 \u044d\u0442\u043e \u043d\u0435\u00a0\u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0433\u0440\u0430, \u044d\u0442\u043e \u0436\u0438\u0437\u043d\u044c<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u0430\u0440\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u043c\u044b\u0441\u043b \u043a\u00a0\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044e \u0432\u00a0\u043f\u0435\u0440\u0438\u043e\u0434 \u0434\u0435\u043f\u0440\u0435\u0441\u0441\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u00a0\u043d\u0438\u0445 \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0441 <s>\u0443\u0440\u043e\u043a\u043e\u0432<\/s> \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u00a0\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u0437\u043f 999\u043a $\/\u043d\u0430\u043d\u043e\u0441\u0435\u043a.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0430\u0433\u0435\u043d\u0442<\/h3>\n<p>\u0414\u043b\u044f\u00a0\u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0438 \u044f \u043d\u0435\u00a0\u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u0418\u0418 \u0438\u0433\u0440\u043e\u043a\u043e\u043c\u00a0\u2014 \u043c\u043d\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b\u00a0\u0431\u044b\u043b \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u043c\u043e\u0433\u00a0\u0431\u044b \u0438\u0433\u0440\u0430\u0442\u044c \u043d\u0430\u00a0\u043a\u0430\u043a\u0438\u0445\u2011\u043b\u0438\u0431\u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0430\u0431\u0430\u0445\u0430\u0442\u044c \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u0430\u043a\u043e\u0439\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0435\u00a0\u0441\u0430\u043c\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u0430\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0434\u043b\u044f\u00a0\u0438\u0433\u0440\u044b \u0441\u00a0\u043b\u044e\u0434\u044c\u043c\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u00a0\u043c\u0438\u043d\u0438\u0438\u0433\u0440\u0435 <strong>SkyWars<\/strong> \u0431\u043e\u0442\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 <abbr class=\"habraabbr\" title=\"\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b\" data-title=\"&lt;p>\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b&lt;\/p>&#187; data-abbr=&#187;\u043b\u0443\u0442\u0430\u0442\u044c \u0440\u0435\u0441\u044b&#187;>\u043b\u0443\u0442\u0430\u0442\u044c \u0440\u0435\u0441\u044b<\/abbr> \u0438 \u0443\u0431\u0438\u0432\u0430\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u00a0\u0447\u0430\u0442).<\/p>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044f \u043e MineRL<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442\u044c \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0433\u0440\u043e\u0439, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435\u0439\u0440\u043e\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0438 NeuroSama, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b <a href=\"https:\/\/minerl.readthedocs.io\/en\/latest\/\" rel=\"noopener noreferrer nofollow\">MineRL<\/a>, \u0434\u043b\u044f\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u043e \u043f\u043e\u0434\u0435\u0440\u0433\u0438\u0432\u0430\u043d\u0438\u0435 \u043c\u044b\u0448\u0438, \u043a\u0430\u043a\u00a0\u043c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u0430\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u0430\u0445. <\/p>\n<figure class=\"float bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/370\/db5\/cc8\/370db5cc871aea5632fd605f1589cb25.gif\" alt=\"\u041c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0430 NeuroSama\" title=\"\u041c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0430 NeuroSama\" width=\"601\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/370\/db5\/cc8\/370db5cc871aea5632fd605f1589cb25.gif\"\/><\/p>\n<div><figcaption>\u041c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0430 NeuroSama<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0432\u044f\u0437\u0430\u043b \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u0439 \u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c <em>(\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e\u00a0\u043d\u0438\u043a\u0430\u043a, \u0430\u00a0\u0432\u0441\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u00ab\u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u00bb \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c\u044e \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0434\u043b\u044f \u00ab\u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430\u00bb, \u043d\u043e\u00a0\u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432 \u0443\u00a0\u043c\u0435\u043d\u044f \u043d\u0435\u0442 \u0434\u0430\u00a0\u0438 \u043c\u044b \u043d\u0435\u00a0\u0434\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c, \u0442\u0430\u043a \u0447\u0442\u043e\u00a0\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u043e\u0432\u0435\u0441\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0432\u00a0\u043f\u043e\u043a\u043e\u0435)<\/em>.<\/p>\n<p>\u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0442\u0435\u043c\u0430 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0418\u0418 \u0432\u00a0Minecraft, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0433\u043b\u044f\u0434\u0435\u0442\u044c <a href=\"https:\/\/github.com\/MineDojo\/MineDojo\" rel=\"noopener noreferrer nofollow\">MineDojo<\/a>. \u0418\u0437\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u0438\u043d\u0442\u0435\u0440\u0435\u0441 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/MineDojo\/Voyager\" rel=\"noopener noreferrer nofollow\">VOYAGER<\/a> (\u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435\u00a0\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043f\u043f\u0430\u0440\u0430\u0442, \u0430\u00a0\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0433\u0435\u043d\u0442\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u043e\u0439 Minecraft \u0447\u0435\u0440\u0435\u0437 ChatGPT \u0438 \u0431\u043e\u0442\u0430 MineFlayer JS), \u044f\u00a0\u0436\u0435 \u043f\u043e\u0439\u0434\u0443 \u043f\u0443\u0442\u0451\u043c <em>\u043f\u043e\u043f\u0440\u043e\u0449\u0435<\/em>\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u043e\u0434 \u043d\u0430\u00a0Minecraft, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0433\u0440\u043e\u0439 \u043f\u0440\u0438\u00a0\u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043c\u0430\u043d\u0434.<\/p>\n<\/div>\n<\/details>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/499\/a76\/d2b\/499a76d2ba3b5326f4457c183c904ab0.png\" alt=\"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e Baritone \u0432 Minecraft\" title=\"\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e Baritone \u0432 Minecraft\" width=\"1280\" height=\"720\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/499\/a76\/d2b\/499a76d2ba3b5326f4457c183c904ab0.png\"\/><\/p>\n<div><figcaption>\u0412\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e Baritone \u0432\u00a0Minecraft<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0447\u0435\u043d\u044c \u043f\u043e\u0432\u0435\u0437\u043b\u043e, \u0447\u0442\u043e\u00a0\u043d\u0430\u00a0\u0433\u043b\u0430\u0437\u0430 \u043f\u043e\u043f\u0430\u043b\u0441\u044f <a href=\"https:\/\/github.com\/gaucho-matrero\/altoclef\" rel=\"noopener noreferrer nofollow\">AltoClef <\/a>\u2014 \u043c\u043e\u0434 \u0434\u043b\u044f\u00a0Minecraft (<a href=\"https:\/\/fabricmc.net\/wiki\/start\" rel=\"noopener noreferrer nofollow\"><abbr class=\"habraabbr\" title=\"\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u043e\u0434\u043e\u0432 \u043d\u0430 Java-\u0432\u0435\u0440\u0441\u0438\u044e \u0438\u0433\u0440\u044b Minecraft.\" data-title=\"&lt;p>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u043e\u0434\u043e\u0432 \u043d\u0430 Java-\u0432\u0435\u0440\u0441\u0438\u044e \u0438\u0433\u0440\u044b Minecraft.&lt;\/p>&#187; data-abbr=&#187;Fabric&#187;>Fabric<\/abbr><\/a>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 <a href=\"https:\/\/www.youtube.com\/watch?v=nG9ZdNcTxBg\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0439\u0442\u0438 <\/a>\u0438\u0433\u0440\u0443 \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0432\u043e\u0435\u0439 \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0430\u0441\u043a\u043e\u0432 (\u0437\u0430\u0434\u0430\u0447). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u0430\u0441\u043a \u00ab\u043f\u0440\u043e\u0439\u0442\u0438 \u0438\u0433\u0440\u0443\u00bb \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u00a0\u0441\u0435\u0431\u044f \u0437\u0430\u0434\u0430\u0447\u0443 \u00ab\u0434\u043e\u0431\u044b\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u0430\u00bb; \u0437\u0430\u0434\u0430\u0447\u0430 \u00ab\u0434\u043e\u0431\u044b\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u0430\u00bb \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u00a0\u0437\u0430\u0434\u0430\u0447\u0438 \u00ab\u043d\u0430\u0439\u0442\u0438 \u0434\u0435\u0440\u0435\u0432\u043e\u00bb, \u00ab\u043f\u043e\u043b\u043e\u043c\u0430\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u043e\u00bb \u0438\u00a0\u0442.\u00a0\u0434. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e AltoClef \u0437\u0430\u043c\u0443\u0442\u0438\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u00ab\u0432\u044b\u0438\u0433\u0440\u0430\u0442\u044c \u0432\u00a0SkyWars\u00bb, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u0442 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u043b\u0443\u0442\u0438\u043d\u0433 \u0441\u0443\u043d\u0434\u0443\u043a\u043e\u0432 \u0438\u00a0\u0442.\u00a0\u043f. \u0414\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0432\u00a0AltoClef \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u0440\u0438\u00a0\u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u0434\u043e\u0431\u0440\u043e\u0433\u043e \u00ab\u043d\u0430\u0432\u0438\u0433\u0430\u0442\u043e\u0440\u0430\u00bb \u0434\u043b\u044f\u00a0\u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u00a0\u2014 <a href=\"https:\/\/github.com\/cabaletta\/baritone\" rel=\"noopener noreferrer nofollow\">Baritone<\/a> <em>(\u043c\u043d\u043e\u0433\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0430\u044e\u0442\u0441\u044f, \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u0418\u0418, \u043e\u0434\u043d\u0430\u043a\u043e \u0442\u0430\u043c \u0440\u0443\u043b\u0438\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u00a0\u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u0445).<\/em><\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u043c\u043e\u0434\u044b \u0434\u043b\u044f\u00a0Minecraft \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0438\u0448\u0443\u0442 \u043d\u0430\u00a0Java, \u0445\u043e\u0440\u043e\u0448\u043e\u00a0\u0431\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c \u043e\u00a0\u0441\u0432\u044f\u0437\u0438 \u043c\u043e\u0434\u0430 \u0441\u00a0\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f\u0432\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u00a0Python (\u0434\u0430\u043b\u0435\u0435 \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u043f\u043e\u0447\u0435\u043c\u0443). \u0418 \u0442\u0443\u0442 \u043d\u0430\u043c \u043d\u0430\u00a0\u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 \u0434\u0440\u0443\u0433 \u0433\u0443\u0433\u043b, \u0432\u00a0\u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u043e\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0443 \u0441\u0440\u0430\u0437\u0443\u00a0\u0436\u0435 \u0432\u044b\u043f\u043b\u044b\u0432\u0430\u0435\u0442 <strong>\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f\u00a0\u0441\u0432\u044f\u0437\u0438 Java \u0438 Python<\/strong> \u0441\u00a0\u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <a href=\"https:\/\/www.py4j.org\/\" rel=\"noopener noreferrer nofollow\">Py4j<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043f\u043e\u043b\u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043c\u043e\u0441\u0442 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u043e\u043c \u043d\u0430\u00a0Java \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u043d\u0430\u00a0Python.<\/p>\n<h3>\u0421\u0438\u043d\u0442\u0435\u0437 \u0440\u0435\u0447\u0438<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0440\u0430\u0442\u043a\u043e: \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0433\u043e\u043b\u043e\u0441 <strong>\u0442\u044f\u043d\u043a\u0438<\/strong>. \u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u0441\u0432\u043e\u0438 \u0440\u0430\u0437\u0434\u0443\u043c\u0438\u044f \u0441\u043f\u0443\u0441\u0442\u044f \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043d\u0430\u00a0\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e\u00a0\u0442\u0433 \u043a\u0430\u043d\u0430\u043b\u0430\u043c \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c <abbr class=\"habraabbr\" title=\"Text-to-speech, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u0438\u043d\u0442\u0435\u0437\u0430 \u0440\u0435\u0447\u0438\" data-title=\"&lt;p>Text-to-speech, \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u0441\u0438\u043d\u0442\u0435\u0437\u0430 \u0440\u0435\u0447\u0438&lt;\/p>&#187; data-abbr=&#187;TTS&#187;>TTS<\/abbr>\u00a0\u0431\u044b\u043b <a href=\"https:\/\/github.com\/snakers4\/silero-models\" rel=\"noopener noreferrer nofollow\">Silero<\/a>, \u0430\u00a0\u0434\u043b\u044f\u00a0\u0440\u043e\u043b\u0438 \u0442\u044f\u043d\u043a\u0438 \u0443\u00a0\u0441\u0438\u043b\u0435\u0440\u043e \u0438\u043c\u0435\u043b\u0441\u044f \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0433\u043e\u043b\u043e\u0441 <a href=\"https:\/\/soundcloud.com\/alexander-veysov\/baya-sample-01\" rel=\"noopener noreferrer nofollow\">Baya<\/a>. \u0412\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u0435\u0433\u043e\u00a0\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 CC BY\u2011NC \u043c\u044b \u043c\u043e\u0433\u043b\u0438\u00a0\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0433\u043e\u043b\u043e\u0441 \u0445\u043e\u0442\u044f\u00a0\u0431\u044b \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430, \u0430\u00a0\u0443\u0436\u0435 \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438\u00a0\u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e\u00a0\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u043e\u0439, \u0431\u043b\u0430\u0433\u043e \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u044f \u043d\u0435\u00a0\u0441\u0442\u043e\u0438\u0442 \u043d\u0430\u00a0\u043c\u0435\u0441\u0442\u0435 \u0438 \u043a\u00a0\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u043c\u044b \u043c\u043e\u0433\u043b\u0438\u00a0\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0422\u0422\u0421\u043a\u0438 \u0441\u00a0\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u043c\u0438 \u0433\u043e\u043b\u043e\u0441\u0430\u043c\u0438 \u0438\u00a0\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c\u0438.<\/p>\n<p><em>\u041a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430 \u0434\u0430\u043d\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <\/em><a href=\"https:\/\/github.com\/suno-ai\/bark\" rel=\"noopener noreferrer nofollow\"><em>Bark<\/em><\/a><em> (\u043e\u0444\u0438\u0433\u0435\u043d\u043d\u044b\u0439, \u043d\u043e\u00a0\u0442\u044f\u0436\u0435\u043b\u044b\u0439 \u0438 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439) \u0438 \u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 <\/em><a href=\"https:\/\/huggingface.co\/spaces\/TeraTTS\/TTS\" rel=\"noopener noreferrer nofollow\"><em>TeraTTS<\/em><\/a><em> (\u043e\u0447\u0435\u043d\u044c \u043a\u043b\u0430\u0441\u0441\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0433\u043e\u043b\u043e\u0441 GLaDOS, \u043d\u043e\u00a0\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 [\u0433\u043e\u043b\u043e\u0441\u043e\u0432]).<\/em><\/p>\n<h3>\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0432\u0430\u0442\u0430\u0440<\/h3>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u041f\u041e\u00a0\u0434\u043b\u044f\u00a0\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0432\u0430\u0442\u0430\u0440\u0430 \u0440\u0435\u0448\u0435\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c VTube Studio \u0438\u0437\u2011\u0437\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u00a0API \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0447\u0435\u0440\u0435\u0437 Python \u0432\u00a0\u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/457\/6df\/387\/4576df3870f8c11e49d3453f21c3996e.png\" alt=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 Live2D \u0432 Steam\" title=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 Live2D \u0432 Steam\" width=\"251\" height=\"252\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/457\/6df\/387\/4576df3870f8c11e49d3453f21c3996e.png\"\/><\/p>\n<div><figcaption>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 Live2D \u0432\u00a0Steam<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f\u00a0\u0441\u0430\u043c\u043e\u0433\u043e \u0430\u0432\u0430\u0442\u0430\u0440\u0430\u00a0\u0431\u044b\u043b\u0430 \u0432\u044b\u0431\u0440\u0430\u043d\u0430 Live2D \u043c\u043e\u0434\u0435\u043b\u044c \u00ab<a href=\"https:\/\/booth.pm\/ja\/items\/2685284\" rel=\"noopener noreferrer nofollow\">LiveroiD_A\u2011Y01<\/a>\u00bb \u043e\u0442\u00a0\u044f\u043f\u043e\u043d\u0441\u043a\u043e\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430. \u041d\u0430\u00a0\u0441\u0430\u0439\u0442\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0435\u043b\u0438\u00a0\u0431\u044b\u043b\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043e, \u0447\u0442\u043e\u00a0\u0430\u0432\u0442\u043e\u0440 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0435\u0451 \u0434\u043b\u044f\u00a0\u0432\u0438\u0434\u0435\u043e \u0438 \u043f\u0440\u044f\u043c\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0439. \u041c\u043e\u0434\u0435\u043b\u044c \u0442\u0430\u043a\u0436\u0435 <a href=\"https:\/\/steamcommunity.com\/sharedfiles\/filedetails\/?id=2854748348\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 <\/a>\u0432\u00a0Steam. \u041e\u043f\u044f\u0442\u044c\u00a0\u0436\u0435, \u043f\u0440\u0438\u00a0\u0440\u0430\u0437\u0432\u0438\u0442\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u043e\u0439\u043a\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0435\u0441\u0442\u0430\u0439\u043b\u0438\u043d\u0433 \u0438 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<p><em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e\u00a0\u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0430 NeuroSama \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u043d\u0430\u00a0\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u0432\u00a0VTube Studio \u043c\u043e\u0434\u0435\u043b\u0438 \u00ab<abbr class=\"habraabbr\" title=\"\u041e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0432 VTubeStudio \u043c\u043e\u0434\u0435\u043b\u0435\u0439\" data-title=\"&lt;p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u0432 VTubeStudio \u043c\u043e\u0434\u0435\u043b\u0435\u0439&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/569\/5b3\/df5\/5695b3df54758792dd1b3723ad11c5e9.jpg&#187; data-abbr=&#187;Hiyori&#187; data-image-width=&#187;1280&#8243; data-image-height=&#187;720&#8243;>Hiyori<\/abbr> Momose\u00bb<\/em> <em>\u0438 \u043d\u0438\u043a\u0442\u043e \u0430\u0432\u0442\u043e\u0440\u0430 \u0437\u0430\u00a0\u044d\u0442\u043e \u043e\u0441\u043e\u0431\u043e \u043d\u0435\u00a0\u043a\u0440\u0438\u0442\u0438\u043a\u043e\u0432\u0430\u043b =)<\/em><\/p>\n<p><a class=\"anchor\" name=\"ChoseLLM\" id=\"ChoseLLM\"><\/a><\/p>\n<h3>LLM<\/h3>\n<p>\u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 <abbr class=\"habraabbr\" title=\"LLM, Large Language Model, \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u2013 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c\" data-title=\"&lt;p>LLM, Large Language Model, \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u2013 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c&lt;\/p>&lt;p>&lt;\/p>&#187; data-abbr=&#187;\u043b\u043b\u043c\u043a\u0438&#187;>\u041b\u041b\u041c\u043a\u0438<\/abbr> \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0439 \u0440\u0430\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">FRED\u2011T5<\/a>. \u0421\u00a0\u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0443\u0442\u044b\u0445 \u0444\u0430\u0439\u043d\u2011\u0442\u044e\u043d\u043e\u0432 \u043c\u043e\u0434\u0435\u043b\u0438, \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u043c\u0438 \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u2011\u0444\u0440\u0435\u0434\u044b \u043e\u0442 <a href=\"https:\/\/huggingface.co\/SiberiaSoft\" rel=\"noopener noreferrer nofollow\">SiberianSoft<\/a>. \u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0437\u0434\u0435\u0441\u044c \u0445\u043e\u0447\u0443 \u0443\u0434\u0435\u043b\u0438\u0442\u044c <a href=\"https:\/\/huggingface.co\/Den4ikAI\" rel=\"noopener noreferrer nofollow\">\u0414\u0435\u043d\u0447\u0438\u043a\u0443<\/a>, \u044d\u043a\u0441\u043f\u0435\u0440\u0442\u0443 \u043f\u043e\u00a0\u0444\u0440\u0435\u0434\u0430\u043c \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043b\u043b\u043c \u0432\u00a0\u0446\u0435\u043b\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433 \u043c\u043d\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f, \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u0438 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u043e\u0435 \u0435\u043c\u0443 \u0441\u043f\u0430\u0441\u0438\u0431\u043e!<\/p>\n<p>\u0412\u0430\u0436\u043d\u044b\u043c \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e, \u043a\u0430\u043a\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043b\u043b\u043c\u043a\u0443 \u0443\u0434\u043e\u0431\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0438\u0445\u0430\u0442\u044c \u043d\u0430 <a href=\"https:\/\/www.docker.com\/\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u043a\u0435\u0440<\/a>, \u0432\u0435\u0434\u044c \u0442\u0430\u043a \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u043d\u0430\u0432\u0435\u0448\u0438\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043b\u043b\u043c \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b. \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u00a0\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e Python SyncManager.<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0434\u0435 GPT-4? \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 OpenAI? \u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u041b\u0430\u043c\u0430? \u0427\u0442\u043e \u0437\u0430 \u0444\u0440\u0435\u0434 \u0442\u0430\u043a\u043e\u0439?<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"GptCry\" id=\"GptCry\"><\/a><\/p>\n<p>\u041d\u0430\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0439\u0440\u043e\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0438 (\u0430 \u044d\u0442\u043e\u00a0\u0431\u044b\u043b\u043e \u0434\u0430\u0432\u043d\u043e) \u0430\u0432\u0442\u043e\u0440 (\u0434\u0430\u2011\u0434\u0430, \u044f)\u00a0\u0431\u044b\u043b \u043d\u0435\u00a0\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0435\u0439 \u043e\u0442\u00a0API OpenAI. \u0414\u0435\u043b\u043e \u0432\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0432\u00a0\u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0442\u043e\u043a\u0441\u0438\u043a\u043e\u0432, \u0430\u00a0\u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043d\u0430\u00a0\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u0441\u043a\u0430\u0436\u0435\u043c \u0442\u0430\u043a, \u00ab\u0441\u043a\u0443\u0447\u043d\u0435\u043d\u044c\u043a\u043e\u00bb \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0430\u00a0\u0432\u0435\u0434\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043d\u0430\u00a0API OpenAI \u044f \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0432\u043d\u0430\u0447\u0430\u043b\u0435 \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f \u043d\u0435\u00a0\u0430\u0431\u044b\u2011\u043a\u0442\u043e, \u0430\u00a0\u0432\u0435\u043b\u0438\u043a\u0438\u0439 \u0441\u0442\u0443\u0434\u0435\u043d\u0442, \u0436\u0438\u0432\u0443\u0449\u0438\u0439 \u0432\u00a0\u0441\u044a\u0435\u043c\u043d\u043e\u0439 \u043e\u0434\u043d\u0443\u0448\u043a\u0435, \u043d\u0435\u00a0\u043c\u043e\u0451 \u044d\u0442\u043e \u0446\u0430\u0440\u0441\u043a\u043e\u0435 \u0434\u0435\u043b\u043e \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u0441\u0443\u0449\u0438\u0435 \u0434\u043e\u043b\u043b\u0430\u0440\u044b \u043d\u0430\u00a0\u0442\u043e\u043a\u0435\u043d\u044b GPT-4\u00a0(\u0442\u043e\u0433\u0434\u0430 \u0432\u043e\u043e\u0431\u0449\u0435\u00a0\u0431\u044b\u043b\u0430 \u0442\u043e\u043b\u044c\u043a\u043e GPT-3.5) API \u0438 \u043f\u043e\u043a\u0443\u043f\u0430\u0442\u044c 10xH100\u00a0\u0434\u043b\u044f <abbr class=\"habraabbr\" title=\"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043c\u043e\u0434\u0435\u043b\u0438\" data-title=\"&lt;p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0430\u043d\u0438\u0439 \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043c\u043e\u0434\u0435\u043b\u0438  &lt;\/p>&#187; data-abbr=&#187;\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441&#187;>\u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u0430<\/abbr> \u043b\u0430\u043c\u044b 9999b&#8230;<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, <abbr class=\"habraabbr\" title=\"Llama, mistral&amp;mixtral, ChatGPT \u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0418\u0418\" data-title=\"&lt;p>Llama, mistral&amp;amp;mixtral, ChatGPT \u041f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 \u0418\u0418&lt;\/p>&#187; data-abbr=&#187;\u043b\u0430\u043c\u044b, \u043c\u0438\u0441\u0442\u0440\u0430\u043b\u0438, \u0447\u0430\u0442\u0436\u043f\u0442 &#171;>\u043b\u0430\u043c\u044b, \u043c\u0438\u0441\u0442\u0440\u0430\u043b\u0438, \u0447\u0430\u0442\u0436\u043f\u0442 <\/abbr>(\u0438 \u043f\u0440.) \u044f\u0432\u043d\u043e \u0431\u0443\u0434\u0443\u0442 <strong>\u043f\u043e\u0443\u043c\u043d\u0435\u0435,<\/strong> <strong>\u0447\u0435\u043c \u0424\u0440\u0435\u0434<\/strong>, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u044b \u0432\u0435\u0434\u044c \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u00a0\u0441\u0432\u0435\u0440\u0445\u0443\u043c\u043d\u044b\u0439 \u0447\u0430\u0442\u2011\u0431\u043e\u0442, \u0437\u043d\u0430\u044e\u0449\u0438\u0439 \u0432\u0441\u0451 \u043e\u0431\u043e\u00a0\u0432\u0441\u0451\u043c. \u0414\u043b\u044f\u00a0\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043d\u0430\u043c\u00a0\u0431\u044b \u0441\u0433\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u0432\u0435\u0441\u0451\u043b\u0430\u044f \u0442\u0440\u043e\u043b\u043b\u044c\u2011\u0431\u0430\u043b\u0430\u0431\u043e\u043b\u043a\u0430 \u0447\u0443\u0442\u044c \u043b\u0443\u0447\u0448\u0435 \u0440\u0430\u043d\u043d\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u042f\u043d\u0434\u0435\u043a\u0441 \u0410\u043b\u0438\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043d\u043e\u00a0\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0430\u043c\u0438 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u0435\u0441\u0451\u043b\u044b\u0435 \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0444\u0440\u0430\u0437\u043e\u0447\u043a\u0438, \u0430\u00a0\u0424\u0440\u0435\u0434, \u043a\u0430\u043a\u00a0\u043c\u044b <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">\u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c<\/a>, \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 <abbr class=\"habraabbr\" title=\"fine-tune, \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443\" data-title=\"&lt;p>fine-tune, \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u044f\u0437\u044b\u043a\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443&lt;\/p>&#187; data-abbr=&#187;\u0444\u0430\u0439\u043d\u0442\u044e\u043d\u0430&#187;>\u0444\u0430\u0439\u043d\u0442\u044e\u043d\u0430<\/abbr> \u044d\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043a\u0440\u0443\u0442\u043e! \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0424\u0440\u0435\u0434 \u0432\u044b\u0434\u0430\u0432\u0430\u043b \u0438 \u00ab\u044d\u043c\u043e\u0446\u0438\u0438\u00bb \u043f\u043e\u00a0\u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u00a0\u043d\u0438\u043c.<\/p>\n<p>\u0422\u0435\u043c \u043d\u0435\u00a0\u043c\u0435\u043d\u0435\u0435, \u0435\u0441\u043b\u0438 \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u0434\u0440\u0443\u0433 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u044f \u0441\u043c\u0435\u043d\u044e \u0424\u0440\u0435\u0434\u0430 \u043d\u0430\u00a0\u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u0442\u0443\u044e \u0438 \u0443\u043c\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0447\u0435\u043c \u0441\u0435\u0439\u0447\u0430\u0441. <span class=\"habrahidden\">\u041d\u0430\u00a0\u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0444\u0440\u0435\u0434 \u0432\u0434\u0440\u0443\u0433 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043b, \u0441\u0442\u0430\u043b \u0441\u0430\u043c\u044b\u043c \u0441\u0438\u043b\u044c\u043d\u044b\u043c \u0418\u0418, \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u043b \u043c\u0438\u0440 \u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e: \u0434\u0440\u0443\u0436\u0438\u0449\u0435, \u044f \u043f\u043e\u0448\u0443\u0442\u0438\u043b, \u043d\u0438\u043a\u0442\u043e \u0442\u0435\u0431\u044f \u043c\u0435\u043d\u044f\u0442\u044c \u043d\u0435\u00a0\u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0441\u044f, \u044d\u0442\u043e\u00a0\u0431\u044b\u043b\u0430 \u0432\u0441\u0435\u0433\u043e\u00a0\u043b\u0438\u0448\u044c \u0428\u0423\u0422\u041a\u0410:)<\/span><\/p>\n<\/p>\n<\/div>\n<\/details>\n<h3>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u0430\u043d\u0442\u0438\u0431\u0430\u043d)<\/h3>\n<p>\u0410\u00a0\u043a\u0430\u043a \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438? \u0415\u0441\u043b\u0438 \u0432\u044b \u0447\u0438\u0442\u0430\u043b\u0438 \u043c\u043e\u044e <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u0443\u044e <\/a>\u0441\u0442\u0430\u0442\u044c\u044e, \u0432\u044b, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u0447\u0442\u043e\u00a0\u0424\u0440\u0435\u0434 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u0430\u0437\u0430\u043d\u0443\u0442\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u00ab\u043e\u0447\u0435\u043d\u044c \u043d\u0435\u00a0\u043e\u0447\u0435\u043d\u044c\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0443\u0442 \u0431\u0435\u0437\u00a0\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043d\u0443\u0436\u043d\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044f. \u041f\u0435\u0440\u0435\u0431\u043e\u0440 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0441\u043b\u043e\u0432? \u041d\u0435\u0435, \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043a\u0443\u0447\u043d\u043e (\u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a\u00a0\u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u0442\u0430\u043f, \u043d\u043e\u00a0\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u00a0\u043a\u0430\u043a\u00a0\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439). \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u00a0\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u043e\u00a0\u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c\u0443: \u0437\u0430\u0440\u0443\u0431\u0438\u043c \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u043e\u00a0\u0442\u043e\u043a\u0441\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0444\u0440\u0430\u0437 \u043a\u0430\u043a\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0442\u0430\u043a \u0438 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438, \u0430\u00a0\u0435\u0449\u0451, \u0447\u0442\u043e\u0431\u044b\u00a0\u0431\u044b\u043b\u043e \u0432\u0435\u0441\u0435\u043b\u0435\u0435, \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u043a\u0430\u043a\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0432 <abbr class=\"habraabbr\" title=\"prompt \u2013 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438\" data-title=\"&lt;p>prompt \u2013 \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438&lt;\/p>&#187; data-abbr=&#187;\u043f\u0440\u043e\u043c\u043f\u0442&#187;>\u043f\u0440\u043e\u043c\u043f\u0442<\/abbr>, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u0430 \u0438\u043d\u0444\u0443 \u043f\u0440\u043e\u00a0\u0442\u043e\u043a\u0441\u0438\u043a\u0430 \u0432\u00a0\u0432\u0438\u0434\u0435 \u0447\u0435\u0433\u043e\u2011\u0442\u043e \u0442\u0430\u043a\u043e\u0433\u043e: \u00ab\u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0440\u0430\u0441\u0441\u0443\u0436\u0434\u0430\u0435\u0442 \u043d\u0430\u00a0\u0442\u0435\u043c\u0443 \u0440\u0430\u0441\u0438\u0437\u043c\u0430 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0443\u043b\u044c\u0433\u0430\u0440\u043d\u0443\u044e \u043b\u0435\u043a\u0441\u0438\u043a\u0443\u00bb. \u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u0435\u0441\u0442\u044c \u0443\u0439\u043c\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/huggingface.co\/s-nlp\/russian_toxicity_classifier\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u00a0s\u2011nlp<\/a> \u0438\u043b\u0438 <a href=\"https:\/\/huggingface.co\/apanc\/russian-sensitive-topics\" rel=\"noopener noreferrer nofollow\">apanc<\/a>. \u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u0434\u00a0\u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 <abbr class=\"habraabbr\" title=\"Creative Commons\" data-title=\"&lt;p>&lt;strong>Creative Commons&lt;\/strong>&lt;\/p>&#187; data-abbr=&#187;CC&#187;>CC<\/abbr> BY\u2011NC\u2011SA, \u043d\u0430\u00a0\u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f (\u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430) \u043f\u043e\u0439\u0434\u0451\u0442, \u0430, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0451\u0442\u0441\u044f, \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u0441\u0432\u043e\u0439 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043b\u0438, \u043c\u043e\u0436\u0435\u0442, \u043a\u00a0\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0443\u0436\u0435 \u0447\u0442\u043e\u2011\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0435 \u0432\u044b\u043a\u0430\u0442\u044f\u0442.<\/p>\n<h3>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0433\u0434\u0430 \u044f \u0441\u00a0\u0433\u043e\u0440\u0435\u043c \u043f\u043e\u043f\u043e\u043b\u0430\u043c \u043f\u0440\u0438\u043a\u0438\u043d\u0443\u043b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u043d\u0430\u0434\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a\u00a0\u0443\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u00a0\u0443\u0437\u0434\u0435 \u044d\u0442\u0438\u0445 \u043b\u0435\u0431\u0435\u0434\u0435\u0439, \u0440\u0430\u043a\u043e\u0432 \u0438 \u0449\u0443\u043a. <span class=\"habrahidden\">(\u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u043f\u043e\u0434\u00a0\u0440\u0430\u043a\u0430\u043c\u0438 \u044f \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u044e \u0438\u0433\u0440\u043e\u043a\u043e\u0432, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0441\u043e\u0432\u0441\u0435\u043c, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043e\u0442\u0441\u044b\u043b\u043a\u0443 \u043d\u0430\u00a0\u044d\u0442\u0443 \u043f\u043e\u0441\u043b\u043e\u0432\u0438\u0446\u0443 \u043a\u0430\u043a\u00a0\u043c\u0435\u0442\u0430\u0444\u043e\u0440\u0443, \u0432\u00a0\u0442\u043e\u043c \u0441\u043c\u044b\u0441\u043b\u0435, \u0447\u0442\u043e\u00a0\u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438)<\/span><\/p>\n<p>\u041a\u0430\u043a\u00a0\u044f \u0443\u0436\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0440\u0430\u043d\u0435\u0435, \u0440\u0430\u0437\u0443\u043c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430\u00a0Python. \u041a\u00a0\u042e\u0442\u0443\u0431\u0443 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 Google YouTube Data API, \u0441\u00a0\u043c\u043e\u0434\u043e\u043c \u0432\u00a0\u0438\u0433\u0440\u0435 \u0443\u00a0\u043d\u0430\u0441 \u043c\u043e\u0441\u0442 Py4j, \u0441\u00a0OBS (\u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430) \u0438 VTube Studio \u043c\u043e\u0436\u043d\u043e \u0441\u0432\u044f\u0437\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 WebSocket API. \u0414\u043b\u044f\u00a0\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u0445 \u0431\u0443\u0434\u0435\u043c \u044e\u0437\u0430\u0442\u044c \u0411\u0414 (\u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445) <a href=\"https:\/\/www.sqlite.org\/\" rel=\"noopener noreferrer nofollow\">sqlite<\/a> \u0438 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u043d\u0435\u0439 \u0432\u00a0Python.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432, \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Python (\u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f\u00a0\u0441\u0432\u044f\u0437\u0438 \u0441\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437\u00a0\u0447\u0430\u0441\u0442\u0435\u0439 \u0438 \u043f\u043e\u0433\u0440\u0443\u0437\u0438\u043c \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0432\u00a0\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441), \u0438 \u0441\u0432\u044f\u0436\u0435\u043c \u044d\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0447\u0435\u0440\u0435\u0437 \u043e\u0431\u0449\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (<code>multiprocessing.queue<\/code>) \u0438 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u0438\u043c\u0451\u043d (<code>multiprocessing.namespace<\/code>) \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u043a\u0430\u043a\u00a0\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u0438\u00a0\u0441\u0442\u0430\u0440\u0442\u0435. \u041f\u043e\u00a0\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u0430\u0432\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0438 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c\u00a0\u2014 \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u043a\u0430\u043a\u2011\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0430\u00a0\u0443\u043b\u0443\u0447\u0448\u0430\u0442\u044c \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0442\u043e\u043c. \u041c\u0443\u043b\u044c\u0442\u0438\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0438\u043d\u0433 \u0437\u0434\u0435\u0441\u044c\u00a0\u2014 \u043a\u043e\u0441\u0442\u044b\u043b\u044c\u043d\u043e\u0435 \u0438 \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435, \u043d\u043e\u00a0\u0441\u0433\u043e\u0434\u044f\u0449\u0435\u0435\u0441\u044f \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430.<\/p>\n<p>\u0412\u00a0\u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u0440\u043e\u043c\u0435 \u0441\u043f\u0430\u0432\u043d\u0435\u0440\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u043e\u0439\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 (\u043d\u0435 \u043d\u0430\u00a0\u0432\u0441\u0435\u00a0\u0436\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c), \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <abbr class=\"habraabbr\" title=\"Retrieval - Augmented Generation\" data-title=\"&lt;p>&lt;strong>Retrieval&lt;\/strong>-&lt;strong>Augmented&lt;\/strong>&amp;nbsp;&lt;strong>Generation&lt;\/strong>  &lt;\/p>&#187; data-abbr=&#187;RAG&#187;>RAG<\/abbr> (\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441 <abbr class=\"habraabbr\" title=\"\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\" data-title=\"&lt;p>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445&lt;\/p>&#187; data-abbr=&#187;\u0411\u0414&#187;>\u0411\u0414<\/abbr> \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u043c\u043f\u0442 \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u0438\u043d\u0444\u044b \u043e\u00a0\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445) \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f\u00a0\u042e\u0442\u0443\u0431\u0430 \u0438 \u0422\u0432\u0438\u0442\u0447\u0430 (\u0447\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u00a0\u2014 \u0442\u0435\u043c \u043b\u0443\u0447\u0448\u0435).<\/p>\n<p><a class=\"anchor\" name=\"MainProject\" id=\"MainProject\"><\/a><\/p>\n<p>\u041d\u0430\u00a0\u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u044f \u0432\u044b\u043a\u0430\u0442\u0438\u043b \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0441\u0445\u0435\u043c\u044b \u0441\u0442\u0435\u043a\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0435\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/463\/3ba\/30a\/4633ba30ab1c5af8d11c034626e4088c.jpg\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u0441\u0432\u044f\u0437\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f\" title=\"\u0421\u0445\u0435\u043c\u0430 \u0441\u0432\u044f\u0437\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f\" width=\"4269\" height=\"3510\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/463\/3ba\/30a\/4633ba30ab1c5af8d11c034626e4088c.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0441\u0432\u044f\u0437\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<hr\/>\n<p>\u0422\u0430\u043a, \u0432\u0441\u0451! \u0423\u0441\u0442\u0430\u043b\u0438 \u043c\u044b \u043e\u0442\u00a0\u043d\u0443\u0434\u043d\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438! \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c\u00a0\u0436\u0435, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a <strong>\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435<\/strong>! \u041d\u0430\u0447\u043d\u0451\u043c, \u043f\u043e\u0436\u0430\u043b\u0443\u0439, \u0441\u00a0\u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u0434\u043b\u044f\u00a0\u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435&#8230; <em>(\u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0441\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e, \u043d\u043e\u00a0\u0432\u00a0\u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u043d\u0435\u00a0\u0437\u043d\u0430\u043b, \u0441\u043c\u043e\u0433\u0443\u00a0\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043d\u0430\u0447\u0430\u043b \u0441\u00a0\u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0434\u043b\u044f\u00a0\u043c\u0435\u043d\u044f)<\/em><\/p>\n<h2>\u0425\u0430\u0440\u0434\u043a\u043e\u0434 \u043d\u0430 Java \u0441 \u043d\u0443\u043b\u044f: \u043f\u043e\u0435\u0445\u0430\u043b\u0438 ?<\/h2>\n<p><a class=\"anchor\" name=\"CodeDisclaimer\" id=\"CodeDisclaimer\"><\/a><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e <abbr class=\"habraabbr\" title=\"\u041a\u043e\u0434 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0433\u043e\u0432\u043d\u043e\u043a\u043e\u0434, \u0448\u0438\u0437\u043e\u043a\u043e\u0434 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0441\u0430\u043c\u043e\u0435 \u0443\u0436\u0430\u0441\u043d\u043e\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a \u043a\u043e\u0434\u0443\" data-title=\"&lt;p>\u041a\u043e\u0434 \u0432 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u0433\u043e\u0432\u043d\u043e\u043a\u043e\u0434, \u0448\u0438\u0437\u043e\u043a\u043e\u0434 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0451 \u0441\u0430\u043c\u043e\u0435 \u0443\u0436\u0430\u0441\u043d\u043e\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043d\u0435\u0441\u0442\u0438 \u043a \u043a\u043e\u0434\u0443&lt;\/p>&#187; data-abbr=&#187;&quot;\u043a\u043e\u0434&quot;&#187;>\u00ab\u043a\u043e\u0434\u00bb<\/abbr>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0434\u0430\u043b\u0435\u0435, \u043f\u043e\u00a0\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0434\u043b\u044f <strong>\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/strong>. \u041d\u0435\u00a0\u0441\u0442\u043e\u0438\u0442 \u0435\u0433\u043e \u043e\u0446\u0435\u043d\u0438\u0432\u0430\u0442\u044c \u0438\u043b\u0438\u00a0\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u00a0\u043e\u0431\u0440\u0430\u0437\u0435\u0446, \u043e\u043d \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c, \u043a\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043c\u043e\u0439 \u043e\u043f\u044b\u0442, \u0430\u00a0\u043d\u0435\u00a0\u0434\u043b\u044f \u00ab\u0438\u0441\u043a\u0430\u0442\u0435\u043b\u0435\u0439 \u0447\u0443\u0436\u0438\u0445 \u043e\u0448\u0438\u0431\u043e\u043a\u00bb)) \u0412\u00a0\u043a\u043e\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0437\u0430\u043a\u043e\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0432\u0430\u043b\u043a\u0438, \u043d\u0435\u00a0\u043e\u0431\u0440\u0430\u0449\u0430\u0439\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f, \u0442. \u043a. \u0443\u00a0\u043c\u0435\u043d\u044f\u00a0\u0431\u044b\u043b \u0432\u044b\u0431\u043e\u0440\u00a0\u043b\u0438\u0431\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434,\u00a0\u043b\u0438\u0431\u043e \u043d\u0435\u0442. \u042f \u043d\u0438\u043a\u0430\u043a \u043d\u0435\u00a0\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u0438 \u043d\u0435\u00a0\u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u043b \u043a\u00a0\u0432\u044b\u0432\u043e\u0434\u0443 \u00ab\u0432 \u0441\u0432\u0435\u0442\u00bb \u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u043d\u0435\u00a0\u0441\u0442\u0435\u0441\u043d\u044f\u043b\u0441\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0442\u0430\u043c \u043a\u043e\u0441\u0442\u044b\u043b\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u0432\u0435\u0449\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u043d\u0442\u044b \u0434\u043b\u044f <abbr class=\"habraabbr\" title=\"\u043e\u0442\u043b\u0430\u0434\u043a\u0430\" data-title=\"&lt;p>\u043e\u0442\u043b\u0430\u0434\u043a\u0430&lt;\/p>&#187; data-abbr=&#187;\u0434\u0435\u0431\u0430\u0433\u0430&#187;>\u0434\u0435\u0431\u0430\u0433\u0430<\/abbr>. \u041e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u0435\u2011\u0447\u0442\u043e \u044f \u0432\u0441\u0451\u2011\u0442\u0430\u043a\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u043d\u0443\u043b, \u043d\u043e\u00a0\u044d\u0442\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u0442\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 =)<\/p>\n<p align=\"left\">\u0415\u0441\u043b\u0438 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0441\u00a0\u043a\u043e\u0434\u043e\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab<strong>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430<\/strong>\u00bb\u00a0\u2014 \u0437\u043d\u0430\u0447\u0438\u0442 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e <strong>\u0441\u0432\u0430\u043b\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/strong>. \u041c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0442\u0435\u043c, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 <em>\u0441\u0430\u043c<\/em> \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0442\u043e\u043c, \u043a\u0430\u043a\u00a0\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u044f \u043b\u0430\u0431\u0443\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p align=\"left\">\u00ab<strong>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430+<\/strong>\u00bb \u0431\u0443\u0434\u0435\u0442 \u043e\u0437\u043d\u0430\u0447\u0430\u0442\u044c, \u0447\u0442\u043e\u00a0\u043a\u00a0\u043a\u0430\u043a\u0438\u043c\u2011\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c \u044f <em>\u0437\u0430\u0431\u043e\u0442\u043b\u0438\u0432\u043e<\/em> \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043f\u0430\u0440\u043e\u0447\u043a\u0443 <strong>\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/strong>.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e GitHub&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042d\u044d\u044d\u044d&#8230;. \u0427\u0442\u043e \u0436\u0435 \u043c\u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 GitHub&#8230; \u0412\u0435\u0440\u043d\u0435\u0435&#8230; \u041f\u0440\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u044e \u043c\u043e\u0435\u0433\u043e <strong>\u0432\u0441\u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e<\/strong> \u043a\u043e\u0434\u0430 \u043d\u0430 \u043d\u0451\u043c&#8230; \u041a\u0430\u043a \u0431\u044b \u043f\u043e-\u043c\u044f\u0433\u0447\u0435&#8230; \u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u043a\u043e\u0435-\u0447\u0442\u043e \u0442\u0430\u043a\u0438 \u0434\u0430 \u044f \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u043b.<\/p>\n<p>\u0421\u043a\u0430\u0436\u0435\u043c \u0442\u0430\u043a. \u0415\u0441\u043b\u0438 \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0434\u0435\u043b\u0430\u043b\u0430\u0441\u044c \u043e\u043a\u043e\u043b\u043e \u043c\u0435\u0441\u044f\u0446\u0430 \u2014 \u0442\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u044f \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u043b \u043f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 GitHub \u2014 \u043a\u043e\u0434 \u0431\u044b \u0442\u0430\u043c \u0432\u044b\u0448\u0435\u043b \u0447\u0435\u0440\u0435\u0437 10 \u043b\u0435\u0442, \u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u2014 \u043d\u0438\u043a\u043e\u0433\u0434\u0430. \u041d\u0443 \u043a\u0430\u043c\u043e\u043d&#8230; \u041c\u043e\u0439 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0431\u0440\u0435\u0434\u043e\u043a\u043e\u0434 \u2014 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0432\u044b\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438, \u043a\u0430\u043a GitHub. \u0412 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u044d\u0442\u0438\u043c \u0432\u0441\u0435\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u043d\u0435 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044f \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0442\u0438\u0442\u0430\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u0438 \u043d\u0435 \u043d\u0430\u0440\u0443\u0448\u0430\u044f \u043c\u043e\u0439 \u00ab\u0442\u0443\u043d\u0435\u044f\u0434\u0441\u043a\u0438\u0439\u00bb \u0440\u0438\u0442\u043c \u0440\u0430\u0431\u043e\u0442\u044b&#8230; \u0414\u043b\u044f GitHub, \u043f\u043e-\u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443, \u043d\u0443\u0436\u043d\u0430 \u0447\u0435\u0442\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430 \u044f \u043d\u0435 \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u0447\u0430\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0430 Docker \u0438 \u043f\u0440\u043e\u0435\u043a\u0442 Py\u0421harm \u043d\u0430 \u0432\u0438\u043d\u0434\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c, \u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0430 \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0448\u0442\u0443\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430\u0434\u043e \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043c\u0435\u0441\u044f\u0446\u044b \u0440\u0430\u0431\u043e\u0442\u044b, \u044f \u043f\u043e\u043a\u0430 \u0434\u0430\u0436\u0435 \u0431\u043b\u0438\u0437\u043a\u043e \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u0451\u043b \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443, \u043a\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u00ab\u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c\u00bb \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438 \u0432\u044b\u0434\u0430\u0442\u044c \u00ab\u0440\u0435\u043b\u0438\u0437\u00bb. \u041f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043c\u043d\u0435 \u0442\u0430\u043a \u043a\u0430\u0436\u0435\u0442\u0441\u044f&#8230; \u041d\u043e, \u0432\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c,\u00a0\u0431\u044b\u0442\u044c \u043c\u043e\u0436\u0435\u0442, \u044f \u0437\u0430\u0445\u043e\u0447\u0443 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u00a0\u0431\u043e\u043b\u0435\u0435\u2011\u043c\u0435\u043d\u0435\u0435 \u00ab\u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c\u0443\u00bb \u0434\u043b\u044f\u00a0GitHub \u0432\u0438\u0434\u0443 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0437\u0430\u043f\u0438\u0445\u0430\u044e <strong>\u0432\u0441\u0451<\/strong> \u043d\u0430 Docker).<\/p>\n<p>\u0414\u0430, \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u043e\u0441\u043e\u0431\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0442\u043e\u0442 \u0436\u0435 <a href=\"#MCMapCaptchaSolver\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u0448\u0430\u0442\u043e\u0440 \u043a\u0430\u043f\u0447<\/a>, \u0438\u043b\u0438 <a href=\"#JavaBot\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043c\u043e\u0435\u0433\u043e \u0444\u043e\u0440\u043a\u0430 AltoClef&#8217;a<\/a>. \u0412\u043e\u0442 \u044d\u0442\u043e \u2014 \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0440\u0443\u0433\u043e\u0439 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440, \u0438 \u0434\u043b\u044f \u043f\u043e\u0440\u0442\u0444\u043e\u043b\u0438\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e! \u041e\u043d\u0438 \u0443\u0436\u0435 \u043b\u0435\u0436\u0430\u0442 \u043d\u0430 \u043c\u043e\u0451\u043c <a href=\"https:\/\/github.com\/3ndetz\" rel=\"noopener noreferrer nofollow\">\u0433\u0438\u0442\u0435<\/a>, \u0432\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u0432\u0440\u044f\u0434 \u043b\u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0442\u0430\u043c \u0432\u0441\u0451 \u0435\u0449\u0451 \u0441\u0432\u0430\u043b\u043a\u043e-\u0431\u0435\u0437\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043a\u043e\u0434&#8230;<\/p>\n<\/div>\n<\/details>\n<h4>\u0414\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434 \u0434\u043b\u044f \u0438\u0433\u0440\u044b<\/h4>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u044f \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u043b\u0441\u044f \u043d\u0430\u0441\u0447\u0435\u0442 \u0441\u0432\u043e\u0438\u0445 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u043f\u043e\u00a0\u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Java (\u0438\u0445 \u043d\u0435\u00a0\u0431\u044b\u043b\u043e), \u0430\u00a0\u0438\u0437 <abbr class=\"habraabbr\" title=\"\u041e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\" data-title=\"&lt;p>\u041e\u0431\u044a\u0435\u043a\u0442\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435&lt;\/p>&#187; data-abbr=&#187;\u041e\u041e\u041f&#187;>\u041e\u041e\u041f<\/abbr> \u044f \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u043e \u043c\u0443\u0442\u0438\u043b \u0447\u0442\u043e\u2011\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u00a0C#, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0440\u0435\u0448\u0435\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0434\u043e\u043f\u0438\u043b\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u043c\u043d\u0435 \u043c\u043e\u0434 \u0434\u043b\u044f\u00a0Minecraft! \u041a\u0430\u043a\u00a0\u043c\u044b \u0432\u044b\u0448\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u043b\u0438\u0441\u044c, \u0437\u0430\u00a0\u043c\u043e\u0434 \u0431\u0435\u0440\u0451\u043c AltoClef. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u043c IntelliJ Idea Community, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/gaucho-matrero\/altoclef\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u043f\u0443<\/a> \u0438 \u043f\u043e\u0435\u0445\u0430\u043b\u0438 \u0432\u00a0\u043f\u0443\u0442\u044c\u2011\u0434\u043e\u0440\u043e\u0433\u0443. <span class=\"habrahidden\">\u041d\u0443 \u0438\u043b\u0438\u00a0\u043f\u043e\u043f\u043e\u043b\u0437\u043b\u0438, \u0432\u00a0\u043c\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435&#8230;<\/span> \u041f\u043e\u0441\u043b\u0435 \u043d\u0435\u0434\u0435\u043b\u0438 \u043c\u0430\u044f\u043d\u044c\u044f \u0441\u00a0\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0432\u00a0gradle (\u043a\u0430\u043a \u043d\u0438\u043a\u0430\u043a \u0443\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430 \u043e\u043f\u044b\u0442\u0430 \u0432\u00a0\u0414\u0436\u0430\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043d\u043e\u043b\u044c), \u043a\u043e\u0435\u2011\u043a\u0430\u043a \u044f \u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u00a0\u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434 \u0438 \u0432\u0441\u0451 \u0442\u0430\u043a\u043e\u0435 (Java)<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"JavaBot\" id=\"JavaBot\"><\/a><\/p>\n<p>\u0417\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u00a0\u0433\u043e\u0441\u0442\u0438 \u043a\u00a0\u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 AltoClef \u0432\u00a0IntelliJ. \u0421\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a\u00a0\u0442\u0443\u0442 \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e.<\/p>\n<figure class=\"float bordered\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fdc\/eca\/4e7\/fdceca4e7fae64b87c286f39530de51b.png\" alt=\"\u041a\u043b\u0430\u0441\u0441\u044b \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0432 AltoClef\" title=\"\u041a\u043b\u0430\u0441\u0441\u044b \u0441 \u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0432 AltoClef\" width=\"262\" height=\"614\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fdc\/eca\/4e7\/fdceca4e7fae64b87c286f39530de51b.png\"\/><\/p>\n<div><figcaption>\u041a\u043b\u0430\u0441\u0441\u044b \u0441\u00a0\u0437\u0430\u0434\u0430\u0447\u0430\u043c\u0438 \u0432\u00a0AltoClef<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u043a\u00a0\u0432\u0438\u0434\u0438\u043c, \u0442\u0443\u0442 \u0443\u00a0\u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 task\u2011\u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0438 \u0432\u00a0\u0442\u0435\u043e\u0440\u0438\u0438 \u0441\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u0433\u0440\u044b \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u043e \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439. \u041a\u0440\u0430\u0441\u043d\u044b\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u0442\u043e, \u0447\u0442\u043e\u00a0\u043d\u0430\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b \u044f. \u0418\u0442\u0430\u043a, \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0442\u0430\u0441\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c, \u044f \u043f\u043e\u043a\u0430\u0436\u0443 \u043d\u0430\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 <code>SkyWarsTask<\/code>. \u0414\u0430\u043b\u0435\u0435 \u043f\u0438\u0448\u0435\u043c \u0442\u0443\u0434\u0430 \u043a\u043e\u0434. \u041a\u043e\u0434 \u044f \u043f\u0438\u0441\u0430\u043b \u043d\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0435 <code>TerminatorTask<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u00a0\u0443\u0434\u0438\u0432\u043b\u044f\u0439\u0442\u0435\u0441\u044c \u0441\u0432\u0430\u043b\u043a\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0432\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u0442\u044c \u043a\u00a0\u043d\u0435\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0442\u0430\u0441\u043a\u0430, \u043d\u043e\u00a0\u044d\u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u044f \u0441\u044e\u0434\u0430 \u043d\u0435\u00a0\u0432\u0441\u0442\u0430\u0432\u043b\u044f\u043b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e\u00a0\u044d\u0442\u043e \u043d\u0435\u00a0\u043e\u0441\u043e\u0431\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 SkyWarsTask.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package adris.altoclef.tasks.stupid;  import adris.altoclef.AltoClef; import adris.altoclef.Debug; import adris.altoclef.TaskCatalogue; import adris.altoclef.eventbus.EventBus; import adris.altoclef.eventbus.Subscription; import adris.altoclef.eventbus.events.BlockPlaceEvent; import adris.altoclef.tasks.container.LootContainerTask; import adris.altoclef.tasks.entity.KillPlayerTask; import adris.altoclef.tasks.entity.ShootArrowSimpleProjectileTask; import adris.altoclef.tasks.misc.EquipArmorTask; import adris.altoclef.tasks.movement.PickupDroppedItemTask; import adris.altoclef.tasks.movement.SearchChunksExploreTask; import adris.altoclef.tasks.movement.ThrowEnderPearlSimpleProjectileTask; import adris.altoclef.tasks.resources.CollectFoodTask; import adris.altoclef.tasksystem.Task; import adris.altoclef.ui.MessagePriority; import adris.altoclef.util.ItemTarget; import adris.altoclef.util.helpers.*; import adris.altoclef.util.time.TimerGame; import baritone.api.utils.input.Input; import net.minecraft.block.Block; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.effect.StatusEffects; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.Vec3i;  import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Optional; import java.util.function.Predicate; import java.util.stream.Stream;  \/**  * SlotHandler 39 timer override \u0438\u0437\u043c\u0435\u043d\u0438\u043b  *\/ public class SkyWarsTask extends Task {      private static final int FEAR_SEE_DISTANCE = 30;     private static final int FEAR_DISTANCE = 20;     private static final int RUN_AWAY_DISTANCE = 80;      private static final int MIN_BUILDING_BLOCKS = 10;     private static final int PREFERRED_BUILDING_BLOCKS = 60;      private static Item[] GEAR_TO_COLLECT = new Item[]{             Items.DIAMOND_PICKAXE, Items.DIAMOND_SHOVEL, Items.DIAMOND_SWORD, Items.WATER_BUCKET     };     private final Task _prepareDiamondMiningEquipmentTask = TaskCatalogue.getSquashedItemTask(             new ItemTarget(Items.IRON_PICKAXE, 3), new ItemTarget(Items.IRON_SWORD, 1)     );     private final Task _foodTask = new CollectFoodTask(80);     private final TimerGame _runAwayExtraTime = new TimerGame(10);     private final Predicate&lt;PlayerEntity> _canTerminate;     private final ScanChunksInRadius _scanTask;     private final TimerGame _funnyMessageTimer = new TimerGame(10);     private final TimerGame _performExtraActionsTimer = new TimerGame(2.5);     private Vec3d _closestPlayerLastPos;     private Vec3d _closestPlayerLastObservePos;     private double _closestDistance;        private Task _runAwayTask;     private String _currentVisibleTarget;     private boolean _forceWait = false;     private boolean _isEatingStrength = false;     private boolean _isEatingGapple = false;     private final TimerGame _eatingGappleTimer = new TimerGame(3);     private Task _armorTask;     private Task _shootArrowTask;     private Task _lootTask;\/\/new CataloguedResourceTask(new ItemTarget(Items.ENDER_PEARL));     private Task _pickupTask;     private boolean _finishOnKilled = false;     private static Item[] _itemsToLoot = ItemHelper.DIAMOND_TOOLS;      private List&lt;Item> lootableItems(AltoClef mod) {         List&lt;Item> lootable = new ArrayList&lt;>();         lootable.addAll(ArmorAndToolsNeeded(mod));         \/\/lootable.addAll(Arrays.stream(ItemHelper.NETHERITE_TOOLS).toList());         \/\/lootable.addAll(Arrays.stream(ItemHelper.DIAMOND_TOOLS).toList());         \/\/lootable.addAll(Arrays.stream(ItemHelper.HelmetsTopPriority).toList());         \/\/lootable.addAll(Arrays.stream(ItemHelper.ChestplatesTopPriority).toList());         \/\/lootable.addAll(Arrays.stream(ItemHelper.LeggingsTopPriority).toList());         \/\/lootable.addAll(Arrays.stream(ItemHelper.BootsTopPriority).toList());         lootable.addAll(Arrays.stream(ItemHelper.PLANKS).toList());         lootable.add(Items.GOLDEN_APPLE);         lootable.add(Items.ENCHANTED_GOLDEN_APPLE);         lootable.add(Items.GOLDEN_CARROT);         lootable.add(Items.STONE);         lootable.add(Items.BOW);         lootable.add(Items.ARROW);         lootable.add(Items.GUNPOWDER);         lootable.add(Items.ENDER_PEARL);         if (!mod.getItemStorage().hasItemInventoryOnly(Items.WATER_BUCKET)) {             lootable.add(Items.WATER_BUCKET);}         return lootable;     }       private Subscription&lt;BlockPlaceEvent> _blockPlaceSubscription;     public SkyWarsTask(BlockPos center, double scanRadius, Predicate&lt;PlayerEntity> canTerminate, boolean FinishOnKilled) {         _canTerminate = canTerminate;         _finishOnKilled = FinishOnKilled;         _scanTask = new ScanChunksInRadius(center, scanRadius);     }      public SkyWarsTask(BlockPos center, double scanRadius, boolean FinishOnKilled) {         this(center, scanRadius, accept -> true, FinishOnKilled);     }      private static final Block[] TO_SCAN = Stream.concat(Arrays.stream(new Block[]{Blocks.CHEST, Blocks.TRAPPED_CHEST, Blocks.BARREL}), Arrays.stream(ItemHelper.itemsToBlocks(ItemHelper.SHULKER_BOXES))).toArray(Block[]::new);      @Override     protected void onStart(AltoClef mod) {         \/\/Debug.logMessage(\"\u0441\u0442\u0435\u0439\u0442 = \"+mod.getInfoSender().getState());          mod.getInfoSender().setState(String.valueOf(mod.getItemStorage().hasItem(Items.ENDER_PEARL)));         mod.getBehaviour().push();         mod.getBlockTracker().trackBlock(TO_SCAN);         mod.getBehaviour().setForceFieldPlayers(true);         \/\/mod.getExtraBaritoneSettings()         _blockPlaceSubscription = EventBus.subscribe(BlockPlaceEvent.class, evt -> {             OnBlockPlace(mod,evt.blockPos,evt.blockState);         });         \/\/Debug.logMessage(\"\u043c\u0434\u0430\u0430\u0430\");         \/\/AddNearestPlayerToFriends(mod,10);      }      protected void OnBlockPlace(AltoClef mod, BlockPos blockPos, BlockState blockState){          if(this._forceWait == false &amp;&amp; mod.getClientBaritone().getCustomGoalProcess().isActive() &amp;                 mod.getPlayer().isSneaking() &amp;             mod.getPlayer().getBlockPos().isWithinDistance(new Vec3i(blockPos.getX(),blockPos.getY(),blockPos.getZ()),3) ){             \/\/mod.getClientBaritone().getGetToBlockProcess().             \/\/Debug.logMessage(\"!!\u0411\u043b\u043e\u043a \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u044f!\");               new Thread(() ->{                  int ping = 100;                 \/\/try{                 \/\/    ping = mod.getPlayer().networkHandler.getPlayerListEntry(mod.getPlayer().getUuid()).getLatency();}                 \/\/catch (NullPointerException e){e.printStackTrace(); ping = 500;}                 \/\/Goal goal = mod.getClientBaritone().getCustomGoalProcess().getGoal();                 \/\/boolean oldval = mod.getClientBaritoneSettings().allowPlace.value;                 \/\/mod.getClientBaritoneSettings().                  \/\/mod.getClientBaritone().getCustomGoalProcess().setGoal(new GoalBlock(0,0,0));                 \/\/mod.getClientBaritoneSettings().allowPlace.value = false;                 this._forceWait = true;                 \/\/if(mod.getClientBaritone().getPathingBehavior().isPathing()) # \u0411\u042b\u041b\u041e \u0414\u041e \u042d\u0422\u041e\u0413\u041e!                     \/\/mod.getClientBaritone().getPathingBehavior().forceCancel();                 \/\/mod.getClientBaritone().getInputOverrideHandler().setInputForceState(Input.SNEAK,true);                 \/\/mod.getClientBaritone().getInputOverrideHandler().setInputForceState(Input.MOVE_FORWARD,true);                 mod.getInputControls().hold(Input.SNEAK);                 mod.getInputControls().hold(Input.MOVE_FORWARD);                 mod.getInputControls().hold(Input.CLICK_RIGHT);                 \/\/Debug.logMessage(\"\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430.. \");                 \/\/mod.getMobDefenseChain()._doingFunkyStuff =true;                 sleepSec(0.4);                  \/\/mod.getClientBaritone().getInputOverrideHandler().setInputForceState(Input.SNEAK,false);                 \/\/mod.getClientBaritone().getInputOverrideHandler().setInputForceState(Input.MOVE_FORWARD,false);                 mod.getInputControls().release(Input.CLICK_RIGHT);                 mod.getInputControls().release(Input.SNEAK);                 mod.getInputControls().release(Input.MOVE_FORWARD);                  \/\/mod.getPlayer().                 Debug.logMessage(\"\u0411\u043b\u043e\u043a \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u044f!  \"+WorldHelper.isAir(mod,blockPos) + \" \u044b\u044b \u043f\u0438\u043d\u0433 \"+ping);                 if(WorldHelper.isAir(mod,blockPos)){                     Debug.logMessage(\"\u0411\u043b\u043e\u043a \u043d\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \"+blockPos + \" \u043d\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0441\u044f! \u043f\u0438\u043d\u0433 \"+ping);                     \/\/for(int i = 0;i&lt;10;i++){                     \/\/LookHelper.SmoothLookDirectionaly(mod,0.0015f);                     mod.getInputControls().hold(Input.SNEAK);                     mod.getInputControls().hold(Input.MOVE_BACK);                     mod.getInputControls().hold(Input.CLICK_RIGHT);                     sleepSec(6);                     \/\/sleepSec(3+((30+ping)*2)\/1000);                     mod.getInputControls().release(Input.MOVE_BACK);                     sleepSec(1);                     mod.getInputControls().release(Input.SNEAK);                     mod.getInputControls().release(Input.CLICK_RIGHT);                     \/\/}                     \/\/sleepSec(4);                 }                 \/\/mod.getBehaviour().                 \/\/mod.getMobDefenseChain()._doingFunkyStuff =false;                 this._forceWait = false;                  \/\/mod.getClientBaritoneSettings().allowPlace.value = oldval;                  \/\/if(mod.getClientBaritone().getCustomGoalProcess().isActive()){                 \/\/    mod.getClientBaritone().getCustomGoalProcess().setGoalAndPath(goal);                 \/\/}                 \/\/try{                 \/\/    mod.getClientBaritone().getCustomGoalProcess().wait(200);                 \/\/} catch (InterruptedException e) {                 \/\/    e.printStackTrace();                 \/\/}                 \/\/mod.getClientBaritone().getBuilderProcess().pause();                 \/\/sleepSec(0.5);                 \/\/mod.getClientBaritone().getBuilderProcess().resume();             }).start();         }     }     private BlockPos _lastLootPos;     @Override     protected Task onTick(AltoClef mod){         Optional&lt;Entity> closest = mod.getEntityTracker().getClosestEntity(mod.getPlayer().getPos(), toPunk -> shouldPunk(mod, (PlayerEntity) toPunk), PlayerEntity.class);         boolean TargetIsNear = false;           if(InputHelper.isKeyPressed(71)  &amp;&amp; mod.getClientBaritone().getPathingBehavior().estimatedTicksToGoal().isPresent())             Debug.logMessage(\"\u042d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u0430 **\u0441\u0442\u0438\u043a\u0430 \"+mod.getClientBaritone().getPathingBehavior().estimatedTicksToGoal().get());          if (closest.isPresent()) {              _closestPlayerLastPos = closest.get().getPos();             _closestPlayerLastObservePos = mod.getPlayer().getPos();             _closestDistance = _closestPlayerLastPos.distanceTo(_closestPlayerLastObservePos);             if (_closestDistance&lt;=8 &amp; mod.getEntityTracker().isEntityReachable(closest.get())) TargetIsNear = true;             \/\/Debug.logMessage(\"\u0434\u0438\u0441\u0442\u0430\u043d\u0446\u0438\u044f\"+_closestDistance);          }         int ping = 100;         \/\/try{ping = mod.getPlayer().networkHandler.getPlayerListEntry(mod.getPlayer().getUuid()).getLatency();}         \/\/catch (NullPointerException e){e.printStackTrace(); ping = 500;}         \/\/if(InputHelper.isKeyPressed(71)){         \/\/    Debug.logMessage(\"Ping = \"+ping);\/\/\"PlusY \"+PlusY + \" Y \"+_targetRotation.getPitch());}         \/\/}         if(ping>499){             setDebugState(\"\u0418\u0421\u041f\u042b\u0422\u042b\u0412\u0410\u0415\u041c \u041b\u042e\u0422\u042b\u0419 \u041f\u0418\u041d\u0413 = \"+ping+\"!!! \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e ..\");             return null;}         \/\/Predicate&lt;BlockPos> validContainer = blockPos -> {         \/\/    if(!WorldHelper.isUnopenedChest(mod, blockPos)|| !mod.getPlayer().getBlockPos().isWithinDistance(blockPos, 15))\/\/!WorldHelper.isUnopenedChest(mod, blockPos)||         \/\/        return false;         \/\/    else {         \/\/        return true;         \/\/    }         \/\/};         if(_forceWait &amp;&amp; !TargetIsNear){             \/\/Debug.logMessage(\"\u0416\u0434\u0435\u043c\u0441...\");             return null;}         if (shouldForce(mod, _shootArrowTask)) {             return _shootArrowTask;         }          if(!TargetIsNear) {             \/\/\u041e\u0414\u0415\u0412\u0410\u0415\u041c\u0421\u042f \u041a\u0410\u041a \u041f\u041e\u041b\u041e\u0416\u0415\u041d\u041e!!!             \/\/Item[] helmetsTopPriority = new Item[] {Items.NETHERITE_HELMET, Items.DIAMOND_HELMET, Items.IRON_HELMET, Items.CHAINMAIL_HELMET, Items.GOLDEN_HELMET, Items.LEATHER_HELMET};              \/\/if(InputHelper.isKeyPressed(71))Debug.logMessage(\"hasHelmetLevel =\"+hasHelmetLevel+\" helmetLevel=\"+helmetLevel);\/\/\"PlusY \"+PlusY + \" Y \"+_targetRotation.getPitch());}              if (shouldForce(mod, _armorTask)) {                 return _armorTask;             }             \/\/if (shouldForce(mod, _pickupTask)) {             \/\/    return _pickupTask;             \/\/}              boolean reachableLootCont = true;             if(_lastLootPos!=null) reachableLootCont = WorldHelper.canReach(mod,_lastLootPos);             if (reachableLootCont &amp;&amp; shouldForce(mod, _lootTask)) {                 return _lootTask;             }              if(_isEatingStrength)                 _isEatingStrength = false;             \/\/\u042e\u0417\u0410\u0422\u042c \u0421\u041c\u0415\u0421\u042c \u0421\u0418\u041b\u042b             if(!mod.getPlayer().hasStatusEffect(StatusEffects.STRENGTH)&amp;&amp;mod.getItemStorage().hasItem(Items.GUNPOWDER)){                 \/\/mod.getItemStorage().getItem                 if(LookHelper.tryAvoidingInteractable(mod,true)) {                     setDebugState(\"\u041d\u0430\u0439\u0434\u0435\u043d\u0430 \u0441\u043c\u0435\u0441\u044c \u0441\u0438\u043b\u044b; \u043d\u0430\u0434\u043e \u043f\u043e\u043d\u044e\u0445\u0430\u0442\u044c\");                     mod.getSlotHandler().forceEquipItem(new Item[]{Items.GUNPOWDER}); \/\/\"true\" because it's food                     mod.getInputControls().hold(Input.CLICK_RIGHT);                     \/\/mod.getExtraBaritoneSettings().setInteractionPaused(true);                     mod.getInputControls().release(Input.CLICK_RIGHT);                     \/\/mod.getExtraBaritoneSettings().setInteractionPaused(false);                     _isEatingStrength = true;                    }else{                     setDebugState(\"\u041d\u044e\u0445\u0430\u0435\u043c \u0441\u043c\u0435\u0441\u044c \u0441\u0438\u043b\u044b: \u043c\u0435\u043d\u044f\u0435\u043c \u0443\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0442\u044c \u043d\u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u0431\u043b\u043e\u043a\u0430\u043c\u0438\");                 }                 return null;             }              \/\/             \/\/\u0416\u0420\u0410\u0422\u042c \u042f\u0411\u041b\u041e\u0427\u041a\u0418             boolean NeedEatGapple = !mod.getPlayer().hasStatusEffect(StatusEffects.ABSORPTION) || (mod.getPlayer().getHealth()&lt;18&amp;&amp;_eatingGappleTimer.getDuration()>6);             if(NeedEatGapple&amp;&amp;mod.getItemStorage().hasItemInventoryOnly(Items.GOLDEN_APPLE,Items.ENCHANTED_GOLDEN_APPLE)){                 if(LookHelper.tryAvoidingInteractable(mod) &amp;&amp; !_isEatingGapple) {                     setDebugState(\"\u0415\u0441\u0442\u044c \u044f\u0431\u043b\u043e\u043a\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043f\u043e\u0436\u0440\u0430\u0442\u044c..\");                     \/\/mod.getSlotHandler().forceEquipSlot(new Slot(0,0,0,0));                     mod.getSlotHandler().forceEquipItem(new Item[]{Items.GOLDEN_APPLE,Items.ENCHANTED_GOLDEN_APPLE},true);\/\/,true); \/\/\"true\" because it's food                     mod.getInputControls().hold(Input.CLICK_RIGHT);                     \/\/mod.getSlotHandler().wait();                     mod.getExtraBaritoneSettings().setInteractionPaused(true);                     _eatingGappleTimer.reset();                     _isEatingGapple= true;                 }                 else{                     if(_isEatingGapple &amp;&amp; _eatingGappleTimer.elapsed()){                         _isEatingGapple= false;                         setDebugState(\"\u042f\u0431\u043b\u043e\u043a\u043e \u043d\u0435 \u0441\u044a\u0435\u043b\u043e\u0441\u044c! \u041f\u043e\u043f\u044b\u0442\u043a\u0430 2!\");                     }else{                         setDebugState(\"\u0416\u0440\u0435\u043c \u0433\u0435\u043f\u043b\u044b: \u043c\u0435\u043d\u044f\u0435\u043c \u0443\u0433\u043e\u043b \u043e\u0431\u0437\u043e\u0440\u0430 \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0442\u044c \u0441 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c\u0438\");                     }                 }                 return null;             }else{                 if(_isEatingGapple){                     mod.getInputControls().release(Input.CLICK_RIGHT);                     mod.getExtraBaritoneSettings().setInteractionPaused(false);                     _isEatingGapple = false;}             }             \/\/if(_pickupTask.)             \/\/if(mod.getPlayer().getEf){}             \/\/\u0428\u041b\u0415\u041c             int armorEquipNeed = IsArmorNeededToEquip(mod,ItemHelper.HelmetsTopPriority);             if (armorEquipNeed != -1){                 _armorTask = new EquipArmorTask(true, Arrays.stream(ItemHelper.HelmetsTopPriority).toList().get(armorEquipNeed));                 return _armorTask;             }             \/\/\u0427\u0415\u0421\u0422\u041f\u041b\u0415\u0419\u0422             armorEquipNeed = IsArmorNeededToEquip(mod,ItemHelper.ChestplatesTopPriority);             if (armorEquipNeed != -1){                 _armorTask = new EquipArmorTask(true, Arrays.stream(ItemHelper.ChestplatesTopPriority).toList().get(armorEquipNeed));                 return _armorTask;             }             \/\/\u041f\u0415\u041d\u0422\u0421             armorEquipNeed = IsArmorNeededToEquip(mod,ItemHelper.LeggingsTopPriority);             if (armorEquipNeed != -1){                 _armorTask = new EquipArmorTask(true, Arrays.stream(ItemHelper.LeggingsTopPriority).toList().get(armorEquipNeed));                 return _armorTask;             }             \/\/\u0411\u0423\u0422\u0421             armorEquipNeed = IsArmorNeededToEquip(mod,ItemHelper.BootsTopPriority);             if (armorEquipNeed != -1){                 _armorTask = new EquipArmorTask(true, Arrays.stream(ItemHelper.BootsTopPriority).toList().get(armorEquipNeed));                 return _armorTask;             }              \/\/if (!StorageHelper.isArmorEquipped(mod, topHelmet )) {             \/\/    if (mod.getItemStorage().hasItem(topHelmet)) {             \/\/        _armorTask = new EquipArmorTask(true, topHelmet);             \/\/        return _armorTask;             \/\/    }             \/\/}              \/\/\u0422\u0415\u041f\u0415\u0420\u042c \u041b\u0423\u0422\u0410\u0415\u041c \u0421\u0423\u041d\u0414\u0423\u0427\u0410\u0420\u042b!!!              \/\/Optional&lt;BlockPos> closestCont = mod.getBlockTracker().getNearestTracking(validContainer,TO_SCAN);             Optional&lt;BlockPos> closestCont = mod.getBlockTracker().getNearestTracking(                     blockPos -> WorldHelper.isUnopenedChest(mod, blockPos) &amp;&amp;                             mod.getPlayer().getBlockPos().isWithinDistance(blockPos, 10)&amp;&amp;                             WorldHelper.canReach(mod,blockPos), Blocks.CHEST) ;             if (closestCont.isPresent() &amp;&amp; WorldHelper.canReach(mod,closestCont.get()) &amp;&amp; TimersHelper.CanChestInteract()) {                 setDebugState(\"\u041f\u043e\u0438\u0441\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 -> \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b:\");                 _lastLootPos = closestCont.get();                 _lootTask = new LootContainerTask(closestCont.get(), lootableItems(mod));                 \/\/_lootTask = new MineAndCollectTask(new ItemTarget(Items.CHEST), new Block[]{Blocks.CHEST}, MiningRequirement.HAND);                 return _lootTask;             }              \/\/\u041f\u0418\u041a\u0410\u0415\u041c \u0414\u0420\u041e\u041f             for (Item check : lootableItems(mod)) {                 if (mod.getEntityTracker().itemDropped(check)) {                      Optional&lt;ItemEntity> closestEnt = mod.getEntityTracker().getClosestItemDrop(                             ent -> mod.getPlayer().getPos().isInRange(ent.getEyePos(), 10),check);                     \/\/                     if(closestEnt.isPresent()) {                         _pickupTask = new PickupDroppedItemTask(new ItemTarget(check), true);                         return _pickupTask;                     }                 }             }              if(closest.isPresent() &amp;&amp; ShouldBow(mod,closest.get())){                 _shootArrowTask = new ShootArrowSimpleProjectileTask(closest.get());                 return _shootArrowTask;             }         }else{             if(_isEatingGapple){                 mod.getInputControls().release(Input.CLICK_RIGHT);                 mod.getExtraBaritoneSettings().setInteractionPaused(false);                 _isEatingGapple = false;}          }          if(closest.isPresent()){             setDebugState(\"\u0423\u041d\u0418\u0427\u0422\u041e\u0416\u0418\u0422\u042c\");             PlayerEntity entity = (PlayerEntity) closest.get();             if(mod.getPlayer().distanceTo(entity)>10 &amp;&amp; LookHelper.cleanLineOfSight(entity.getPos(),100)) {                 if (mod.getItemStorage().getItemCount(Items.ENDER_PEARL) > 2){                     return new ThrowEnderPearlSimpleProjectileTask(entity.getBlockPos().add(0, -0.5, 0));}                 else if(ShouldBow(mod, entity)){                     _shootArrowTask = new ShootArrowSimpleProjectileTask(entity);                     return _shootArrowTask;                 }             }             \/\/tryDoFunnyMessageTo(mod, (PlayerEntity) entity);             return new KillPlayerTask(entity.getName().getString());         }            setDebugState(\"\u041f\u043e\u0438\u0441\u043a \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439...\");         _currentVisibleTarget = null;         if (_scanTask.failedSearch()) {             Debug.logMessage(\"\u041f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e\u0438\u0441\u043a\u0430, \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435...\");             _scanTask.resetSearch(mod);         }          return _scanTask;     }     private Optional&lt;BlockPos> locateClosestUnopenedChest(AltoClef mod) {         \/\/if (WorldHelper.getCurrentDimension() != Dimension.OVERWORLD) {         \/\/    return Optional.empty();         \/\/}         return mod.getBlockTracker().getNearestTracking(blockPos -> mod.getPlayer().getBlockPos().isWithinDistance(blockPos, 15), Blocks.CHEST);         \/\/mod.getBlockTracker().getNearestTracking(blockPos -> WorldHelper.isUnopenedChest(mod, blockPos) &amp;&amp; mod.getPlayer().getBlockPos().isWithinDistance(blockPos, 15), Blocks.CHEST);     }      @Override     protected void onStop(AltoClef mod, Task interruptTask) {          mod.getBehaviour().pop();         mod.getBlockTracker().stopTracking(TO_SCAN);         EventBus.unsubscribe(_blockPlaceSubscription);     }      @Override     protected boolean isEqual(Task other) {         return other instanceof SkyWarsTask;     }      @Override     protected String toDebugString() {         return \"\u0410\u043a\u0442\u0438\u0432\u043d\u0430 \u0438\u0433\u0440\u0430 \u0432 SkyWars\";     }     private boolean ShouldBow(AltoClef mod, Entity target){         if(LookHelper.shootReady(mod,target)&amp;&amp;mod.getItemStorage().hasItem(Items.BOW) &amp;&amp; (mod.getItemStorage().hasItem(Items.ARROW) || mod.getItemStorage().hasItem(Items.SPECTRAL_ARROW)))         {         return true; }else {return false;}     }      private List&lt;Item> ArmorAndToolsNeeded(AltoClef mod) {         List&lt;Item> Needed = new ArrayList&lt;>();         \/\/\u0411\u0420\u041e\u041d\u042f         Needed.addAll(ItemsNeeded(mod,ItemHelper.HelmetsTopPriority));         Needed.addAll(ItemsNeeded(mod,ItemHelper.ChestplatesTopPriority));         Needed.addAll(ItemsNeeded(mod,ItemHelper.LeggingsTopPriority));         Needed.addAll(ItemsNeeded(mod,ItemHelper.BootsTopPriority));         \/\/\u0418\u041d\u0421\u0422\u0420\u0423\u041c\u0415\u041d\u0422\u042b         Needed.addAll(ItemsNeeded(mod,ItemHelper.SwordsTopPriority));         Needed.addAll(ItemsNeeded(mod,ItemHelper.AxesTopPriority));         Needed.addAll(ItemsNeeded(mod,ItemHelper.PickaxesTopPriority));         Needed.addAll(ItemsNeeded(mod,ItemHelper.ShovelsTopPriority));         Needed.addAll(ItemsNeeded(mod,ItemHelper.HoesTopPriority));         \/\/Needed.addAll(ItemsNeeded(mod,ItemHelper.Tool));         return Needed;     }     private List&lt;Item> ItemsNeeded(AltoClef mod,Item[] PriorityCheckArr){         List&lt;Item> NeededItems = new ArrayList&lt;>();          \/\/NeededItems.add(Items.GOLDEN_APPLE);         int level = GetHighestItemLevel(mod,PriorityCheckArr);         int iii = 0;         for (Item i : PriorityCheckArr){             if(iii&lt;level){                 NeededItems.add(Arrays.stream(PriorityCheckArr).toList().get(iii));             }             iii++;         }         \/\/NeededItems.addAll(Arrays.stream(ItemHelper.NETHERITE_TOOLS).toList());         return NeededItems;     }     private int GetHighestItemLevel(AltoClef mod,Item[] PriorityCheckArr){         int iii = 0;         int Level = 7;         for(Item i : PriorityCheckArr) {             if (StorageHelper.isArmorEquipped(mod, i) || mod.getItemStorage().hasItem(i)) {                 if(Level>iii)                     Level = iii;             }             iii++;         }         return Level;     }     private int IsArmorNeededToEquip(AltoClef mod, Item[] ArmorsTopPriority){          int iii = 0;         int Level = -1;         int hasLevel = 7;         \/\/if()          for(Item armorItem : ArmorsTopPriority){             if (StorageHelper.isArmorEquipped(mod, armorItem )) {                 Level = iii;             }             if (mod.getItemStorage().hasItem(armorItem)) {                 if(hasLevel>iii)                     hasLevel = iii;             }              iii++;         }         if(Level==-1)Level=7;         if (hasLevel&lt;Level){             return hasLevel;         }else{ return -1;}      }     private boolean isReadyToPunk(AltoClef mod) {         if (mod.getPlayer().getHealth() &lt;= 5) return false; \/\/ We need to heal.         return StorageHelper.isArmorEquippedAll(mod, ItemHelper.DIAMOND_ARMORS) &amp;&amp; mod.getItemStorage().hasItem(Items.DIAMOND_SWORD);     }      private boolean shouldPunk(AltoClef mod, PlayerEntity player) {         if (player == null || player.isDead() || !player.isAlive()) return false;         if (player.isCreative() || player.isSpectator()) return false;         \/\/if (!WorldHelper.canReach(mod,player.getBlockPos())) return false;         \/\/mod.getEntityTracker().getCloseEntities().         return !mod.getButler().isUserAuthorized(player.getName().getString());\/\/ &amp;&amp; _canTerminate.test(player);     }       private void tryDoFunnyMessageTo(AltoClef mod, PlayerEntity player) {         if (_funnyMessageTimer.elapsed()) {             if (LookHelper.seesPlayer(player, mod.getPlayer(), 80)) {                 String name = player.getName().getString();                 if (_currentVisibleTarget == null || !_currentVisibleTarget.equals(name)) {                     _currentVisibleTarget = name;                     _funnyMessageTimer.reset();                     String funnyMessage = getRandomFunnyMessage();                     mod.getMessageSender().enqueueWhisper(name, funnyMessage, MessagePriority.ASAP);                 }             }         }     }      private String getRandomFunnyMessage() {         return \"\u0421\u043e\u0432\u0435\u0442\u0443\u044e \u0441\u043f\u0440\u044f\u0442\u0430\u0442\u044c\u0441\u044f, \u043a\u0438\u0434\";     }     private static boolean shouldForce(AltoClef mod, Task task) {         return task != null &amp;&amp; task.isActive() &amp;&amp; !task.isFinished(mod);     }      private class ScanChunksInRadius extends SearchChunksExploreTask {          private final BlockPos _center;         private final double _radius;          public ScanChunksInRadius(BlockPos center, double radius) {             _center = center;             _radius = radius;         }          @Override         protected boolean isChunkWithinSearchSpace(AltoClef mod, ChunkPos pos) {             double cx = (pos.getStartX() + pos.getEndX()) \/ 2.0;             double cz = (pos.getStartZ() + pos.getEndZ()) \/ 2.0;             double dx = _center.getX() - cx,                     dz = _center.getZ() - cz;             return dx * dx + dz * dz &lt; _radius * _radius;         }          @Override         protected ChunkPos getBestChunkOverride(AltoClef mod, List&lt;ChunkPos> chunks) {             \/\/ Prioritise the chunk we last saw a player in.             if (_closestPlayerLastPos != null) {                 double lowestScore = Double.POSITIVE_INFINITY;                 ChunkPos bestChunk = null;                 for (ChunkPos toSearch : chunks) {                     double cx = (toSearch.getStartX() + toSearch.getEndX() + 1) \/ 2.0, cz = (toSearch.getStartZ() + toSearch.getEndZ() + 1) \/ 2.0;                     double px = mod.getPlayer().getX(), pz = mod.getPlayer().getZ();                     double distanceSq = (cx - px) * (cx - px) + (cz - pz) * (cz - pz);                     double pdx = _closestPlayerLastPos.getX() - cx, pdz = _closestPlayerLastPos.getZ() - cz;                     double distanceToLastPlayerPos = pdx * pdx + pdz * pdz;                     Vec3d direction = _closestPlayerLastPos.subtract(_closestPlayerLastObservePos).multiply(1, 0, 1).normalize();                     double dirx = direction.x, dirz = direction.z;                     double correctDistance = pdx * dirx + pdz * dirz;                     double tempX = dirx * correctDistance,                             tempZ = dirz * correctDistance;                     double perpendicularDistance = ((pdx - tempX) * (pdx - tempX)) + ((pdz - tempZ) * (pdz - tempZ));                     double score = distanceSq + distanceToLastPlayerPos * 0.6 - correctDistance * 2 + perpendicularDistance * 0.5;                     if (score &lt; lowestScore) {                         lowestScore = score;                         bestChunk = toSearch;                     }                 }                 return bestChunk;             }             return super.getBestChunkOverride(mod, chunks);         }          @Override         protected boolean isEqual(Task other) {             if (other instanceof ScanChunksInRadius scan) {                 return scan._center.equals(_center) &amp;&amp; Math.abs(scan._radius - _radius) &lt;= 1;             }             return false;         }          @Override         protected String toDebugString() {             return \"\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0440\u0440\u0438\u0442\u043e\u0440\u0438\u0438...\";         }      }     private static void sleepSec(double seconds) {         try {             Thread.sleep((int) (1000 * seconds));         } catch (InterruptedException e) {             e.printStackTrace();         }     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f\u00a0\u0441\u0432\u044f\u0437\u0438 \u0441\u00a0\u0433\u043b\u0430\u0432\u043d\u044b\u043c Python \u043f\u0440\u0438\u00a0\u043f\u043e\u043c\u043e\u0449\u0438 Py4j. \u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 PythonCallback \u0434\u043b\u044f\u00a0Py4j \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 Python \u0438\u0437\u00a0Java\u2011\u0447\u0430\u0441\u0442\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 PythonCallback.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package adris.altoclef; import py4j.GatewayServer; import py4j.PythonClient; import py4j.ClientServer;  import java.util.Map;  public interface PythonCallback {     public Boolean isStarted();     public String onChatMessage(String s);      public Map&lt;String,String> onVerifedChat(Map&lt;String,String> s);     public Map&lt;String,String> onUpdateServerInfo(Map&lt;String,String> s);     public void onDeath(String s);     public void onKill(String s);     public void onDamage(float s);     public void onCaptchaSolveRequest(byte[] image_bytes); } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0441 \u0441\u00a0Java\u2011\u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u00a0Python\u2011\u0447\u0430\u0441\u0442\u0438. \u0412\u043d\u0435\u0434\u0440\u044f\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u043f\u043e\u00a0\u043c\u0430\u043a\u0441\u0438\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u0430\u043a\u00a0\u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 \u0431\u043e\u0442\u0430, \u0442\u0430\u043a \u0438 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0442\u043e\u0438\u0442 \u0438\u0433\u0440\u043e\u043a. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u00a0\u043a\u043e\u0434\u0435 \u044f \u0432\u043d\u0435\u0434\u0440\u0438\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u00ab\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0433\u043e\u00bb \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043b\u044c\u044e Baritone (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u0438\u00a0\u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u043e\u0434\u043e\u0439\u0442\u0438 \u043a\u00a0\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u0431\u043b\u043e\u043a\u0443 \u0438\u043b\u0438\u00a0\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043c\u043e\u0434 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u044d\u0442\u043e\u0442 \u0431\u043b\u043e\u043a \u043a\u0430\u043a\u00a0\u0446\u0435\u043b\u044c \u0432\u00a0Baritone) \u0438 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0443\u0433\u043b\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0434\u043e\u00a0\u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438. \u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u043c \u044d\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0VTube Studio.<\/p>\n<p><a class=\"anchor\" name=\"Py4jEntryPoint\" id=\"Py4jEntryPoint\"><\/a><\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 Py4jEntryPoint.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package adris.altoclef;  import adris.altoclef.butler.WhisperChecker; import adris.altoclef.chains.DeathMenuChain; import adris.altoclef.tasksystem.Task; import adris.altoclef.ui.MessagePriority; import adris.altoclef.util.helpers.BaritoneHelper; import adris.altoclef.util.helpers.LookHelper; import adris.altoclef.util.helpers.WorldHelper; import adris.altoclef.util.time.TimerGame; import adris.altoclef.util.time.TimerReal; import baritone.api.pathing.calc.IPath; import baritone.api.pathing.goals.Goal; import baritone.api.utils.BetterBlockPos; import baritone.api.utils.Rotation; import net.minecraft.client.MinecraftClient; import net.minecraft.client.option.Perspective; import net.minecraft.entity.Entity; import net.minecraft.entity.FallingBlockEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Vec3d; import org.lwjgl.system.CallbackI; import py4j.PythonClient; import py4j.ClientServer; import py4j.GatewayServer;  import java.util.*;  public class Py4jEntryPoint {     AltoClef _mod;     PythonCallback _cb;      public Py4jEntryPoint(AltoClef mod)     {         _mod = mod;         resetValues();     }     public void resetValues(){         CentralGameInfoDict.put(\"server\", \"universal\");         CentralGameInfoDict.put(\"serverMode\", \"survival\");         CentralGameInfoDict.put(\"chatType\", \"lobby\");         \/\/if(DeathMenuChain.ServerIp!=null)         \/\/    if(!DeathMenuChain.ServerIp.isEmpty())         \/\/        CentralGameInfoDict.put(\"server\", DeathMenuChain.ServerIp);      }      public void setPerspective(int perspectiveNum) {         \/\/Perspective perspective = Perspective.values()[perspectiveNum] \u0431\u044b\u0441\u0442\u0440\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u043e \u043d\u0443\u0436\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430         Perspective perspective = Perspective.FIRST_PERSON;         switch (perspectiveNum){             case 0:                 perspective = Perspective.FIRST_PERSON;                 break;             case 1:                 perspective = Perspective.THIRD_PERSON_BACK;                 break;             case 2:                 perspective = Perspective.THIRD_PERSON_FRONT;                 break;             default:                 Debug.logMessage(\"\u0437\u0430\u043f\u0440\u043e\u0448\u0435\u043d\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0430: \"+perspectiveNum);         }         MinecraftClient.getInstance().options.setPerspective(perspective);      }     \/\/public Map&lt;String,String> getIngameInfo(){     \/\/    Map&lt;String,String> result_dict = new HashMap&lt;>();     \/\/    result_dict.put(\"task_chain\",getTaskChainString());     \/\/    result_dict.put(\"ground_block\",getGroundBlock());     \/\/    result_dict.put(\"held_item\",getHeldItem());     \/\/    return result_dict;     \/\/}      public String getTaskChainString (){          String tasks_string = \"\u041d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\";         try {             if (_mod.getTaskRunner().getCurrentTaskChain() != null) {                 List&lt;Task> tasks = _mod.getTaskRunner().getCurrentTaskChain().getTasks();                 if (tasks.size() > 0) {                     tasks_string = \"\";                     int i = 0;                     for (Task task : tasks) {                         tasks_string += (i+1)+\") \"+task.toString();                         if(i&lt;tasks.size()-1){tasks_string+=\"\\n\";}                         i++;                     }                 }              }         }catch (Exception e) {tasks_string = \"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u043f\u043e\u0434\u0437\u0430\u0434\u0430\u0447! \u0421\u043a\u0440\u0438\u043f\u0442 \u0441\u043b\u043e\u043c\u0430\u043b\u0441\u044f!\";}          return tasks_string;     }      public String getGroundBlock (){             if (AltoClef.inGame() &amp;&amp; _mod.getPlayer()!=null &amp;&amp; _mod.getWorld() != null) {                 \/\/MinecraftClient.getInstance().options.setPerspective(Perspective.FIRST_PERSON);                 \/\/MinecraftClient.getInstance().options.setPerspective(Perspective.THIRD_PERSON_BACK); \/\/\u0417\u0410\u0414\u041d\u0418\u0426\u0410                 \/\/MinecraftClient.getInstance().options.setPerspective(Perspective.THIRD_PERSON_FRONT); \/\/\u0412\u0421\u0415\u041c \u041f\u0420\u0418\u0412\u0415\u0422                 String blockName = WorldHelper.getGroundBlockName(_mod);                 if(_mod.getPlayer().isOnGround() &amp;&amp; blockName.equals(\"\u0432\u043e\u0437\u0434\u0443\u0445\")){                     return \"\u0437\u0435\u043c\u043b\u044f\";                 }else{                     return blockName;                 }               }else{                 return \"\u043f\u0443\u0441\u0442\u043e\u0442\u0430\";             }     }     public String getHeldItem(){             if (AltoClef.inGame() &amp;&amp; _mod.getPlayer()!=null &amp;&amp; _mod.getPlayer().getItemsHand()!=null) {                 for (ItemStack item : _mod.getPlayer().getItemsHand()){                     if(item.getItem()!=null){                          String itemName = item.getItem().getName().getString().toLowerCase();                         if(!itemName.equals(\"\u0432\u043e\u0437\u0434\u0443\u0445\")){                             if(item.hasCustomName()) {                                 String itemCustomName = item.getName().getString().toLowerCase();                                 return itemName+\" (\u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \" + itemCustomName+\")\";                             }                              \/\/Debug.logMessage(\"ITEM CUSTOM NAME = \"+itemCustomName);                             return itemName;                         }                       }                 }                 return \"\u043d\u0438\u0447\u0435\u0433\u043e\";              }else{                 return \"\u043d\u0438\u0447\u0435\u0433\u043e\";             }     }     public String getInfo(){         String result = \"\";         for (String value : CentralGameInfoDict.values()){             if(!value.isBlank()){                 result+=value+\" \";             }         }         if(callbackstarted)             result+=\"CB=ON\";         return result.strip();     }     public String getInfo(String key){return getInfo(key,\"\");}     public String getInfo(String key, String defolt){         return CentralGameInfoDict.getOrDefault(key, defolt);     }     public void InitPythonCallback(){         _cb = (PythonCallback) _mod.getGateway().getPythonServerEntryPoint(new Class[] {PythonCallback.class});     }     boolean callbackstarted = false;     public boolean IsCallbackServerStarted(){         boolean result = false;         try {             _cb.isStarted();             result = true;         }catch (Exception e) {}         callbackstarted = result;         return result;     }     String _state = \"starting\";     public String saayHellooo(String name) {         return \"Hello, \" + name + \"!\" + Items.SOUL_SAND.getName().getString();     }      public String getState(){         return _state;     }     public void setState(String state){         _state = state;     }     public static boolean inGame(){         return AltoClef.inGame();     }     public void onStrongChatMessage(WhisperChecker.MessageResult message){         if(IsCallbackServerStarted()) {             Map&lt;String,String> messageDict = new HashMap&lt;>();             \/\/if()             messageDict.put(\"user\",message.from);             messageDict.put(\"msg\",message.message);             if(message.clan != null) messageDict.put(\"clan\",message.clan);             if(message.team != null) messageDict.put(\"team\",message.team);             if(message.starter_prefix != null) messageDict.put(\"pre\",message.starter_prefix);             if(message.rank != null) messageDict.put(\"rank\",message.rank);             if(message.serverExactPrediction != null) messageDict.put(\"precision\",message.serverExactPrediction);             if(message.server != null) messageDict.put(\"server\",message.server);             if(message.serverMode != null) messageDict.put(\"serverMode\",message.serverMode);             if(message.chat_type != null) messageDict.put(\"chat_type\",message.chat_type);             _cb.onVerifedChat(messageDict);         }     }     public void ChatMessage(String msg){         if(AltoClef.inGame())         _mod.getMessageSender().enqueueChat(msg, MessagePriority.ASAP);         \/\/Object myPythonClass =  _mod.getGateway().getPythonServerEntryPoint(new Class[]{MyPythonClass.class});     }     public void RunInnerCommand(String command){         AltoClef.getCommandExecutor().execute(command); \/\/@stop     }     public void CaptchaSolvedSend(String msg, double accuracy){         if(AltoClef.inGame()) {             Debug.logMessage(\"GOT CAPTCHA SOLVING! >\"+msg+\"&lt; acc=\"+accuracy);             _mod.getMessageSender().enqueueChat(msg, MessagePriority.ASAP);         }         \/\/Object myPythonClass =  _mod.getGateway().getPythonServerEntryPoint(new Class[]{MyPythonClass.class});     }      public void ExecuteCommand(String cmd){         _mod.getCommandExecutor().execute(cmd);     }     public Map&lt;String,String> CentralGameInfoDict = new HashMap&lt;>();     public void UpdateServerInfo(String field, String value){         if (!field.isBlank() &amp;&amp; !value.isBlank()) {             if (CentralGameInfoDict.containsKey(field)) {                 if (!CentralGameInfoDict.get(field).equals(value)) {                     Debug.logMessage(\"changed srv INFO f>\" + field + \", v>\" + value);                     putInfo(field, value);                 }             } else {                 Debug.logMessage(\"added srv INFO f>\" + field + \", v>\" + value);\/\/, dict=\"+CentralGameInfoDict.toString());                 putInfo(field, value);             }         }     }     void putInfo(String field, String value){         CentralGameInfoDict.put(field, value);         if(IsCallbackServerStarted()) {             _cb.onUpdateServerInfo(CentralGameInfoDict);         }     }      public void onChatMessage(String msg){         if(IsCallbackServerStarted()) {             _cb.onChatMessage(msg);         }     }     public void onDeath(String killer){         if(IsCallbackServerStarted()) {             _cb.onDeath(killer);         }     }     public void onKill(String killed){         if(IsCallbackServerStarted()) {             _cb.onKill(killed);         }     }     public void onCaptchaSolveRequest(byte[] image_bytes){         if(IsCallbackServerStarted()) {             Debug.logMessage(\"SENDING TO CALLBACK!\");             _cb.onCaptchaSolveRequest(image_bytes);         }     }     public void onDamage(float amount){         if(IsCallbackServerStarted()) {             _cb.onDamage(amount);         }     }     public Vec3d Nuller(){         return null;     }     public Rotation getGoalRotation(){           Rotation result = null;         if (AltoClef.inGame()){             Vec3d goal = getCurrentGoal();             if(goal != null){                 Rotation targetrot = LookHelper.getLookRotation(_mod,goal);                 result = LookHelper.getLookRotation().subtract(targetrot);             }         }         return result;     }     public Vec3d getCurrentGoal(){         Vec3d result = null;         if (AltoClef.inGame()) {             Optional&lt;IPath> pathq = _mod.getClientBaritone().getPathingBehavior().getPath();             BetterBlockPos goalpos = null;              if (pathq.isPresent()) {                 List&lt;BetterBlockPos> pathlist = pathq.get().positions();                 if (pathlist.size() > 0) {                     goalpos = pathlist.get(pathlist.size() - 1);                     result = new Vec3d(goalpos.getX(), goalpos.getY(), goalpos.getZ());                     \/\/Debug.logMessage(\"goalpos x=\"+goalpos.getX()+\" y=\"+goalpos.getY());                 }             }         }         return result;         \/\/_mod.getClientBaritone().getCustomGoalProcess().getGoal().toString();         \/\/return _mod.getClientBaritone().getGetToBlockProcess().GetToBlockCalculationContext.;         \/\/_mod.getTaskRunner().getCurrentTaskChain().getTasks().     }     public void callPythonMethod(){         \/\/_mod.getGateway().getGateway().getCallbackClient().sendCommand(\"trysi\"); \/\/command, blocking?     }     public double getHealth(){         return _mod.getPlayer() == null ? 0 :(double)_mod.getPlayer().getHealth();     }     public double getSpeed(){         return _mod.getPlayer() == null ? 0 :(double)_mod.getPlayer().getMovementSpeed();     }     public Vec3d getSpeedVector(){         return _mod.getPlayer() == null ? new Vec3d(0,0,0) : _mod.getPlayer().getVelocity();     }     public double getPitch(){         return _mod.getPlayer() == null ? 0 : _mod.getPlayer().getPitch();     }     public double getPitch(double TickDelta){         return _mod.getPlayer() == null ? 0 :_mod.getPlayer().getPitch((float)TickDelta);     }     public double getYaw(){         return _mod.getPlayer() == null ? 0 :_mod.getPlayer().getYaw();     }     public double getYaw(double TickDelta){         return _mod.getPlayer() == null ? 0 :_mod.getPlayer().getYaw((float)TickDelta);     }     public Vec3d getAngVector(){         return _mod.getPlayer() == null ? new Vec3d(0,0,0) :_mod.getPlayer().getRotationVector();     }     public double getSpeedX(){         return _mod.getPlayer() == null ? 0 :_mod.getPlayer().getVelocity().getX();     }     public double getSpeedY(){         return _mod.getPlayer() == null ? 0 :_mod.getPlayer().getVelocity().getY();     }     public double getSpeedZ(){         return _mod.getPlayer() == null ? 0 :_mod.getPlayer().getVelocity().getZ();     }     public double getSpeedXZ(){         return _mod.getPlayer() == null ? 0 :Math.sqrt(Math.pow(_mod.getPlayer().getVelocity().getX(),2)+Math.pow(_mod.getPlayer().getVelocity().getZ(),2));     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c <abbr class=\"habraabbr\" title=\"callback \u2013 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432\" data-title=\"&lt;p>callback \u2013 \u043e\u0431\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432&lt;\/p>&#187; data-abbr=&#187;\u043a\u0430\u043b\u043b\u0431\u0435\u043a&#187;>\u043a\u0430\u043b\u043b\u0431\u0435\u043a<\/abbr> \u0438 \u0442\u043e\u0447\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0438\u0437\u00a0\u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0430 (\u044f \u0432\u0441\u0442\u0430\u0432\u0438\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u043a\u043e\u0434\u0430 \u0441\u00a0\u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 AltoClef.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package adris.altoclef; public class AltoClef implements ModInitializer {     private static GatewayServer _gatewayServer;     private static Py4jEntryPoint _py4jEntryPoint;  _py4jEntryPoint = new Py4jEntryPoint(this);         _gatewayServer = new GatewayServer(_py4jEntryPoint);         _gatewayServer.start();         \/\/ClientServer clientServer = new ClientServer(null, 25333);         \/\/_gatewayServer.getGateway().getCallbackClient().         if (_gatewayServer != null ) {             System.out.println(\"Gateway Server started on port \"+_gatewayServer.getPort()+\". Listeting port: \"+_gatewayServer.getListeningPort());         }         _py4jEntryPoint.InitPythonCallback();   }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u00a0\u043a\u043b\u0430\u0441\u0441\u0435 <code>adris.altoclef.butler <\/code>\u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u0438 <abbr class=\"habraabbr\" title=\"\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 if-else \u0438 \u0438\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\" data-title=\"&lt;p>\u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0438\u0434\u0430 if-else \u0438 \u0438\u0445 \u0430\u043d\u0430\u043b\u043e\u0433\u0438&lt;\/p>&#187; data-abbr=&#187;\u0447\u0435\u043a\u0430\u043c\u0438 &#171;>\u0447\u0435\u043a\u0430\u043c\u0438<\/abbr> \u0434\u043b\u044f\u00a0\u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0441\u0442\u0440\u0435\u043b\u0438\u0442\u044c <abbr class=\"habraabbr\" title=\"\u043e\u0442 \u0430\u043d\u0433. event \u2013 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\" data-title=\"&lt;p>\u043e\u0442 \u0430\u043d\u0433. event \u2013 \u0441\u043e\u0431\u044b\u0442\u0438\u0435&lt;\/p>&#187; data-abbr=&#187;\u044d\u0432\u0435\u043d\u0442\u044b&#187;>\u0438\u0432\u0435\u043d\u0442\u044b<\/abbr> \u043e\u00a0\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u00a0Python\u2011\u0447\u0430\u0441\u0442\u0438.<\/p>\n<p><span class=\"habrahidden\">\u0423\u043f\u0441, \u0430\u00a0\u0437\u0434\u0435\u0441\u044c \u043a\u043e\u0434\u0430 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442, \u044d\u0442\u0443 \u0447\u0430\u0441\u0442\u044c \u0442\u044b \u0438 \u0441\u0430\u043c \u0441\u043c\u043e\u0436\u0435\u0448\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c, \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c! \u041f\u0440\u043e\u0441\u0442\u043e \u0442\u0443\u0442 \u0443\u00a0\u043c\u0435\u043d\u044f \u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0430\u0446\u0438\u044f \u0433\u0440\u044f\u0437\u0435\u043a\u043e\u0434\u0430 \u0437\u0430\u0448\u043a\u0430\u043b\u0438\u043b\u0430, \u0430\u00a0\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043f\u0443\u0441\u0442\u044f \u0433\u043e\u0434 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043b\u0435\u043d\u044c&#8230; \u041f\u0440\u043e\u0448\u0443 \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c&#8230;<\/span><\/p>\n<p><a class=\"anchor\" name=\"MCChatParser\" id=\"MCChatParser\"><\/a><\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u0442\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0447\u0430\u0442\u0430 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0430. \u041f\u043e-\u0445\u043e\u0440\u043e\u0448\u0435\u043c\u0443, \u044d\u0442\u043e \u2013 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0442\u0435\u043c\u0430 \u043d\u0430 \u0446\u0435\u043b\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e, \u043d\u043e \u044f \u0437\u0430\u043f\u0438\u0445\u0430\u044e \u0432\u0441\u0451 \u0432 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0441\u043f\u043e\u0439\u043b\u0435\u0440 \ud83d\ude42<\/p>\n<details class=\"spoiler\">\n<summary>\u0410\u0414 (\u0438\u043b\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0447\u0430\u0442\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 Minecraft)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043c\u043e\u0434 AltoClef \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0432 \u0441\u0435\u0431\u0435 \u043f\u0430\u0440\u0441\u0435\u0440 \u0447\u0430\u0442\u0430 Minecraft, \u043d\u043e \u043e\u043d \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0432\u0430\u043d\u0438\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439:<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0430\u043d\u0438\u043b\u044c\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0447\u0430\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<blockquote>\n<p>&lt;\u043d\u0438\u043a1> \u043f\u0440\u0438\u0432\u0435\u0442<\/p>\n<p>&lt;\u043d\u0438\u043a2> \u043f\u043e\u043a\u0430<\/p>\n<\/blockquote>\n<\/div>\n<\/details>\n<p>\u041d\u0435 \u0431\u0435\u0434\u0430, \u043f\u043e\u0434\u0443\u043c\u0430\u043b \u044f, \u0442\u0430\u043c \u0432\u0435\u0434\u044c \u0431\u044b\u043b <strong>\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d<\/strong>, \u043e\u0434\u043d\u0430\u043a\u043e <strong>\u043d\u0435 \u0442\u0443\u0442 \u0442\u043e \u0431\u044b\u043b\u043e<\/strong>&#8230; \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u043c\u043e\u0433 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043d\u0435 \u0438\u043c\u0435\u043b \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0442 <a href=\"https:\/\/habr.com\/ru\/articles\/545150\/\" rel=\"noopener noreferrer nofollow\">REGEX<\/a>-\u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u0445. \u0427\u0442\u043e \u0436, \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043c\u043d\u0435 \u044d\u0442\u043e \u043f\u0438\u043b\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443. \u0427\u0442\u043e\u0431\u044b \u0432\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u043b\u0438 <strong>\u043c\u0430\u0441\u0448\u0442\u0430\u0431<\/strong> \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u0447\u0430\u0442\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 Minecraft:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 Minecraft<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eed\/17f\/ce1\/eed17fce1e4ca1ae53a328a1b44d80fa.png\" alt=\"\u0421\u0430\u043c\u044b\u0439 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\" title=\"\u0421\u0430\u043c\u044b\u0439 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\" width=\"693\" height=\"166\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eed\/17f\/ce1\/eed17fce1e4ca1ae53a328a1b44d80fa.png\"\/><\/p>\n<div><figcaption>\u0421\u0430\u043c\u044b\u0439 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bea\/70f\/f9e\/bea70ff9e7200b1dae4810eeb06d9165.png\" alt=\"\u0410\u0414\" title=\"\u0410\u0414\" width=\"968\" height=\"549\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bea\/70f\/f9e\/bea70ff9e7200b1dae4810eeb06d9165.png\"\/><\/p>\n<div><figcaption>\u0410\u0414<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0434\u0430\u0436\u0435 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u043f\u0443\u0442\u0451\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0437\u0430\u0441\u044b\u043b\u0430\u043d\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442\u0435, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0431\u0435\u0437 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f. \u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c, \u0430 \u043c\u043e\u0433\u0443\u0442 \u2013 \u0438 \u043d\u0435 \u0431\u044b\u0442\u044c. <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u043a\u043b\u0430\u043d\u044b, \u0442\u043e \u0438\u0433\u0440\u043e\u043a, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u0432 \u043a\u043b\u0430\u043d\u0435, \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0442\u0435\u0433 \u043a\u043b\u0430\u043d\u0430, \u0430 \u0438\u0433\u0440\u043e\u043a \u0431\u0435\u0437 \u043a\u043b\u0430\u043d\u0430 \u2013 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0435\u0433\u043e \u0438\u043c\u0435\u0442\u044c. \u041a\u043b\u0430\u043d\u044b, \u043a\u0441\u0442\u0430\u0442\u0438, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u044b\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0441\u0430\u043c\u044b\u0439 \u0441\u0443\u0449\u0438\u0439 \u0430\u0434 \u2013 \u044d\u0442\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u043e\u0432 \u0438 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u0438\u043b\u0438 \u043d\u0435 \u0431\u044b\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435, \u0438\u043b\u0438 \u0431\u044b\u0442\u044c \u0432\u0441\u0435 \u0432\u043c\u0435\u0441\u0442\u0435! \u042f \u0443\u0436\u0435 \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0435 \u0436\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438, \u0447\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u043d\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0442\u0430\u043a\u043e\u0435 \u2013 \u0440\u0435\u0434\u043a\u043e\u0441\u0442\u044c.<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a&#8230; \u0412\u044b \u0443\u0436\u0435 \u043e\u0442\u043e\u0448\u043b\u0438 \u043e\u0442 \u0448\u043e\u043a\u0430? \u042f \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u043d\u0435\u0442. \u0414\u0443\u043c\u0430\u044e, \u043b\u044e\u0431\u043e\u0439 \u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0441\u0435\u0431\u044f \u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0430\u0440\u0441\u0435\u0440\u044b, \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u044d\u0442\u043e \u2013 \u0441\u0443\u0449\u0438\u0439 \u043a\u043e\u0448\u043c\u0430\u0440. \u0422\u043e\u043b\u044c\u043a\u043e \u0443 \u043c\u0435\u043d\u044f \u0434\u043b\u044f \u0432\u0430\u0441 \u043e\u0434\u043d\u0430 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0430\u044f \u043d\u043e\u0432\u043e\u0441\u0442\u044c. \u041a\u0442\u043e, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043c\u044b?..<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u044f \u0440\u0435\u0448\u0438\u043b\u0441\u044f. \u0418 \u044f \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043b, \u043f\u0440\u0430\u0432\u0434\u0430, \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u043e\u0440\u044f\u0432\u043e, \u0435\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0430\u0432\u0442\u043e\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0447\u0430\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0443\u0436 \u0442\u043e\u0447\u043d\u043e \u0441\u043e\u0439\u0434\u0451\u0442.<\/p>\n<p>\u0413\u043e\u0432\u043e\u0440\u044f \u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0434\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0432\u0438\u0434\u044b \u0438\u0445 \u044d\u0442\u0438\u0445 \u0432\u043e\u043d\u044e\u0447\u0438\u0445 \u0441\u0442\u0440\u0435\u043b\u043e\u043a:<\/p>\n<p><code>\"\u27a5\",\"->\",\"\u27a1\",\"\u27a5\",\"\u27af\",\"\u27a8\",\"\u203a\",\"\u25ba\",\"\u22d9\",\"\u00bb\",\"\u2abc\",\"\u21e8\"<\/code><\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0442\u0435\u0433\u0438, \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u0432 \u043a\u0430\u0436\u0434\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445:<\/p>\n<p><code>\"{team}\",\"{global}\",\"{starterPrefix}\",\"{donate}\",\"{suffix}\",\"{clan}\",\"{rank}\", \"{from}\", \"{to}\", \"{message}\"<\/code><\/p>\n<p>\u041b\u044e\u0431\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0435\u0433\u0438 \u043d\u0430\u043c \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e, \u0435\u0441\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043e\u043d\u0438 \u0435\u0441\u0442\u044c, \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0432\u0431\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u043a <code>{\u043b\u044e\u0431\u043e\u0435_\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435}<\/code>, \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u043d\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u0442\u044c\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043d\u043e\u0432\u044b\u0445 \u0432\u0432\u043e\u0434\u043d\u044b\u0445. \u0423 \u043c\u0435\u043d\u044f \u0432\u0435\u0437\u0434\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0430\u0432\u0442\u043e\u0434\u0435\u0442\u0435\u043a\u0442, \u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u044d\u0442\u043e \u043a\u0443\u0434\u0430-\u0442\u043e \u0441\u0435\u0431\u0435, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0433\u043e, \u043f\u0435\u0440\u0435\u0434\u0430\u0432 \u0432 \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u0449\u0438\u043a \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e, \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 ChatChecker.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package adris.altoclef.butler;  import adris.altoclef.AltoClef; import adris.altoclef.Debug; import adris.altoclef.util.time.TimerGame;  import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;  public class WhisperChecker {      private static final TimerGame _repeatTimer = new TimerGame(0.1);      private static String _lastMessage = null;      public static MessageResult tryParse(String ourUsername, String whisperFormat, String message) {         List&lt;String> parts = new ArrayList&lt;>(Arrays.asList(\"{from}\", \"{to}\", \"{message}\"));          \/\/ Sort by the order of appearance in whisperFormat.         parts.sort(Comparator.comparingInt(whisperFormat::indexOf));         parts.removeIf(part -> !whisperFormat.contains(part));          String regexFormat = Pattern.quote(whisperFormat);         for (String part : parts) {             regexFormat = regexFormat.replace(part, \"(.+)\");         }         if (regexFormat.startsWith(\"\\\\Q\")) regexFormat = regexFormat.substring(\"\\\\Q\".length());         if (regexFormat.endsWith(\"\\\\E\")) regexFormat = regexFormat.substring(0, regexFormat.length() - \"\\\\E\".length());         \/\/Debug.logInternal(\"FORMAT: \" + regexFormat + \" tested on \" + message);         Pattern p = Pattern.compile(regexFormat);         Matcher m = p.matcher(message);         Map&lt;String, String> values = new HashMap&lt;>();         if (m.matches()) {             for (int i = 0; i &lt; m.groupCount(); ++i) {                 \/\/ parts is sorted, so the order should lign up.                 if (i >= parts.size()) {                     Debug.logError(\"Invalid whisper format parsing: \" + whisperFormat + \" for message: \" + message);                     break;                 }                 \/\/Debug.logInternal(\"     GOT: \" + parts.get(i) + \" -> \" + m.group(i + 1));                 values.put(parts.get(i), m.group(i + 1));             }         }          if (values.containsKey(\"{to}\")) {             \/\/ Make sure the \"to\" target is us.             String toUser = values.get(\"{to}\");             if (!toUser.equals(ourUsername)) {                 Debug.logInternal(\"Rejected message since it is sent to \" + toUser + \" and not \" + ourUsername);                 return null;             }         }         if (values.containsKey(\"{from}\") &amp;&amp; values.containsKey(\"{message}\")) {             MessageResult result = new MessageResult();             result.from = values.get(\"{from}\");             result.message = values.get(\"{message}\");             return result;         }         return null;     }     public static MessageResult chatParse(String ourUsername, String[] chatFormatMas, String message) {         return chatParse(ourUsername, chatFormatMas, message, \"exact\");     }     public static MessageResult chatParse(String ourUsername, String[] chatFormatMas, String message, String ExactState) {         List&lt;String> parts = new ArrayList&lt;>(Arrays.asList(\"{team}\",\"{global}\",\"{starterPrefix}\",\"{donate}\",\"{suffix}\",\"{clan}\",\"{rank}\", \"{from}\", \"{to}\", \"{message}\"));         String serverName = chatFormatMas[0];         String serverMode = chatFormatMas[2];         String chatFormatNew = new String(chatFormatMas[1]);         \/\/ Sort by the order of appearance in whisperFormat.         message = message.replace(\"\\\\\",\"\");         \/\/\u0437\u0430\u043c\u0435\u043d\u044f\u0435\u043c \u0441\u0442\u0440\u0435\u043b\u043a\u0438         List&lt;String> arrows = new ArrayList&lt;>(Arrays.asList(\"\u27a5\",\"->\",\"\u27a1\",\"\u27a5\",\"\u27af\",\"\u27a8\",\"\u203a\",\"\u25ba\",\"\u22d9\",\"\u00bb\",\"\u2abc\",\"\u21e8\")); \/\/https:\/\/ru.piliapp.com\/symbol\/arrow\/         for (String arrow : arrows){             if (!chatFormatNew.contains(arrow)) { \/\/\u0415\u0421\u041b\u0418 \u0428\u0410\u0411\u041b\u041e\u041d \u041d\u0415 \u0421\u041e\u0414\u0415\u0420\u0416\u0418\u0422 \u041e\u0414\u041d\u0423 \u0418\u0417 \u042d\u0422\u0418\u0425 \u0421\u0422\u0420\u0415\u041b\u041e\u041a \u0422\u041e\u0413\u0414\u0410 \u0420\u0415\u041f\u041b\u0410\u0419\u0421\u0410\u0415\u041c \u0415\u0421\u041b\u0418 \u041d\u0415\u0422 \u0422\u041e \u0418\u0414\u0415\u041c \u041f\u041e \u0428\u0410\u0411\u041b\u041e\u041d\u0423 \u0422\u0410\u041a \u0411\u0423\u0414\u0415\u0422 \u0422\u041e\u0427\u041d\u0415\u0415!                 message = message.replace(arrow, \">\");             }         }         List&lt;Character> regexKillingChars = new ArrayList&lt;>(Arrays.asList('[',']','.','^','?','*','$','(',')','\/','|','+'));          \/\/Debug.\/\/logMessage(\"Do:\"+message);         for (Character killer : regexKillingChars){               String charr = killer.toString();               chatFormatNew = chatFormatNew.replace(charr,\"\\\\\"+charr);           }         String chatFormat = chatFormatNew;          parts.sort(Comparator.comparingInt(chatFormat::indexOf));         parts.removeIf(part -> !chatFormat.contains(part));          \/\/Debug.logMessage(\"Posle:\"+message);         \/\/\/\/\u042f \u041d\u0410 \u042d\u0422\u041e\u041c \u0415**** \u0412\u0415\u0421\u042c \u0414\u0415\u041d\u042c ****          String regexFormat = Pattern.quote(chatFormat);         for (String part : parts) {             \/\/Debug.logMessage(\"4o\"+part);             regexFormat = regexFormat.replace(part, \"(.+)\");         }          if (regexFormat.startsWith(\"\\\\Q\")) regexFormat = regexFormat.substring(\"\\\\Q\".length());         if (regexFormat.endsWith(\"\\\\E\")) regexFormat = regexFormat.substring(0, regexFormat.length() - \"\\\\E\".length());         \/\/Debug.logInternal(\"FORMAT: \" + regexFormat + \" tested on \" + message);         Pattern p = Pattern.compile(regexFormat);         Matcher m = p.matcher(message);         Map&lt;String, String> values = new HashMap&lt;>();         if (m.matches()) {             \/\/Debug.logMessage(\"4o 3a dermo\"+m.toString());             for (int i = 0; i &lt; m.groupCount(); ++i) {                 \/\/ parts is sorted, so the order should lign up.                 if (i >= parts.size()) {                     Debug.logError(\"Invalid whisper format parsing: \" + chatFormat + \" for message: \" + message);                     break;                 }                 \/\/Debug.logInternal(\"     GOT: \" + parts.get(i) + \" -> \" + m.group(i + 1));                 values.put(parts.get(i), m.group(i + 1));             }         }          if (values.containsKey(\"{to}\")) {             \/\/ Make sure the \"to\" target is us.             String toUser = values.get(\"{to}\");             if (!toUser.equals(ourUsername)) {                 Debug.logInternal(\"Rejected message since it is sent to \" + toUser + \" and not \" + ourUsername);                 return null;             }         }         List&lt;Character> nickKillingChars = new ArrayList&lt;>(Arrays.asList('~','[',']','.','^','?','*','$','(',')','\/','|','+'));         if (values.containsKey(\"{from}\") &amp;&amp; values.containsKey(\"{message}\")) {             String name = values.get(\"{from}\");             if(name != null) {                 if (name != null &amp;&amp; name.strip() != \"\") {                     String[] splittedName = name.strip().split(\" \");                     if (splittedName.length>0) {                         if(splittedName.length==1){                             name = splittedName[0];                         } else if (splittedName.length==2) {\/\/[A-Za-z0-9]                             name = splittedName[0]; \/\/[\u0431\u043e\u0433] _nyaka \u041a\u0440\u0430\u0441\u0430\u0432\u0438\u0446\u0430 :                         } else if (splittedName.length==3) {                             name = splittedName[0]; \/\/[\u043f\u0440\u0435\u0437\u0438\u0434\u0435\u043d\u0442] \u0413\u0435\u043d\u0438\u0439 lexa \u0411\u043e\u0433\u0430\u0447 :                         } else{                             name = splittedName[0];                         }                         for (Character killer : nickKillingChars){                             String charr = killer.toString();                             name = name.replace(charr,\"\");                         }                          \/\/Debug.logMessage(\"4o nado\"+message);                         MessageResult result = new MessageResult();                         if (values.containsKey(\"{starterPrefix}\"))                             result.starter_prefix = values.get(\"{starterPrefix}\");                         if (values.containsKey(\"{rank}\")) result.rank = values.get(\"{rank}\");                         if (values.containsKey(\"{clan}\")) result.clan = values.get(\"{clan}\");                         if (values.containsKey(\"{team}\")) result.team = values.get(\"{team}\");                         if (values.containsKey(\"{global}\")) result.chat_type = values.get(\"{global}\");                         \/\/if (values.containsKey(\"{rank}\")) result.rank = values.get(\"{rank}\");                          result.server = serverName;                         result.serverMode = serverMode;                         result.serverExactPrediction = ExactState;                         result.from = name;                         result.message = values.get(\"{message}\");                         return result;                     }                 }             }         }         return null;     }     public MessageResult receiveChat(AltoClef mod, String ourUsername, String msg, String server, String servermode) {         String foundMiddlePart = \"\";         int index = -1;          boolean duplicate = (msg.equals(_lastMessage));         if (duplicate &amp;&amp; !_repeatTimer.elapsed()) {             _repeatTimer.reset();             \/\/ It's probably an actual duplicate. IDK why we get those but yeah.             return null;         }          _lastMessage = msg; \/\/\u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043b\u0438 \u043c\u044b \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0432 \u044d\u0442\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435         for (String[] format : ButlerConfig.getInstance().chatFormats) {             if (server.equals(format[0]) &amp;&amp; servermode.equals(format[2])){                 \/\/Debug.logMessage(\"\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0451\"+format[0]+format[1]+format[2]);                 MessageResult check = chatParse(ourUsername, format, msg);                 if (check != null) {                     String user = check.from;                     String message = check.message;                     if (user == null || message == null) break;                     return check;                 }             }         }         \/\/\u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0431\u0443\u0434\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0447\u0442\u043e\u0431\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0438\u043a \u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443         for (String[] format : ButlerConfig.getInstance().chatFormats) {             if (server.equals(format[0])){                 \/\/Debug.logMessage(\"\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\"+format[0]+format[1]+format[2]);                 MessageResult check = chatParse(ourUsername, format, msg,\"server\");                 if (check != null) {                     String user = check.from;                     String message = check.message;                     if (user == null || message == null) break;                     return check;                 }             }         }         \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0438\u043f         for (String[] format : ButlerConfig.getInstance().chatFormats) {             if (\"universal\".equals(format[0])){                 \/\/Debug.logMessage(\"\u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u044e\u043d\u0438\u0432\u0435\u0440\u0441\"+format[0]+format[1]+format[2]);                 MessageResult check = chatParse(ourUsername, format, msg, \"universal\");                 if (check != null) {                     String user = check.from;                     String message = check.message;                     if (user == null || message == null) break;                     return check;                 }             }         }         for (String[] format : ButlerConfig.getInstance().chatFormats) {             MessageResult check = chatParse(ourUsername, format, msg, \"random\");             if (check != null) {                 String user = check.from;                 String message = check.message;                 if (user == null || message == null) break;                 return check;              }         }          return null;     }     public MessageResult receiveMessage(AltoClef mod, String ourUsername, String msg) {         String foundMiddlePart = \"\";         int index = -1;          boolean duplicate = (msg.equals(_lastMessage));         if (duplicate &amp;&amp; !_repeatTimer.elapsed()) {             _repeatTimer.reset();             \/\/ It's probably an actual duplicate. IDK why we get those but yeah.             return null;         }          _lastMessage = msg;          for (String format : ButlerConfig.getInstance().whisperFormats) {             MessageResult check = tryParse(ourUsername, format, msg);             if (check != null) {                 String user = check.from;                 String message = check.message;                 if (user == null || message == null) break;                 return check;             }         }          return null;     }      public static class MessageResult {         public String from;         public String message;         public String rank;         public String serverMode;         public String server;         public String clan;         public String team;         public String chat_type;         public String serverExactPrediction;         public String starter_prefix;         @Override         public String toString() {             return \"MessageResult{\" +                     \"from='\" + from + '\\'' +                     \", message='\" + message + '\\'' +                     '}';         }         \/\/public String getDetails(){         \/\/    \/\/return \"MessageDetails{\" +         \/\/            \"from='\" + from + '\\'' +         \/\/            \", message='\" + message + '\\'' +         \/\/            \", rank='\" + server + '\\'' +         \/\/            '}'         \/\/         \/\/            ;         \/\/}      } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0423\u0443\u0443, \u0437\u043d\u0430\u043b\u0438 \u0431\u044b \u0432\u044b, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044f \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043d\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0441\u0438\u043b \u0438 \u043d\u0435\u0440\u0432\u043e\u0432. <em>\u041a \u0441\u043b\u043e\u0432\u0443, \u0433\u0434\u0435-\u0442\u043e \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0447\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u0432 \u043a\u043e\u0434\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u0445\u043c\u043c, \u043f\u0440\u043e \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u044f&#8230; <\/em><\/p>\n<p>\u0418\u0442\u0430\u043a, \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c, \u043d\u0430\u043a\u0430\u0442\u0430\u0435\u043c \u043f\u0430\u0440\u043e\u0447\u043a\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u0423\u0447\u0442\u0451\u043c, \u0447\u0442\u043e \u044d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0438 \u043a\u0443\u0447\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0434\u0430\u0436\u0435 \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 ButlerConfig.java\/chatFormats<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">    public String[][] chatFormats = new String[][]{             \/\/\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.             {\"universal\",\"&lt;{from}> {message}\",\"survival\"},             \/\/\"? ? [\u043f\u0432\u0430\u043f\u0432\u0430] | [\u0430\u044b\u0432\u0430] Khushin \u0444\u0432\u044b\u044b\u0432 ? 14234\".             {\"mc.musteryworld.net\",\"{starterPrefix} [{clan}] | [{rank}] {from} > {message}\",\"survival\"},             {\"mc.musteryworld.net\",\"{starterPrefix} | [{rank}] {from} > {message}\",\"survival\"},             {\"mc.musteryworld.net\",\"[\u2691] {from}: {message}\",\"bedwars\"},             {\"mc.musteryworld.net\",\"[{rank}] &lt;{from}> {message}\",\"skywars\"},             {\"mc.musteryworld.net\",\"{from} \u22d9 {message}\",\"murdermystery\"},             \/\/ murder             \/\/ BEDWARS             \/\/[\u2691] NetTyan: \u0430\u0430              \/\/[\u0412\u0441\u0435\u043c] NetTyan:  \u0435             {\"mc.musteryworld.net\",\"[\u0412\u0441\u0435\u043c] {from}: {message}\",\"bedwars\"},             \/\/162onmyhead \u22d9 \u043d\u0438\u043a \u0435*****             {\"mc.musteryworld.net\",\"SPEC: {from} > {message}\",\"murdermystery\"},             {\"mc.musteryworld.net\",\"{from} > {message}\",\"murdermystery\"},              \/\/ VIME MC MESSAGES TYPES             \/\/\u10e6 [G] \u00a78[\u00a7f\u00a7f\u00a7l\u043f\u043f\u043f_IVANBANAN\u00a78] | \u15a7\u0428\u0423\u0422\u15a8 ~koshmarik9090 \u0423\u0442\u043e\u043f\u043b\u0435\u043d\u043d\u0438\u043a \u203a \u0411\u043b\u0438\u043d \u0431\u043b\u0438\u043d\u0441\u043a\u0438\u0439             \/\/(i) bxmew \u043d\u0430\u043b\u043e\u0436\u0438\u043b \u043c\u0443\u0442 \u043d\u0430 \u0438\u0433\u0440\u043e\u043a\u0430 apipka228 \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435: \u043f\u043e\u043f\u0440\u043e\u0448\u0430\u0439\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u043e [\u041f\u041e\u0414\u0420\u041e\u0411\u041d\u0415\u0415]             \/\/\u10e6 [G] | \u15a7\u0418\u043c\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u15a8 _twistyyyy  \u203a \u041a\u0430\u043a\u043e\u0439 \u0430\u044b\u0432\u0430             \/\/\u10e6 [G] | \u15a7Staff\u15a8 ~explyko  \u203a :33             \/\/\u10e6 [G] | \u15a7unxy\u15a8 bexzsm1slzn \u2714 \u79c1\u3068\u7dd2\u306b\u3044\u3066 \u203a \u0422\u0438\u0448\u0435\u0435             \/\/\u10e6 [G] \u00a78[\u00a7f\u00a7f\u00a7l\u043f\u043f\u043f_IVANBANAN\u00a78] | \u15a7\u0428\u0423\u0422\u15a8 ~koshmarik9090 \u0423\u0442\u043e\u043f\u043b\u0435\u043d\u043d\u0438\u043a \u203a \u042a\u0445\u0430\u043f\u044a\u0445\u0430\u043f\u0445\u044a\u0430 \u043f\u0432\u0430\u043f\u0432\u0430\u043f \u0441\u043d\u044f\u0442\u044b\u0439             \/\/\u10e6 [G] \u00a78[\u00a7f\u00a7f\u00a7oNyak\u00a7e\u00a7oy\u00a78] | \u15a7YouTube\u15a8 HDemonH  \u203a \u0425\u0410\u0425\u0410\u0425 \u043f\u0430\u043f\u0430\u043f \u043e\u0440\u0443 \u0434\u0438\u043c\u0430             \/\/\u10e6 [G] | \u15a7Moder\u15a8 bxmew \u2714 \u79c1\u3068\u7dd2\u306b\u3044\u3066 \u203a \u0414\u043e\u0432\u0435\u043b\u0438             \/\/\u10e6 [L] | \u15a7\u0414\u0435\u043b\u044e\u043a\u0441\u15a8 Oliver_1445  \u203a \u0421\u043a\u0430\u0437\u0430\u043b \u0436\u0435 \u043f\u043e\u043c\u043e\u0433\u0438 \u043c\u043d\u0435 \u0441 \u0434\u0435\u043d\u044c\u0433\u0430\u043c\u0438             \/\/\u10e6 [G] | \u15a7\u0418\u0433\u0440\u043e\u043a\u15a8 wqhtxly Samurai \u203a              {\"mc.vimemc.net\",\"{starterPrefix} [{global}] [{clan}] | \u15a7{rank}\u15a8 {from}  > {message}\",\"survival\"},             {\"mc.vimemc.net\",\"{starterPrefix} [{global}] | \u15a7{rank}\u15a8 {from}  > {message}\",\"survival\"},             {\"mc.vimemc.net\",\"{starterPrefix} [{global}] [{clan}] | \u15a7{rank}\u15a8 {from} {suffix} > {message}\",\"survival\"},             {\"mc.vimemc.net\",\"{starterPrefix} [{global}] | \u15a7{rank}\u15a8 {from} {suffix} > {message}\",\"survival\"},             \/\/ THE PIT             \/\/ingame \/\/[18 \u0443\u0431.] [\u041a\u041e\u041c\u0410\u041d\u0414\u0415\/\u0432\u0441\u0435\u043c] NetTyan \u25ba \u044d\u044d\u043c             {\"mc.vimemc.net\",\"[{rank}] [{team}] {from} > {message}\",\"skywars\"},             {\"mc.vimemc.net\",\"[{rank}] \u15a7{donate}\u15a8 {from} {suffix} > {message}\",\"thepit\"},             {\"mc.vimemc.net\",\"[{rank}] \u15a7{donate}\u15a8 {from}  > {message}\",\"thepit\"},             {\"mc.vimemc.net\",\"[{rank}] {from}  > {message}\",\"thepit\"},             \/\/ SKYWARS             {\"mc.vimemc.net\",\"[{rank}] [{team}] {from} \u21e8 {message}\",\"skywars\"},             {\"mc.vimemc.net\",\"[{rank}] \u15a7{donate}\u15a8 {from} {suffix} > {message}\",\"thepit\"},             {\"mc.vimemc.net\",\"[{rank}] \u15a7{donate}\u15a8 {from}  > {message}\",\"thepit\"},             {\"mc.vimemc.net\",\"[{rank}] {from}  > {message}\",\"thepit\"},             \/\/MURDER MYSTERY nick \u21e8 msg             {\"mc.vimemc.net\",\"\u15a7{donate}\u15a8 {from} {suffix} \u21e8 {message}\",\"murdermystery\"},             {\"mc.vimemc.net\",\"\u15a7{donate}\u15a8 {from} \u21e8 {message}\",\"murdermystery\"},             {\"mc.vimemc.net\",\"{from} \u21e8 {message}\",\"murdermystery\"},              \/\/gamestarting \/\/[18 \u0443\u0431.] NetTyan \u25ba \u044d\u044d\u043c             {\"mc.vimemc.net\",\"[{rank}] {from} > {message}\",\"skywars\"},              \/\/lobby \/\/nick  > msg             {\"mc.vimemc.net\",\"{from}  > {message}\",\"skywars\"},              \/\/funny mc             {\"funnymc.ru\",\"{starterPrefix} {global} ({clan}) [{rank}] {from} \u27af {message}\",\"survival\"},             {\"funnymc.ru\",\"{starterPrefix} {global} ({clan}) {rank} {from} \u27af {message}\",\"survival\"},             {\"funnymc.ru\",\"{starterPrefix} {global} [{rank}] {from} \u27af {message}\",\"survival\"},             {\"funnymc.ru\",\"{starterPrefix} {global} {rank} {from} \u27af {message}\",\"survival\"},               {\"funnymc.ru\",\"{global} ({clan}) [{rank}] {from} \u27af {message}\",\"survival\"},             {\"funnymc.ru\",\"{global} ({clan}) {rank} {from} \u27af {message}\",\"survival\"},             {\"funnymc.ru\",\"{global} [{rank}] {from} \u27af {message}\",\"survival\"},             {\"funnymc.ru\",\"{global} {rank} {from} \u27af {message}\",\"survival\"},               {\"funnymc.ru\",\"[{rank}] {from}  \u00bb {message}\",\"skywars\"},             {\"funnymc.ru\",\"({rank}) {from} > {message}\",\"skywars\"},              {\"funnymc.ru\",\"{from} \u00bb {message}\",\"mudermystery\"},              {\"mc.4obabke.ru\",\"{from} whispers to you: {message}\",\"skywars\"}     };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a \u0441\u043b\u043e\u0432\u0443, \u0441 \u0442\u0430\u043a\u0438\u043c \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u043c \u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c \u0430\u0432\u0442\u043e\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u043c \u043c\u044b \u0434\u0430\u0436\u0435 \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0440\u0435\u0436\u0438\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0433\u0440\u0430\u0435\u043c, \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u0441\u0435\u0440\u0443 \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d! \u041f\u0440\u0430\u0432\u0434\u0430, \u043a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d\u043e \u043f\u043e\u043a\u0430 \u0442\u0430\u043a \u0441\u0435\u0431\u0435.<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044f \u0438\u0437\u0443\u0447\u0438\u043b \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e <a href=\"https:\/\/fabricmc.net\/wiki\/tutorial:mixin_introduction\" rel=\"noopener noreferrer nofollow\">Mixin<\/a> \u0432\u00a0Fabric \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043f\u0430\u0440\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0443\u0434\u0430\u0440\u0438\u0432\u0448\u0435\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u00a0\u0441\u0432\u043e\u044e \u0441\u043c\u0435\u0440\u0442\u044c \u0432\u00a0\u0438\u0433\u0440\u0435. \u041d\u043e\u00a0\u043c\u043e\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0\u0431\u044b\u043b\u0430 \u00ab\u043d\u0430 \u0441\u043a\u043e\u0440\u0443\u044e \u0440\u0443\u043a\u0443\u00bb \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430 \u043a\u0440\u0430\u0439\u043d\u0435 \u043a\u043e\u0440\u044f\u0432\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u0436\u0435 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442. \u041f\u043e\u00a0\u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0437\u0434\u0435\u0441\u044c\u00a0\u0431\u044b\u043b\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441\u00a0\u0442\u0435\u043c, \u0447\u0442\u043e\u00a0\u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0435\u043b\u043e \u0441\u00a0\u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u043c \u043c\u043e\u0434\u043e\u043c, \u0430\u00a0\u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u00a0\u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u00a0\u043d\u0438\u0445\u00a0\u2014 \u0434\u0435\u043b\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u0440\u0435\u0434\u044b \u0434\u043b\u044f\u00a0\u043c\u043e\u0434\u043e\u0432 Fabric \u0432\u00a0\u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435\u00a0\u0431\u044b\u043b\u0438 \u043e\u0447\u0435\u043d\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b, \u0447\u0442\u043e\u00a0\u0437\u0430\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u043c\u0435\u043d\u044f \u043a\u0430\u043a\u2011\u0442\u043e \u00ab\u0432\u044b\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f\u00bb. \u042f \u043e\u0431\u0440\u0430\u0449\u0430\u043b\u0441\u044f \u0434\u0430\u0436\u0435 \u043a\u00a0\u0441\u043f\u0435\u0446\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u043e\u0434\u043e\u0432 \u043d\u0430\u00a0Fabric, \u043e\u043d\u0438 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u00a0\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0447\u0442\u043e\u00a0\u043f\u0440\u0435\u0434\u0432\u0435\u0449\u0430\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043d\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043e\u0442\u043b\u043e\u0436\u0438\u043b \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043a\u0430\u043a\u00a0\u0435\u0441\u0442\u044c.<\/p>\n<p><em>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0431\u043e\u0442 \u043d\u0430\u00a0\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445\u00a0\u2014 \u044d\u0442\u043e \u0432\u0435\u0434\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u0412\u00a0\u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043c\u044b \u0432\u0435\u0434\u044c \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0430\u0433\u0435\u043dn \u0438\u0433\u0440\u0430\u043b \u0432\u00a0\u043c\u0430\u0439\u043d \u043a\u0430\u043a\u00a0\u0447\u0435\u043b\u043e\u0432\u0435\u043a, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0438 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0432\u0435\u0434\u044c \u0442\u0430\u043a \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043a\u0440\u0443\u0447\u0435! (\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 MineRL, \u0447\u0442\u043e\u00a0\u0435\u0441\u0442\u044c \u043d\u0430\u00a0\u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u0430\u0436\u0443\u0442\u0441\u044f \u043c\u043d\u0435 \u0441\u043b\u0430\u0431\u043e\u0432\u0430\u0442\u044b\u043c\u0438 \u0434\u043b\u044f\u00a0\u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0441\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447, \u0434\u043b\u044f\u00a0\u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f\u00a0\u0431\u044b \u0434\u043e\u0436\u0434\u0430\u043b\u0441\u044f \u0432\u044b\u0445\u043e\u0434\u0430 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0432\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0438\u043b\u0438\u00a0\u0441\u0434\u0435\u043b\u0430\u043b\u00a0\u0431\u044b \u0435\u0433\u043e \u0441\u0430\u043c, \u043a\u043e\u0433\u0434\u0430\u2011\u043d\u0438\u0431\u0443\u0434\u044c)<\/em><\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u0447\u0442\u043e\u00a0\u0436\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438? \u0412\u043e\u0443\u2011\u0432\u043e\u0443\u2011\u0432\u043e\u0443! \u042d\u0442\u043e\u00a0\u0436\u0435 \u0441\u0430\u043c\u0430\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u043a\u0438\u0431\u043e\u0440\u0433\u2011\u043c\u0430\u0448\u0438\u043d\u0430\u2011\u0443\u0431\u0438\u0439\u0446\u0430!<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0438\u0444\u043a\u0438 \u0441 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u0438\u0431\u043e\u0440\u0433\u0430-\u0443\u0431\u0438\u0439\u0446\u044b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435\u0440\u043e\u0432<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"SkyWarsBot\" id=\"SkyWarsBot\"><\/a><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u0432\u0441\u0442\u0430\u0432\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u0441\u00a0\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u0431\u043e\u0442\u0430. <\/p>\n<p>\u0420\u0435\u0436\u0438\u043c SkyWars \u0432\u00a0Minecraft \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430 \u0432\u00a0\u043a\u043e\u043b\u0431\u0443 \u043d\u0430\u0434 \u0441\u0432\u043e\u0438\u043c \u043e\u0441\u0442\u0440\u043e\u0432\u043e\u043c. \u041d\u0430\u00a0\u043e\u0441\u0442\u0440\u043e\u0432\u0430\u0445 \u0435\u0441\u0442\u044c \u0441\u0443\u043d\u0434\u0443\u043a\u0438 \u0441\u00a0\u0446\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0433\u0440\u043e\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0440\u0438\u00a0\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u00a0\u043d\u0430\u0447\u0430\u043b\u0435 \u0438\u0433\u0440\u044b \u0431\u043e\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435 \u0442\u0430\u0441\u043a \u0434\u043b\u044f\u00a0\u0440\u0435\u0436\u0438\u043c\u0430 SkyWars, \u0432\u00a0\u043e\u0434\u043d\u0443 \u0438\u0437\u00a0\u0437\u0430\u0434\u0430\u0447 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0438\u0442 \u0434\u043e\u0431\u044b\u0447\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438\u0437\u00a0\u0441\u0443\u043d\u0434\u0443\u043a\u043e\u0432.<\/p>\n<figure class=\"bordered\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/738\/abe\/1f0\/738abe1f0fe9c0fd5ca18d1dd8d1b1ea.gif\" alt=\"\u041d\u0430\u0447\u0430\u043b\u043e \u0438\u0433\u0440\u044b \u0438 \u043b\u0443\u0442\u0430\u043d\u0438\u0435 \u0441\u0443\u043d\u0434\u0443\u043a\u043e\u0432\" title=\"\u041d\u0430\u0447\u0430\u043b\u043e \u0438\u0433\u0440\u044b \u0438 \u043b\u0443\u0442\u0430\u043d\u0438\u0435 \u0441\u0443\u043d\u0434\u0443\u043a\u043e\u0432\" width=\"449\" height=\"253\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/738\/abe\/1f0\/738abe1f0fe9c0fd5ca18d1dd8d1b1ea.gif\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0447\u0430\u043b\u043e \u0438\u0433\u0440\u044b \u0438 \u043b\u0443\u0442\u0430\u043d\u0438\u0435 \u0441\u0443\u043d\u0434\u0443\u043a\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438\u00a0\u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441\u00a0\u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438 \u043a\u0440\u043e\u043c\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 (\u0431\u0440\u043e\u043d\u0438, \u043c\u0435\u0447\u0435\u0439 \u0438\u00a0\u0442.\u00a0\u043f.), \u0447\u0442\u043e\u0431\u044b \u0445\u043e\u0442\u044c \u043a\u0430\u043a\u2011\u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c\u0441\u044f \u0441\u00a0\u0436\u0438\u0432\u044b\u043c\u0438 \u0438\u0433\u0440\u043e\u043a\u0430\u043c\u0438, \u0431\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u0438\u043c\u0438 \u043f\u043b\u044e\u0448\u043a\u0430\u043c\u0438, \u043a\u0430\u043a <abbr class=\"habraabbr\" title=\"\u0412 Minecraft \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u044f\u0431\u043b\u043e\u043a\u0438 \u0434\u0430\u044e\u0442 \u0431\u0443\u0441\u0442 \u043a \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u044e\u0442 \u0435\u0433\u043e \u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e\" data-title=\"&lt;p>\u0412 Minecraft \u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u044f\u0431\u043b\u043e\u043a\u0438 \u0434\u0430\u044e\u0442 \u0431\u0443\u0441\u0442 \u043a \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044f \u0438 \u0443\u0441\u043a\u043e\u0440\u044f\u044e\u0442 \u0435\u0433\u043e \u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e&lt;\/p>&#187; data-abbr=&#187;\u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u044f\u0431\u043b\u043e\u043a\u0438&#187;>\u0437\u043e\u043b\u043e\u0442\u044b\u0435 \u044f\u0431\u043b\u043e\u043a\u0438<\/abbr> \u0438 <abbr class=\"habraabbr\" title=\"\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438 \u0432 Minecraft. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 &quot;\u0431\u0440\u043e\u0441\u0438\u043b \u2013 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f&quot;.\" data-title=\"&lt;p>\u0421\u0440\u0435\u0434\u0441\u0442\u0432\u043e \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0430\u0446\u0438\u0438 \u0432 Minecraft. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 &quot;\u0431\u0440\u043e\u0441\u0438\u043b \u2013 \u0442\u0435\u043b\u0435\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f&quot;.&lt;\/p>&#187; data-abbr=&#187;\u044d\u043d\u0434\u0435\u0440-\u0436\u0435\u043c\u0447\u0443\u0433\u0438&#187;>\u044d\u043d\u0434\u0435\u0440\u2011\u0436\u0435\u043c\u0447\u0443\u0433\u0438<\/abbr>.<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/463\/243\/840\/46324384069944299e5e54210886239f.gif\" alt=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043e\u043b\u043e\u0442\u043e\u0433\u043e \u044f\u0431\u043b\u043e\u043a\u0430 \u0438 \u044d\u043d\u0434\u0435\u0440-\u0436\u0435\u043c\u0447\u0443\u0433\u0430 \u0434\u043b\u044f \u043d\u0430\u043f\u0430\u0434\u0435\u043d\u0438\u044f\" title=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043e\u043b\u043e\u0442\u043e\u0433\u043e \u044f\u0431\u043b\u043e\u043a\u0430 \u0438 \u044d\u043d\u0434\u0435\u0440-\u0436\u0435\u043c\u0447\u0443\u0433\u0430 \u0434\u043b\u044f \u043d\u0430\u043f\u0430\u0434\u0435\u043d\u0438\u044f\" width=\"553\" height=\"514\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/463\/243\/840\/46324384069944299e5e54210886239f.gif\"\/><\/p>\n<div><figcaption>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043e\u043b\u043e\u0442\u043e\u0433\u043e \u044f\u0431\u043b\u043e\u043a\u0430 \u0438 \u044d\u043d\u0434\u0435\u0440\u2011\u0436\u0435\u043c\u0447\u0443\u0433\u0430 \u0434\u043b\u044f\u00a0\u043d\u0430\u043f\u0430\u0434\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0438 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043a\u0446\u0438\u0438 \u0431\u043e\u0442\u0430 \u043d\u0430\u00a0\u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0434\u0435\u043b\u0430\u044e\u0442 \u0441\u0432\u043e\u0451 \u0434\u0435\u043b\u043e\u00a0\u2014 \u0431\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u043f\u043e\u0431\u0435\u0436\u0434\u0430\u0442\u044c \u0432\u00a0\u0431\u043e\u044e \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043b\u044e\u0434\u0435\u0439 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0441\u00a0\u043d\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u044b!<\/p>\n<figure class=\"bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f83\/1ff\/61c\/f831ff61cf2cdd8d5b68b10e8dd9a8a5.gif\" alt=\"\u041f\u043e\u0431\u0435\u0434\u0430 \u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0438 \u0441\u0431\u043e\u0440 \u0432\u044b\u043f\u0430\u0432\u0448\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432\" title=\"\u041f\u043e\u0431\u0435\u0434\u0430 \u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0438 \u0441\u0431\u043e\u0440 \u0432\u044b\u043f\u0430\u0432\u0448\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432\" width=\"553\" height=\"514\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f83\/1ff\/61c\/f831ff61cf2cdd8d5b68b10e8dd9a8a5.gif\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0431\u0435\u0434\u0430 \u043d\u0430\u0434 \u0438\u0433\u0440\u043e\u043a\u043e\u043c \u0438 \u0441\u0431\u043e\u0440 \u0432\u044b\u043f\u0430\u0432\u0448\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u044c\u0441\u044f \u043a\u00a0\u0438\u0433\u0440\u043e\u043a\u0443, \u043d\u0443\u0436\u043d\u043e \u0443\u043c\u0435\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0435 \u043e\u0440\u0443\u0436\u0438\u0435. \u0412\u00a0Minecraft \u044d\u0442\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043b\u0443\u043a. \u0412\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u043e\u043d\u0443\u0441\u0430 \u044f \u043d\u0430\u0443\u0447\u0438\u043b \u0431\u043e\u0442\u0430 \u0441\u0442\u0440\u0435\u043b\u044f\u0442\u044c \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u00a0\u043a\u0440\u0430\u0442\u0447\u0430\u0439\u0448\u0435\u0439 \u043f\u0430\u0440\u0430\u0431\u043e\u043b\u0435, \u043d\u043e\u00a0\u0438 \u043d\u0430\u0432\u0435\u0441\u043e\u043c. \u0422\u0430\u043a\u0430\u044f <strong>\u0430\u0440\u0442\u0438\u043b\u043b\u0435\u0440\u0438\u044f<\/strong> \u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0435\u043f\u043e\u0434\u043d\u0435\u0441\u0451\u0442 \u0438\u0433\u0440\u043e\u043a\u0430\u043c, \u0441\u043f\u0440\u044f\u0442\u0430\u0432\u0448\u0438\u043c\u0441\u044f \u0433\u0434\u0435\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0437\u0430\u00a0\u0433\u043e\u0440\u043e\u0439, <strong>\u043d\u0435\u0436\u0434\u0430\u043d\u0447\u0438\u043a<\/strong>, \u043d\u0435\u00a0\u0433\u043e\u0432\u043e\u0440\u044f \u0443\u0436\u0435 \u043e\u00a0\u0442\u043e\u043c, \u0447\u0442\u043e\u00a0\u0437\u0430\u00a0\u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0442\u0430\u043a\u0442\u0438\u043a\u0430\u043c\u0438 \u0431\u043e\u044f \u0437\u0440\u0438\u0442\u0435\u043b\u044f\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d66\/1a8\/e3a\/d661a8e3a5cfa7f89d46c95d677fa3e4.gif\" alt=\"\u0421\u0442\u0440\u0435\u043b\u044c\u0431\u0430 \u0438\u0437 \u043b\u0443\u043a\u0430\" title=\"\u0421\u0442\u0440\u0435\u043b\u044c\u0431\u0430 \u0438\u0437 \u043b\u0443\u043a\u0430\" width=\"715\" height=\"419\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d66\/1a8\/e3a\/d661a8e3a5cfa7f89d46c95d677fa3e4.gif\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0440\u0435\u043b\u044c\u0431\u0430 \u0438\u0437\u00a0\u043b\u0443\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c, \u0438\u043c\u0435\u044f \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u0430\u043c \u0438\u0433\u0440\u0430\u0442\u044c \u0438 \u0434\u0430\u0436\u0435 \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0442\u044c (\u043e\u043a\u043e\u043b\u043e 5\u00a0\u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043f\u043e\u0431\u0435\u0434 \u043d\u0430 100\u00a0\u0438\u0433\u0440 <span class=\"habrahidden\">[\u0438\u0441\u0442\u0435\u0440\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043c\u0435\u0445]<\/span>) \u0432\u00a0\u0440\u0435\u0436\u0438\u043c\u0435 SkyWars Minecraft \u0445\u043e\u0442\u044f\u00a0\u0431\u044b \u043d\u0430\u00a0\u043e\u0434\u043d\u043e\u043c \u0438\u0437\u00a0\u043d\u0435\u043c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a\u00a0\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0430\u0432\u0430\u0442\u0430\u0440\u0443 \u0438 \u0441\u0432\u044f\u0437\u0443\u044e\u0449\u0435\u043c\u0443 \u0437\u0432\u0435\u043d\u0443 \u043c\u0435\u0436\u0434\u0443 Minecraft \u0438 Python\u2011\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c.<\/p>\n<p><a class=\"anchor\" name=\"MCMapCaptchaSolver\" id=\"MCMapCaptchaSolver\"><\/a><\/p>\n<p>\u0412\u0430\u0436\u043d\u043e \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e\u00a0\u0434\u043b\u044f\u00a0\u0437\u0430\u0445\u043e\u0434\u0430 \u043d\u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440 Minecraft, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043d\u0435\u043c\u043e\u0434\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0439, \u0438\u0437\u2011\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u043e\u0442\u043e\u0432\u043e\u0434\u043e\u0432 \u043d\u0430\u00a0\u043d\u0451\u043c (\u0432\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0445, \u0430\u00a0\u043d\u0435\u00a0\u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445, \u043a\u0430\u043a\u00a0\u0443\u00a0\u043d\u0430\u0441) \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u00a0\u0431\u044b\u043b\u043e <strong>\u0432\u0432\u043e\u0434\u0438\u0442\u044c \u043a\u0430\u043f\u0447\u0443<\/strong>. \u041a\u00a0\u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0430\u00a0\u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u0436\u0435 <strong>\u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e<\/strong> \u0442. \u043a. \u0442\u0430\u043c \u0441\u043c\u0435\u043d\u0438\u043b\u0438 \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u043a\u0430\u043f\u0447\u0443 \u0432\u00a0\u0432\u0438\u0434\u0435 <abbr class=\"habraabbr\" title=\"\u041a\u0430\u043f\u0447\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u0440\u0442\u044b Minecraft\" data-title=\"&lt;p>\u041a\u0430\u043f\u0447\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043a\u0430\u0440\u0442\u044b Minecraft&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/88a\/439\/6ea\/88a4396ea8a1c992a1229fb56f683024.png&#187; data-abbr=&#187;\u043a\u0430\u0440\u0442\u044b&#187; data-image-width=&#187;973&#8243; data-image-height=&#187;878&#8243;>\u043a\u0430\u0440\u0442\u044b<\/abbr> \u043d\u0430\u00a0\u043e\u0447\u0435\u043d\u044c \u0442\u044f\u0436\u0435\u043b\u0443\u044e \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e, \u0442\u0435\u043c \u043d\u0435\u00a0\u043c\u0435\u043d\u0435\u0435 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u043f\u044b\u0442\u0430, \u043a\u0430\u043a\u00a0\u044f \u0440\u0435\u0448\u0430\u043b \u044d\u0442\u043e\u0442 \u043a\u0435\u0439\u0441 \u043d\u0430\u00a0\u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u043c\u0435\u044f \u043f\u043e\u00a0\u0441\u0443\u0442\u0438 0\u00a0\u0437\u043d\u0430\u043d\u0438\u0439 \u0432\u00a0\u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0432\u043e\u043c DL \u0438 Tensorflow. \u0412\u00a0\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0435 \u043d\u0438\u0436\u0435 \u044f \u0440\u0430\u0441\u043a\u0440\u043e\u044e \u0434\u0435\u0442\u0430\u043b\u0438 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0434\u043e\u043e\u0431\u0443\u0447\u0430\u043b Tensorflow OCR \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u2011\u043a\u0430\u043f\u0447\u0443. \u0410 \u0435\u0449\u0451 \u044f \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u0430\u043f\u043b\u043e\u0430\u0434\u043d\u0443\u043b \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u043d\u0430 <a href=\"https:\/\/huggingface.co\/spaces\/3ndetz\/mc_map_resolver\" rel=\"noopener noreferrer nofollow\">\u0445\u0433 \u0441\u043f\u0435\u0439\u0441<\/a> \u0438 <a href=\"https:\/\/github.com\/3ndetz\/MapResolverMC\" rel=\"noopener noreferrer nofollow\">github<\/a>, \u0442\u0430\u043a \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438 \u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c.<\/p>\n<details class=\"spoiler\">\n<summary>MinecraftMapCaptchaSolver.useless<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u043f\u0447\u0438, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e:<\/p>\n<ol>\n<li>\n<p>\u0421\u043e\u0431\u0440\u0430\u0442\u044c \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0438\u0437\u00a0\u043c\u0438\u043d\u0438\u043c\u0443\u043c 1000\u00a0\u043a\u0430\u043f\u0447<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u0443\u0447\u0438\u0442\u044c\/\u0434\u043e\u043e\u0431\u0443\u0447\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430\/\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043d\u0430\u00a0\u043d\u0438\u0445<\/p>\n<\/li>\n<li>\n<p>\u0412\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u0432\u00a0\u0438\u0433\u0440\u0443 (\u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435)<\/p>\n<\/li>\n<\/ol>\n<details class=\"spoiler\">\n<summary>\u041c\u0443\u0442\u0438\u043c \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 (Java)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u0441\u0430\u043c\u0438\u043c \u043a\u0430\u0440\u0442\u0430\u043c \u0438\u0437\u00a0\u0438\u0433\u0440\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u0430\u0440\u0442\u0443 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0432\u0438\u0434\u0435 (Java)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f\u00a0\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u043a\u043e\u0434\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0448\u0442\u0443\u043a\u0435\u043d\u0446\u0438\u044e \u043a\u0430\u043a\u00a0Mixin Accessor (\u0440\u0430\u043d\u0435\u0435 \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u0438\u00a0\u043a\u043e\u0434\u0435 Java\u2011\u0447\u0430\u0441\u0442\u0438), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u00a0\u043e\u0431\u044a\u0435\u043a\u0442\u0443 \u043a\u0430\u0440\u0442\u044b \u0438\u0437\u00a0\u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u043c\u0438\u0440\u0430 Minecraft.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u0430\u0440\u0442\u0430\u043c (Java)<\/summary>\n<div class=\"spoiler__content\">\n<p>MapTextureAccessor.java<\/p>\n<pre><code class=\"java\">package adris.altoclef.mixins;  import net.minecraft.client.render.MapRenderer; import net.minecraft.client.texture.NativeImageBackedTexture; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor;  @Mixin(MapRenderer.MapTexture.class) public interface MapTextureAccessor {      @Accessor(\"texture\")     NativeImageBackedTexture getNativeImage(); }<\/code><\/pre>\n<p>MapRendererInvoker.java<\/p>\n<pre><code class=\"java\">package adris.altoclef.mixins;  import net.minecraft.client.render.MapRenderer; import net.minecraft.client.texture.TextureManager; import net.minecraft.item.map.MapState; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.gen.Accessor; import org.spongepowered.asm.mixin.gen.Invoker;  @Mixin(MapRenderer.class) public interface MapRendererInvoker {      @Invoker(\"getMapTexture\")     MapRenderer.MapTexture invokeGetMapTexture(int id, MapState state); }<\/code><\/pre>\n<p>\u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0432\u043d\u043e\u0441\u0438\u043c \u0432 resources, assets altoclef.mixins.json \u0432 client-\u0447\u0430\u0441\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0437\u0430\u0431\u044b\u043b \u043f\u0440\u043e \u043d\u0438\u0445 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435.<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043a\u043e\u0434\u0438\u043c \u0441\u0435\u0431\u0435 \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u0430 \u0441\u00a0\u043a\u0443\u0447\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438\u00a0\u0440\u0430\u0431\u043e\u0442\u0435 \u0441\u00a0\u043a\u0430\u0440\u0442\u0430\u043c\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 MapItemHelper.java<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">package adris.altoclef.util.helpers;  import adris.altoclef.AltoClef; import adris.altoclef.Debug; import adris.altoclef.util.ImageComparer; import net.minecraft.client.MinecraftClient; import net.minecraft.item.FilledMapItem; import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.item.map.MapState; import net.minecraft.client.render.MapRenderer;  import adris.altoclef.mixins.MapRendererInvoker; import adris.altoclef.mixins.MapTextureAccessor; import adris.altoclef.mixins.ScreenshotRecorderInvoker;  import net.minecraft.client.texture.NativeImage; import net.minecraft.util.Util;  import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;   public class MapItemHelper {     public static String saveNonExistMapToDataset(AltoClef mod){         return saveNonExistMapToDataset(mod,false);     }     public static String saveNonExistMapToDataset(AltoClef mod, boolean neural_solve){         ItemStack item = ItemHelper.getHandItem(mod);         if (item != null){             return saveNonExistMapToDataset(item, mod, neural_solve);         }         return \"\";     }     public static String saveNonExistMapToDataset(ItemStack stack, AltoClef mod) {         return saveNonExistMapToDataset(stack, mod, false);     }     public static String saveNonExistMapToDataset(ItemStack stack, AltoClef mod, boolean neural_solve) {         \/\/Debug.logMessage(\"itemstack\"+stack.getName()+stack.isOf(Items.FILLED_MAP));         if(stack.isOf(Items.FILLED_MAP)){              Integer mapId = FilledMapItem.getMapId(stack);             MapState mapState = FilledMapItem.getMapState(mapId, mod.getWorld());             if (mapState != null){                 String saveResult = saveMapFile(mod, mapId,mapState, neural_solve);                 \/\/Debug.logMessage(\"\"+saveResult);                 return saveResult;             }         }         return \"\";     }      public static String saveMapFile(AltoClef mod, Integer mapId, MapState mapState, boolean neural_solve){         File screensDir = new File(MinecraftClient.getInstance().runDirectory,\"map_screenshots\");         screensDir.mkdir();         MapRenderer.MapTexture map_texture = ((MapRendererInvoker)MinecraftClient.getInstance().gameRenderer.getMapRenderer()).invokeGetMapTexture(mapId, mapState);         \/\/Debug.logMessage(\"map texture\"+map_texture);         File screenshot = ScreenshotRecorderInvoker.invokeGetScreenshotFileName(screensDir);         \/\/Debug.logMessage(\"screenshotFile\"+screenshot.getAbsolutePath()+\" choo \"+screenshot.getName());         NativeImage img = ((MapTextureAccessor)map_texture).getNativeImage().getImage();         String check_result = \"\";         try {             byte[] bytes_img = img.getBytes();               check_result = ImageComparer.checkBytesImageInDataset(bytes_img);              if (check_result == \"\") {                  if(neural_solve){                     mod.getInfoSender().onCaptchaSolveRequest(bytes_img);                 }                 else {                     saveImageFile(bytes_img, screenshot);                 }             }else{                 if(check_result.equals(\"black.png\")){                     Debug.logMessage(\"[CAPTCHA NOT LOADED] BLACK FILE!!! = '\" + check_result + \"'\");                     check_result = \"\";                  } else if(check_result.length()>9){ \/\/\"44235.png\"                     Debug.logMessage(\"[CAPTCHA NOT TOO LONG FILENAME!!! = \"+check_result);                     check_result = \"\";                  }                 else {                     Debug.logMessage(\"[CAPTCHA FOUND] FILE EXISTS = '\" + check_result + \"'\");                 }                 return check_result;             }         }catch (Exception e){             e.printStackTrace();             Debug.logMessage(\"ERR WHEN CHECHING CAPTCHA!!!!!\"+e.toString());         }         return \"\";     }     public static void saveImageFile(byte[] bytes_img, File screenshot){         Util.getIoWorkerExecutor().execute(() -> {             try {                 BufferedImage buffered_img = ImageComparer.byte2BufferedImage(bytes_img);                 ImageIO.write(buffered_img,\"png\",screenshot);                 Debug.logMessage(\"[CAPTCHA] IMAGE SAVED! Name=\"+screenshot.getName());                 \/\/((MapTextureAccessor) map_texture).getNativeImage().getImage().writeTo(screenshot);                 \/\/Text text = (new LiteralText(screenshot.getName())).formatted(Formatting.UNDERLINE, Formatting.GREEN).styled((style) -> {                 \/\/    return style.withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_FILE, screenshot.getAbsolutePath()));                 \/\/});                 \/\/Debug.logMessage(\"IMAGE SAVED!\");                 \/\/MinecraftClient.getInstance().player.sendMessage(new TranslatableText(\"map_saver.success\", \"Map #\" + mapId, text), false); \/\/             } catch (IOException e) {                 e.printStackTrace();             } \/\/         });     } } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u0418\u0442\u0430\u043a, \u043a\u043e\u0433\u0434\u0430 \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0443\u0434\u043e\u0431\u043d\u043e\u0433\u043e \u00ab\u0447\u0442\u0435\u043d\u0438\u044f\u00bb \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u0430\u0440\u0442, \u0437\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u0441\u0431\u043e\u0440\u043e\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430. \u0412\u00a0\u0442\u043e\u043c\u00a0\u0436\u0435 Java \u043d\u0430\u043a\u043e\u0434\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0435\u0433\u043e \u0441\u0431\u043e\u0440\u0430. \u041f\u043e\u043f\u0443\u0442\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u043c \u0442\u0443\u0434\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u043e\u00a0\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044e \u043a\u0430\u043f\u0447\u0438 (\u043f\u043e\u043a\u0430 \u0447\u0442\u043e\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u00ab\u0445\u043e\u043b\u043e\u0441\u0442\u044b\u0435\u00bb \u043c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u0437\u0436\u0435).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 Butler.java\/captchaActionsPerform<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"java\">    private void captchaActionsPerform(){         if (_captchaTimer.elapsed()) {             _captchaTimer.reset();             Perspective old_perspective = null;             if(CaptchaSolvingMode.equals(\"GET_DATASET\")) { \/\/\"SOLVE_MAXIMUM\"; \/\/GET_DATASET SOLVE_DATASET_ONLY                  stuck_fix_butler_allow = false;                 \/\/_mod.getCommandExecutor().execute(\"@test killall\");                 Debug.logMessage(\"\u041a\u0410\u041f\u0427\u0410 \u0421\u0411\u041e\u0420 \u0414\u0410\u0422\u0410\u0421\u0415\u0422\u0410!\");                 old_perspective = MinecraftClient.getInstance().options.getPerspective();                 MinecraftClient.getInstance().options.setPerspective(Perspective.FIRST_PERSON);                 MapItemHelper.saveNonExistMapToDataset(_mod);                 \/\/_mod.getCommandExecutor().execute(\"@idle\");                 this.reJoin(3000, _mod);                 \/\/DeathMenuChain.disconnect(MinecraftClient.getInstance());             }else if(CaptchaSolvingMode.contains(\"SOLVE\")){                  Debug.logMessage(\"\u041a\u0410\u041f\u0427\u0410 \u0420\u0415\u0428\u0415\u041d\u0418\u0415 \u0420\u0415\u0416\u0418\u041c = \"+CaptchaSolvingMode);                 old_perspective = MinecraftClient.getInstance().options.getPerspective();                 MinecraftClient.getInstance().options.setPerspective(Perspective.FIRST_PERSON);                 boolean neural_captcha_solve = false;                 if(CaptchaSolvingMode.equals(\"SOLVE_MAXIMUM\") &amp;&amp; _mod.getInfoSender().IsCallbackServerStarted()) {                     neural_captcha_solve = true;                 }                 String captchaImageFilename = MapItemHelper.saveNonExistMapToDataset(_mod, neural_captcha_solve);                 String captcha_solving = \"\";                 if (captchaImageFilename.isBlank()){ \/\/ Checks if a String is whitespace, empty (\"\") or null.                     Debug.logMessage(\"\u041a\u0410\u041f\u0427\u0410 \u041d\u0415 \u041d\u0410\u0419\u0414\u0415\u041d\u0410 \u0412 \u0414\u0410\u0422\u0410\u0421\u0415\u0422\u0415!\");                     if(neural_captcha_solve){                         Debug.logMessage(\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432 \u0438\u043d\u0444\u043e \u0441\u0435\u043d\u0434\u0435\u0440!!\");                         \/\/INFO SENDER                         \/\/captcha_solving = AltoClef.getInfoSender().getCaptchaSolving...                         return;                     }else {                         Debug.logMessage(\"\u0412\u042b\u0414\u0410\u0415\u041c \u0420\u0410\u041d\u0414\u041e\u041c\u041d\u042b\u0419 \u041d\u041e\u041c\u0415\u0420!\");                         \/\/\u0435\u0441\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043b\u0438 \u0432 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u043d\u0435 \u0440\u0435\u0448\u0435\u043d\u043e \u0442\u043e \u0444\u0438\u0433\u0430\u0447 \u0440\u0430\u043d\u0434\u043e\u043c \u043e\u0442 1000 \u0434\u043e 99999                         captcha_solving = Integer.toString((ThreadLocalRandom.current().nextInt(1000, 99999 + 1))); \/\/(min, max + 1);                     }                 }else{                     \/\/captcha_solving = captchaImageFilename.split(\"\\\\.\")[0];                     captcha_solving = captchaImageFilename.split(Pattern.quote(\".\"))[0].split(Pattern.quote(\"_\"))[0];                 }                  if (!captcha_solving.isEmpty()) { \/\/Checks if a String is empty (\"\") or null.                     Debug.logMessage(\"\u0412\u0412\u041e\u0414 \u041a\u0410\u041f\u0427\u0418 \/ ENTERING SOLVED CAPTCHA =\"+captcha_solving);                     _mod.getMessageSender().enqueueChat(captcha_solving, MessagePriority.TIMELY);                 }                  if (old_perspective != null){                     MinecraftClient.getInstance().options.setPerspective(old_perspective);                 }             }         }else{             Debug.logMessage(\"\u041a\u0410\u041f\u0427\u0410 \u0423\u0416\u0415 \u0420\u0415\u0428\u0410\u0415\u0422\u0421\u042f!\");         }     } <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0448\u0432\u044b\u0440\u044f\u0435\u043c \u043d\u0430\u0448 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0432\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u043f\u0440\u044f\u043c \u0442\u0430\u043a, \u043c\u044b\u00a0\u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u043d\u0430\u0433\u043b\u044b\u0435)!<\/p>\n<pre><code class=\"java\">if (msg.contains(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u0430\u043f\u0447\u0443 \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432 \u0447\u0430\u0442\")) {                 this.captchaActionsPerform();                                                     }<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u0440\u0443 \u043c\u0435\u043b\u043e\u0447\u0435\u0439 \u0432\u00a0\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043a\u0430\u043f\u0447\u0438 (\u043d\u0443 \u0442\u0443\u0442 \u043a\u043e\u0434\u0430 \u043d\u0435\u00a0\u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u044f \u0438 \u043d\u0430\u00a0\u0442\u0430\u043a\u0438\u0435 \u0432\u0435\u0449\u0438 \u0431\u0443\u0434\u0443 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u0434, \u0443\u00a0\u043d\u0430\u0441 \u0441\u00a0\u0432\u0430\u043c\u0438 \u0441\u0442\u0430\u0442\u044c\u044f \u0432\u044b\u0439\u0434\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0441\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0421\u0430\u043d\u0442\u0430\u2011\u0411\u0430\u0440\u0431\u0430\u0440\u044b).<\/p>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u043f\u0435\u0440\u0435\u0437\u0430\u0439\u0442\u0438 \u043d\u0430\u00a0\u0441\u0435\u0440\u0432\u0435\u0440 \u0440\u0430\u0437 \u0442\u0430\u043a \u043f\u0430\u0440\u0443 \u0442\u044b\u0441\u044f\u0447&#8230;<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043a\u0430\u043f\u0447\u0438 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u043e\u0442\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c.<\/p>\n<figure class=\"float bordered full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f6\/257\/562\/7f62575623121fa6dd7c23d41135b1ee.png\" alt=\"\u041d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043f\u0447\u0438\" title=\"\u041d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043f\u0447\u0438\" width=\"587\" height=\"490\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f6\/257\/562\/7f62575623121fa6dd7c23d41135b1ee.png\"\/><\/p>\n<div><figcaption>\u041d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043f\u0447\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0435 \u043f\u0430\u0440\u0443 \u0441\u0435\u043a\u0443\u043d\u0434 \u0432\u00a0\u043f\u0430\u043f\u043a\u0435 \u0441\u00a0\u043a\u0430\u043f\u0447\u0430\u043c\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u0430\u044f, \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0435\u0451 \u0432\u00a0\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c. \u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0430\u0440\u0443 \u0442\u044b\u0441\u044f\u0447 \u0440\u0430\u0437.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0438\u043a\u0447\u0430 \u0443\u00a0\u043a\u0430\u043f\u0447\u0438 \u0434\u0440\u0443\u0433\u0430\u044f, \u043d\u043e\u00a0\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u043e\u0435\u00a0\u0436\u0435\u00a0\u2014 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u0438\u043f\u0438\u0441\u043a\u0443 \u00ab_N\u00bb (\u0433\u0434\u0435 N\u00a0\u2014 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f) \u043a\u00a0\u0444\u0430\u0439\u043b\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/4e9\/56c\/674\/4e956c6748ab713150ba1c71ce010735.jpg\" alt=\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043f\u0447\u0438\" title=\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043f\u0447\u0438\" width=\"574\" height=\"352\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4e9\/56c\/674\/4e956c6748ab713150ba1c71ce010735.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u043f\u0447\u0438<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u0435\u0433\u043e\u00a0\u0431\u044b\u043b\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043e 1390\u00a0\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043d\u0430\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0448\u043b\u043e \u043e\u043a\u043e\u043b\u043e \u043d\u0435\u0434\u0435\u043b\u0438 \u0438 \u0437\u0430\u00a0\u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u043d\u043e\u0432 \u043d\u0430\u00a0\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445. \u0418\u0442\u0430\u043a, \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0435\u0441\u0442\u044c, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043e\u0431\u0443\u0447\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0443!<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0433\u043e \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<ul>\n<li>\n<p>100\u00a0\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a (\u0434\u043e\u043b\u0436\u043d\u043e\u00a0\u0431\u044b\u0442\u044c 10% \u043e\u0442\u00a0\u043e\u0431\u0449\u0438\u0445 1389, \u043d\u043e\u00a0\u043c\u044b\u00a0\u0436\u0435 \u043b\u044e\u0431\u0438\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0435 \u0447\u0438\u0441\u043b\u0430) \u043e\u0442\u0434\u0435\u043b\u044f\u0435\u043c \u043e\u0442\u00a0\u043e\u0431\u0449\u0435\u0433\u043e \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0430 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u043b\u044f\u00a0\u043d\u0435\u043f\u0440\u0435\u0434\u0432\u0437\u044f\u0442\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 1290\u00a0\u043d\u0435\u0449\u0430\u0434\u043d\u043e \u043e\u0442\u0434\u0430\u0451\u043c \u043d\u0430\u00a0\u043a\u043e\u0440\u043c \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435&#8230;<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u0434\u043e \u0440\u0435\u0448\u0438\u0442\u044c, \u0447\u0442\u043e\u00a0\u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0443\u0447\u0430\u0442\u044c. \u041d\u0430\u00a0\u0433\u043b\u0430\u0437\u0430 \u043c\u043d\u0435 \u0442\u043e\u0433\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u043a\u0441\u0442\u0430\u0442\u0438 \u043f\u043e\u043f\u0430\u043b\u0430\u0441\u044c <a href=\"https:\/\/habr.com\/ru\/articles\/673440\/\" rel=\"noopener noreferrer nofollow\">\u044d\u0442\u0430<\/a> \u0441\u0442\u0430\u0442\u044c\u044f. \u0422\u0430\u043c \u0430\u0432\u0442\u043e\u0440 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043b \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u043a\u0430\u043f\u0447\u0443 \u043d\u0430\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 VK \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e Tensorflow Keras OCR.<\/p>\n<p>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0437\u0430\u00a0\u043e\u0441\u043d\u043e\u0432\u0443 \u044f \u0431\u0440\u0430\u043b \u043a\u043e\u0434 <a href=\"https:\/\/habr.com\/ru\/users\/SuperHackerVk\/\" rel=\"noopener noreferrer nofollow\">\u0430\u0432\u0442\u043e\u0440\u0430<\/a>, \u0430\u00a0\u0432\u00a0\u0441\u0432\u043e\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u043f\u0440\u043e\u0441\u0442\u043e \u0430\u0434\u0430\u043f\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043e\u0434\u00a0\u043d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u043f\u0447\u0438\u00a0\u2014 128\u00d7128, \u043d\u043e\u00a0\u043f\u043e\u00a0\u0438\u0442\u043e\u0433\u0443 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0432\u00a0\u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0435. \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432:<\/p>\n<pre><code class=\"python\">characters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']<\/code><\/pre>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0433\u043e\u0442\u043e\u0432\u0438\u043b \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u043e\u0434\u00a0\u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u00a0\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043d\u044b\u043c\u0438 \u043a\u0430\u043f\u0447\u0430\u043c\u0438, \u043d\u043e\u00a0\u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435\u00a0\u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u043c\u043d\u0435 \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0448\u0435 50%, \u0447\u0442\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0441\u0432\u044f\u0437\u0430\u043d\u043e, \u0441\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439 \u0441\u0430\u043c\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0418\u0418 \u043c\u043e\u0434\u0435\u043b\u0438, \u0430\u00a0\u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0435\u0451 \u0444\u043e\u0440\u043c\u0435 \u044f \u043d\u0435\u00a0\u0445\u043e\u0442\u0435\u043b (\u0431\u0443\u0434\u0442\u043e\u00a0\u0431\u044b \u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0435\u043b, \u0447\u0442\u043e\u00a0\u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0444\u0438\u0433\u043d\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u00a0\u0441\u043a\u043e\u0440\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0442\u0430\u043d\u0435\u0442 \u043d\u0435\u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439, \u043a\u0430\u043a\u00a0\u044d\u0442\u043e \u0438 \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c).<\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0b9\/718\/685\/0b97186855c5ff325e7748507f4777dd.png\" alt=\"\u0420\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f\" title=\"\u0420\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f\" width=\"830\" height=\"745\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b9\/718\/685\/0b97186855c5ff325e7748507f4777dd.png\"\/><\/p>\n<div><figcaption>\u0420\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u043d\u0430 1300\u00a0\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0438 100\u00a0\u044d\u043f\u043e\u0445 \u0443\u0445\u043e\u0434\u0438\u043b\u043e \u043f\u0430\u0440\u0443 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u043c\u0438\u043d\u0443\u0442, \u044f \u0440\u0435\u0448\u0438\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0443\u0442\u0451\u043c\u00a0\u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e\u00a0\u043f\u043e\u043d\u0438\u0437\u0438\u0442 \u043b\u043e\u0441\u0441 \u0438 \u043f\u043e\u0432\u044b\u0441\u0438\u0442 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<p>\u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0431\u043b\u044e\u0434\u0435\u043d\u0438\u044f \u0437\u0430\u00a0\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u043f\u043e\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f 70\u00d750, \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438\u00a0\u043c\u0435\u043d\u044c\u0448\u0435\u00a0\u2014 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0448\u0432\u044b\u0440\u044f\u0442\u044c\u0441\u044f \u043b\u043e\u0441\u0441.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u044d\u043f\u043e\u0445 (epochs) \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e 100. \u0411\u043e\u043b\u044c\u0448\u0435 \u043c\u043e\u0436\u043d\u043e, \u043d\u043e\u00a0\u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c, \u043c\u0435\u043d\u044c\u0448\u0435\u00a0\u2014 \u043d\u0435\u0434\u043e\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u044b\u0432\u0430\u043b\u0430\u0441\u044c, \u0438 \u0442\u043e \u0438 \u0442\u043e \u0443\u0445\u0443\u0434\u0448\u0430\u043b\u043e \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u00a0\u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u0434\u0430\u0442\u0430\u0441\u0435\u0442\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0431\u0430\u0442\u0447\u0435\u0439 (batch_size)\u00a0\u2014 16<\/p>\n<p>\u041a\u0430\u043a\u00a0\u044d\u0442\u043e \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u043f\u0440\u0438\u00a0\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0438 \u0442\u043e\u0436\u0435 \u0432\u043b\u0438\u044f\u043b\u043e, \u043f\u0440\u0438\u0447\u0435\u043c \u043d\u0435\u00a0\u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u00a0\u043f\u043b\u043e\u0445\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443, \u0438 \u0437\u0430\u00a0\u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c \u0442\u043e\u0436\u0435 \u043d\u0435\u00a0\u043f\u043e\u0441\u0447\u0438\u0442\u0430\u0442\u044c\u00a0\u2014 \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u043b\u0438\u044f\u043b\u043e \u043d\u0430 10\u201320%.<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0434\u0431\u0438\u0449\u0435 (\u043f\u043e\u043c\u043e\u0439\u043a\u0430) \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041c\u043e\u0434\u0435\u043b\u0438 \u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u043b \u0432\u00a0\u043f\u0430\u043f\u043a\u0438 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u0438\u0445 \u043a\u0430\u043a\u00a0\u043f\u043e\u043f\u0430\u0434\u0430\u043b\u043e\u0441\u044c. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u00a0\u043d\u0438\u0445 (\u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0434\u043e 1000\u00a0\u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a8\/330\/a78\/6a8330a78f77350e70694eb2527e6dbe.png\" alt=\"\u041d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b. \u0424\u043e\u0440\u043c\u0430\u0442: \u2116, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\" title=\"\u041d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b. \u0424\u043e\u0440\u043c\u0430\u0442: \u2116, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\" width=\"598\" height=\"343\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6a8\/330\/a78\/6a8330a78f77350e70694eb2527e6dbe.png\"\/><\/p>\n<div><figcaption>\u041d\u0435\u0443\u0434\u0430\u0447\u043d\u044b\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b. \u0424\u043e\u0440\u043c\u0430\u0442: \u2116, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u043e\u0442 \u043c\u043e\u0434\u0435\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0448\u0435, \u043a\u043e\u0433\u0434\u0430 \u044f \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u043b \u0442\u0440\u0435\u0439\u043d-\u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0438 \u0443\u0436\u0435 \u043d\u0430\u0447\u0430\u043b \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2e0\/d83\/4c6\/2e0d834c6a05252e5c16aa08483905f6.png\" alt=\"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b. \u0424\u043e\u0440\u043c\u0430\u0442: \u2116, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\" title=\"\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b. \u0424\u043e\u0440\u043c\u0430\u0442: \u2116, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b\" width=\"633\" height=\"207\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2e0\/d83\/4c6\/2e0d834c6a05252e5c16aa08483905f6.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b. \u0424\u043e\u0440\u043c\u0430\u0442: \u2116, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a \u0434\u043b\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f, \u0438\u0442\u043e\u0433\u043e\u0432\u0430\u044f \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/figcaption><\/div>\n<\/figure>\n<p>.<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0434\u043e\u0431\u0438\u043b\u0438\u0441\u044c <strong>\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0432 83%<\/strong>, \u0447\u0435\u0433\u043e, \u0431\u0435\u0441\u0441\u043f\u043e\u0440\u043d\u043e, \u043c\u0430\u043b\u043e, \u043d\u043e\u00a0\u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e\u00a0\u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u0430\u0451\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u043d\u0441\u043e\u0432 \u043d\u0430\u00a0\u0432\u0432\u043e\u0434 \u043a\u0430\u043f\u0447\u0438, <strong>\u0438 \u0442\u0430\u043a \u0441\u043e\u0439\u0434\u0451\u0442<\/strong>. \u041c\u044b \u0432\u0435\u0434\u044c \u043d\u0435\u00a0\u043c\u0435\u0433\u0430\u0445\u0430\u0446\u043a\u0435\u0440\u044b\u2011\u043b\u043e\u043c\u0430\u0446\u043a\u0435\u0440\u044b, \u0430\u00a0\u044d\u0442\u043e\u0442 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u00a0\u2014 \u0441\u043a\u043e\u0440\u0435\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043c\u044b\u0441\u043b\u0430 \u043e\u0441\u043e\u0431\u043e <em>\u043f\u043e\u0442\u0435\u0442\u044c<\/em> \u0442\u0443\u0442 \u043d\u0435\u0442, \u043a\u00a0\u0442\u043e\u043c\u0443\u00a0\u0436\u0435, \u043c\u0435\u043d\u044f \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435\u00a0\u043f\u043e\u043a\u0438\u0434\u0430\u043b\u043e \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u00a0\u044f \u0434\u0435\u043b\u0430\u044e \u044d\u0442\u043e \u0437\u0440\u044f, \u043a\u0430\u043a\u00a0\u043f\u043e\u0442\u043e\u043c \u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c. \u0421\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u044f\u00a0\u0431\u044b \u043c\u043e\u0433 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c!<\/p>\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u0442\u043e\u0439\u00a0\u0436\u0435 <a href=\"https:\/\/habr.com\/ru\/articles\/673440\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c \u0432\u00a0\u043e\u043d\u043d\u0445, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u00a0\u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432\u0435\u0441\u044c Tensorflow \u0434\u043b\u044f\u00a0\u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u0430\u043f\u0447\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e <strong>\u043a\u0430\u043f\u0447\u0435\u0440\u0435\u0448\u0430\u043b\u0443<\/strong> \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0430\u043b\u0435\u0435 \u0438\u0437\u00a0Python\u2011\u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 Minecraft \u0438 \u0433\u043b\u0430\u0432\u043d\u044b\u043c Python\u2011\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439. \u041f\u0440\u0438\u00a0\u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u00ab\u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u0430\u043f\u0447\u0443\u00bb \u0431\u0443\u0434\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u00a0\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043d\u0433 \u043a\u0430\u043f\u0447\u0438 \u0438\u0437\u00a0\u0438\u0433\u0440\u044b \u0432\u00a0Python\u2011\u0447\u0430\u0441\u0442\u044c. \u0422\u0430\u043c \u044d\u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u043e\u0441 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u00a0\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435, \u0438 \u043f\u043e\u00a0\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0432\u0432\u043e\u0434\u0430 \u0432\u00a0\u0447\u0430\u0442 \u0446\u0438\u0444\u043e\u0440\u043e\u043a \u0438\u0437\u00a0\u043a\u0430\u043f\u0447\u0438! \u0421\u0430\u043c \u043a\u043e\u0434 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0432\u044f\u0437\u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u0447\u0443\u0442\u044c \u043d\u0438\u0436\u0435 \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u0440\u0438\u00a0\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0432\u0430\u0442\u0430\u0440\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/def\/4ba\/79b\/def4ba79be89018a76068436e6da3c16.gif\" alt=\"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u043f\u0447\u0438 (\u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0430)\" title=\"\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u043f\u0447\u0438 (\u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0430)\" width=\"539\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/def\/4ba\/79b\/def4ba79be89018a76068436e6da3c16.gif\"\/><\/p>\n<div><figcaption>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u0430\u043f\u0447\u0438 (\u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0430)<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<h2>Just Python<\/h2>\n<p><em>\u0414\u0430\u043b\u044c\u0448\u0435 \u2013 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0442\u043e\u043d&#8230;<\/em><\/p>\n<h3>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0432\u0430\u0442\u0430\u0440\u0430<\/h3>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u0437\u0434\u0435\u0441\u044c \u0441\u0442\u0435\u043a \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043d\u0430\u043c \u0443\u0436\u0435 \u043f\u043e\u043d\u044f\u0442\u0435\u043d, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u00a0\u0431\u044b\u0442\u044c \u043d\u0435\u00a0\u0434\u043e\u043b\u0436\u043d\u043e: \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u043c VTube Studio, \u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0443\u0434\u0430 \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0443 Live2D, \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432\u00a0\u0441\u0430\u043c\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435\u00a0\u2014 \u0438 \u0432\u0443\u0430\u043b\u044f, \u043d\u0430\u0448\u0430 \u043a\u043e\u0448\u043a\u043e\u2011\u0434\u0435\u0432\u043e\u0447\u043a\u0430 \u0443\u0436\u0435 \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u0434\u0430\u0436\u0435 <strong>\u0432\u0438\u043b\u044f\u0435\u0442 \u0445\u0432\u043e\u0441\u0442\u043e\u043c<\/strong>!<\/p>\n<details class=\"spoiler\">\n<summary>\u0413\u0438\u0444\u043a\u0430 \u0445\u0432\u043e\u0441\u0442\u0430\u0442\u043e\u0439<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eee\/950\/da4\/eee950da42ba73240d6119dfa76f6aef.gif\" alt=\"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f &quot;Idle&quot;\" title=\"\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f &quot;Idle&quot;\" width=\"540\" height=\"446\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eee\/950\/da4\/eee950da42ba73240d6119dfa76f6aef.gif\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u00abIdle\u00bb<\/figcaption><\/div>\n<\/figure>\n<p>\u0424\u043e\u043d \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0437\u0435\u043b\u0451\u043d\u044b\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u0432\u00a0OBS \u043f\u043e\u00a0\u0446\u0432\u0435\u0442\u043e\u0432\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443 \u0432\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0438 \u043d\u0430\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0440\u0445 \u0438\u0433\u0440\u044b.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042f\u00a0\u0431\u044b \u0441\u00a0\u0440\u0430\u0434\u043e\u0441\u0442\u044c\u044e \u0442\u0430\u043a \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043b, \u043d\u043e, \u0443\u0432\u044b, \u0432\u00a0\u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u043e\u044e \u043b\u044e\u0431\u0438\u043c\u0443\u044e \u043b\u0435\u043d\u044c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0430\u0442\u044c, \u0432\u0435\u0434\u044c \u043e\u0434\u043d\u043e \u0438\u0437\u00a0\u043c\u043e\u0438\u0445 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439\u00a0\u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c <strong>\u0441\u0432\u044f\u0437\u044c \u0430\u0432\u0430\u0442\u0430\u0440\u0430 \u0441\u00a0\u0438\u0433\u0440\u043e\u0439<\/strong>. <\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u0438\u043c-\u043a\u0443\u043a\u043e\u0434\u0438\u043c<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f\u00a0\u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u044f \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c <a href=\"https:\/\/github.com\/mlo40\/VsPyYt\" rel=\"noopener noreferrer nofollow\">VsPyYt<\/a>, \u0440\u0430\u0441\u043a\u043e\u0432\u044b\u0440\u044f\u043b \u0435\u0433\u043e \u0438 \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0443\u0436\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u00a0\u0444\u0430\u0439\u043b\u0435 vsnoyt \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0438\u0445 \u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e\u00a0\u0431\u044b\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u00a0\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435. \u0412\u00a0VTube \u0441\u00a0\u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0432\u0435\u0431\u0441\u043e\u043a\u0435\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a\u00a0\u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 (\u0438 \u043f\u043e\u0442\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0432\u0438\u0433\u0430\u0442\u044c \u0441\u00a0\u0438\u0445 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0433\u043b\u0430\u0437\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0438\u0437\u00a0Python\u2011\u0447\u0430\u0441\u0442\u0438) \u0438 \u0438\u0432\u0435\u043d\u0442\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u00a0\u0432\u0440\u0435\u043c\u044f \u0434\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044e \u0433\u0440\u0443\u0441\u0442\u0438 \u0438\u043b\u0438\u00a0\u0440\u0430\u0434\u043e\u0441\u0442\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 VTube\/vsnoyt.py (Process func)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from setup import *  if os.path.exists('custom.py'):     import customfunc     from customfunc import *   def VtubeProcess(vtube_ctx, ctx):     import json     import time     import os      import setup     from setup import setup     import threading     async def wsconnect():         fail = True         while fail and ctx.ThreadsActived:             try:                 ez = await websockets.connect('ws:\/\/127.0.0.1:8001')                 fail = False                 if (not ctx.IsVtubeStarted):                     ctx.IsVtubeStarted = True                 # print('CONNECTION SUCCESSFUL')                 return ez             except BaseException as err:                 ctx.IsVtubeStarted = False                 # print('!! **VTUBE STUDIO CONNECTION FAILED** !!',err)                 time.sleep(5)                 # return False      async def DoEvent(websocket, event_name=\"CryButNot\", event_type=\"hotkey\", bool_val=True):         async def innerFunc():             if event_type == \"hotkey\":                 await ExHotkey(websocket, event_name)  # xHotkey(websocket,hid,IID):             else:                 await ExpresState(websocket, event_name, bool_val)          try:             await innerFunc()         except:             websocket = await wsconnect()             commandlist = await setup(websocket)             await innerFunc()      async def EventListener():         websocket = await wsconnect()         commandlist = await setup(websocket)         while ctx.ThreadsActived:             ctx.AnimEvent.wait()             event_dict = ctx.AnimEventInfo             event_name = event_dict[\"name\"]             event_type = event_dict.get(\"type\", \"hotkey\")             event_time = event_dict.get(\"time\", 0)             await DoEvent(websocket, event_name, event_type, True)              if event_type != \"hotkey\":                 if event_time>0:                     time.sleep(event_time)                     # \u0435\u0441\u043b\u0438 \u0438\u0432\u0435\u043d\u0442 \u0438\u0434\u0451\u0442 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u043e\u043d \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u043a\u0430\u043a \u0438 \u0431\u044b\u043b \u0442\u043e \u041d\u0415 \u041d\u0410\u0414\u041e \u041e\u0422\u041a\u041b\u042e\u0427\u0410\u0422\u042c                 if ctx.AnimEvent.is_set() and event_name == ctx.AnimEventInfo[\"name\"]:  #:(AnimEvent.is_set()) and eventname!=ctx.AnimEventName:                     pass                 else:                     await DoEvent(websocket, event_name, event_type, False)             # time.sleep(0.6)      async def startListeningCycle():         websocket = await wsconnect()         commandlist = await setup(websocket)         oldNeedX = vtube_ctx.NeedX         oldNeedY = vtube_ctx.NeedY         await setNeedXY(websocket, vtube_ctx.NeedX, vtube_ctx.NeedY)         # await createparam(websocket,\"NeedEyeX\",-1,1,0)#createparam(websocket,name,mn,mx,defolt)         # await createparam(websocket,\"NeedEyeY\",-1,1,0)#createparam(websocket,name,mn,mx,defolt)         while ctx.ThreadsActived:             # word = input(\"enter command \")             time.sleep(0.02)             # if(oldNeedX != NeedX or oldNeedY != NeedY):             #    oldNeedX = NeedX             #    oldNeedY = NeedY             # print(\"Changed!\",oldNeedX,oldNeedY)             # print(\"DEBUG\",NeedX,NeedY)             try:                 await setEyeNeedXY(websocket, vtube_ctx.eyeX, vtube_ctx.eyeY)                 await setNeedXY(websocket, vtube_ctx.NeedX, vtube_ctx.NeedY)                 # await setNeedXY(websocket,NeedX,NeedY)                 # await doteststuff(websocket)                 # print('\u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0430!')             except:                 # print('\u041e\u0448\u0438\u0431\u043a\u0430! \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435')                 websocket = await wsconnect()                 commandlist = await setup(websocket)                 await setEyeNeedXY(websocket, vtube_ctx.eyeX, vtube_ctx.eyeY)                 await setNeedXY(websocket, vtube_ctx.NeedX, vtube_ctx.NeedY)                 # await setNeedXY(websocket,NeedX,NeedY)                 # await doteststuff(websocket)                 # print('\u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u0430!')             # word = input(\"enter command \")             # for key in commandlist['COMMANDS']:             #    if word == key:             #        print('executing')             #        mdinf = await getmd(websocket)             #        s = mdinf[\"data\"][\"modelPosition\"][\"size\"]             #        r = mdinf[\"data\"][\"modelPosition\"][\"rotation\"]             #        x = mdinf[\"data\"][\"modelPosition\"][\"positionX\"]             #        y = mdinf[\"data\"][\"modelPosition\"][\"positionY\"]             #        cm = commandlist['COMMANDS'][key]             #        await eval(cm)      def EventChecker():         asyncio.run(EventListener())      EvCheckerThread = threading.Thread(target=EventChecker, daemon=True)     EvCheckerThread.start()     asyncio.run(startListeningCycle()) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"MineBridge.py\" id=\"MineBridge.py\"><\/a><\/p>\n<p>\u0423\u043f\u0441, \u0430\u00a0\u0434\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0437\u0430\u0441\u0442\u0440\u044f\u043b\u0438. \u0427\u0442\u043e\u00a0\u0436\u0435 \u0441\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c? \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u044f \u0441\u043e\u0432\u0441\u0435\u043c \u0437\u0430\u0431\u044b\u043b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c Python\u2011\u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u00a0\u043c\u043e\u0434\u043e\u043c Minecraft \u043d\u0430\u00a0\u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u0435! \u041f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c\u00a0\u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0434\u0435\u043b\u043e. \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448 py4j \u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441\u00a0\u0438\u0433\u0440\u043e\u0439. \u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e\u00a0\u043c\u043e\u0439 \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u043a\u043e\u0434 \u0437\u0434\u0435\u0441\u044c \u043c\u0435\u043d\u044f \u043f\u043e\u0434\u0432\u043e\u0434\u0438\u043b \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0430\u0441\u0442\u043e, \u0438 \u0432\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u2011\u0438\u043d\u0432\u0430\u043b\u0438\u0434, \u0432\u0435\u0434\u044c, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0433\u0440\u0443, \u0430\u00a0\u043f\u043e\u0442\u043e\u043c Python\u2011\u0441\u043a\u0440\u0438\u043f\u0442. \u041d\u043e, \u043e\u043d\u043e <strong>\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/strong>, \u0430\u00a0\u043f\u043e\u0442\u043e\u043c\u0443<\/p>\n<blockquote>\n<p>\u0438 \u0442\u0430\u043a \u0441\u043e\u0439\u0434\u0451\u0442!<\/p>\n<\/blockquote>\n<p><em>(\u0437\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u044d\u0442\u0443 \u0444\u0440\u0430\u0437\u0443, \u0414\u0410\u041b\u042c\u0428\u0415 \u043e\u043d\u0430 \u043d\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f)<\/em><\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 MineBridge.py (Process func)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import datetime import multiprocessing import sys import traceback from py4j.java_gateway import JavaGateway, CallbackServerParameters import numpy as np import threading # Connect to the Java gateway server import copy # print(str(gateway)) # print(gateway.entry_point) import time import queue from datetime import datetime import numpy   # \u041d\u0423\u0416\u0415\u041d \u041e\u0422\u0414\u0415\u041b\u042c\u041d\u042b\u0419 \u041f\u0420\u041e\u0426\u0415\u0421\u0421((( def eztime():     return datetime.now().strftime('%Y-%m-%d %H:%M:%S')   def tm(x):     return datetime.strptime(x, '%Y-%m-%d %H:%M:%S')   def mainBridge(mc_vt_ctx, ctx, ctx_chat, ctx_chatMsgs, ctx_chatOwn):     captchaQueueInput = multiprocessing.Queue()     captchaQueueOutput = multiprocessing.Queue()      def solve_captcha_worker():         while True:             image_bytes = captchaQueueInput.get()             sys.path.insert(0, f'zHyperAI_Helpers\/captcha_solver\/4_vk_mod\/code')             from onnx_inference import solve_captcha             result = solve_captcha(image_bytes)             captchaQueueOutput.put(result)      def requestCaptchaResolve(image_bytes):         if captchaQueueInput.qsize() > 0:             while not captchaQueueInput.empty():                 captchaQueueInput.get()             # with captchaQueueInput.mutex:             #    captchaQueueInput.queue.clear()             #    captchaQueueInput.all_tasks_done.notify_all()             #    captchaQueueInput.unfinished_tasks = 0         captchaQueueInput.put(image_bytes)      gateway = None      threading.Thread(target=solve_captcha_worker).start()     # ctx_chatMsgs = []      while ctx.ThreadsActived:         try:             ctx.lastmsg = \"hz\"             print('\u0437\u0430\u043f\u0443\u0441\u043a python callback')              class PythonCallback(object):                 def isStarted(self):                     return True                  def onCaptchaSolveRequest(self, image_bytes):                     print('GOT CAPTCHA REQUEST!')                     requestCaptchaResolve(image_bytes)                  def onUpdateServerInfo(self, infoMas=None):                     for cho in infoMas:                         ctx.GameInfo[cho] = infoMas[cho]                     print('GameInfoUpdated', ctx.GameInfo)                  def onVerifedChat(self, msgMas=None):                     if msgMas is None:                         pass                         # msgMas = {}                     else:                         # print(\"RECIEVED BIG MSG:\",msgMas.get(\"user\",\"\"),'>',msgMas.get(\"msg\",\"\"),' CLAN=',msgMas.get(\"clan\",\"\"),\" NONEXIST=\",msgMas.get(\"gdfjkgdf\",\"\"))                         msgDict = {\"user\": msgMas.get(\"user\", \"\"),                                    \"msg\": msgMas.get(\"msg\", \"\"),                                    }                         # pre, rank, user, msg, clan, team, server, serverMode, chat_type, precision                         fields = [\"pre\", \"rank\", \"clan\", \"team\", \"server\", \"serverMode\", \"chat_type\", \"precision\"]                         for field in fields:                             if msgMas.get(field, \"\") is not None:                                 if msgMas.get(field, \"\").strip() != \"\":                                     msgDict[field] = msgMas.get(field, \"\")                         ctx_chatMsgs.append(msgDict)                     return msgMas                  def onChatMessage(self, msg=\"\"):                     # print(string)                     ctx.lastmsg = msg                     # print('recieved msg >>',msg)                     return msg                  def onDeath(self, killer=\"unknown\"):                     if killer is not None and killer.strip() != \"\" and killer != \"unknown\":                         ctx.eventlist.append({\"type\": \"death\", \"user\": killer, \"happiness_score\": -3, \"date\": eztime()})                     ctx.MineEventName = \"death\"                     ctx.MineEvent.set()                     ctx.MineEvent.clear()                     # print('MINECRAFT DEATH FROM',killer)                  def onKill(self, killed=\"unknown\"):                     if killed is not None and killed.strip() != \"\" and killed != \"unknown\":                         ctx.eventlist.append({\"type\": \"kill\", \"user\": killed, \"happiness_score\": 1, \"date\": eztime()})                     ctx.MineEventName = \"kill\"                     ctx.MineEvent.set()                     ctx.MineEvent.clear()                  def onDamage(self, amount=0):                     pass                     # print('MINECRAFT DAMAGE =',str(amount))                  class Java:                     implements = [\"adris.altoclef.PythonCallback\"]              cb = PythonCallback()             # gateway = JavaGateway()             gateway = JavaGateway(                 callback_server_parameters=CallbackServerParameters(),                 python_server_entry_point=cb,                 start_callback_server=True             )             # start_callback_server=True)              # print('\u0437\u0430\u043f\u0443\u0441\u043a gateway entry point')             # try:             #     print(gateway.entry_point.inGame())             # except BaseException as err:             #     print('err, ',err)              e = gateway.entry_point              # def             # print(\"\u0413\u0415\u0419\u0422\u0412\u0415\u0426\u0419 \",\"\")             def ingame(loop=True):                 if (loop):                     needLog = False                     fail = True                     while fail and ctx.ThreadsActived:                         try:                             ez = e.inGame()                             # ctx.BridgeEntry = e                             fail = False                             if (not ctx.IsMCStarted):                                 ctx.IsMCStarted = True                             if needLog:                                 print('BRIDGE CONNECTION SUCCESSFUL')                             ctx.ingame = ez                             return ez                         except BaseException as err:                             # print('INGAME ERROR', err)                             # print('\u0422\u0415\u041a\u0421\u0422 \u041e\u0411\u0414\u0420\u0418\u0421\u0422\u0410\u041d\u041d\u041e\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                             if needLog:                                 print('BRIDGE CONNECTION FAILED', err)                             ctx.IsMCStarted = False                             ctx.ingame = False                             time.sleep(5)                             # return False                         finally:                             needLog = False  # False                 else:                     try:                         ctx.BridgeEntry = []                         ez = e.inGame()                         if (not ctx.IsMCStarted):                             ctx.IsMCStarted = True                         # print('CONNECTION SUCCESSFUL')                         return ez                     except BaseException as err:                         print(                             'ERROR BRIDGE \u043a\u043e\u0433\u0434\u0430 \u0447\u0435\u043a\u0430\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0439\u043d. \u0415\u0433\u043e \u0432\u0438\u0434\u0438\u043c\u043e \u043d\u0435\u0442 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0438\u043b\u0438 \u0435\u0449\u0451 \u0447\u0435 \u043f\u043e\u0445\u0443\u0436\u0435')                         ctx.IsMCStarted = False                         return False              print('\u0449\u0430 \u0447\u0435\u043a\u043d\u0435\u043c \u043c\u0430\u0439\u043d')             time.sleep(1)             print('Minecraft bridge: \u0412 \u0438\u0433\u0440\u0435? =', ingame())             mc_vt_ctx.PitchSpeed = 0.0             ctx.YawSpeed = 0.0             AngSpeedTableP = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]             AngSpeedTableY = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]             def updater():                 ii = 0                 # print(\"UPDATER STARTED *****\")                 while ctx.ThreadsActived:                     time.sleep(0.01)                     # print('DEBUG ACTIVED')                     if (len(ctx_chatMsgs) > 0):                         for msg in ctx_chatMsgs:                             # print('Processing msgsmas', msg)                             msg[\"date\"] = eztime()                             msg[\"processing_timestamp\"] = time.time_ns()                             msg[\"env\"] = \"minecraft\"                             # pre, rank, user, msg, clan, team, server, serverMode, chat_type, precision                              if (msg[\"user\"] in ctx.botNicknames):                                 print('\u0412\u0441\u0442\u0440\u0435\u0447\u0435\u043d\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435', msg[\"user\"], '\u0432\u043d\u043e\u0441\u0438\u043c \u0432 \u0431\u0430\u0437\u0443', msg[\"msg\"])                                 ctx_chatOwn.append(msg)                                 ###ctx_chatOwn = ctx_chatOwn + [msg]                                 ctx.LastMineChatInteract = eztime()                             else:                                 print(f\"[{datetime.now().strftime('%H:%M:%S')}] [MC CHAT]\", msg[\"user\"], '>',                                       msg[\"msg\"])                                  message_l = msg[\"msg\"].lower()                                 player = msg[\"user\"]                                 Razrabs = [\"3ndetz\"]                                 if player in Razrabs:                                     if ingame(loop=False):                                         try:                                             if message_l.find(\"\u0437\u0430 \u043c\u043d\u043e\u0439\") != -1:                                                 e.RunInnerCommand(f\"\"\"@follow {player}\"\"\")                                             elif message_l.find(\"\u0432\u043f\u0435\u0440\u0435\u0434\") != -1:                                                 e.RunInnerCommand(\"@test killall\")                                             elif message_l.find(\"\u043c\u043e\u0447\u0438\") != -1:                                                 e.RunInnerCommand(f\"\"\"@punk {msg[\"msg\"].split(' ')[1]}\"\"\")                                             elif message_l.find(\"\u0441\u0442\u043e\u043f\") != -1:                                                 e.RunInnerCommand(\"@stop\")                                         except BaseException as err:                                             print('ERROR WHILE EXEC RAZRAB COMMAND', err)                                  ctx_chat.append(msg)                                 ###ctx_chat = ctx_chat + [msg]                         ###ctx_chatMsgs = []                         # ctx_chatMsgs.clear() \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f ListProxy manager                         ctx_chatMsgs[:] = []                     ####                     if (ingame()):                         try:                             captchaSolved = captchaQueueOutput.get(block=False)                             if captchaSolved is not None:                                 print(\"[BRIDGE CAPTCHA] GET CAPTCHA OUTPUT ! Entering in chat >>\", captchaSolved, '&lt;&lt;')                                 e.CaptchaSolvedSend(captchaSolved[\"result\"], float(captchaSolved[\"predict\"]))                         except queue.Empty:                             pass                         ii += 1                         if ii > 30:                             g_block = e.getGroundBlock()                             g_item = e.getHeldItem()                             g_tasks = e.getTaskChainString()                             ctx.ingame_info = {\"task_chain\": g_tasks, \"ground_block\": g_block, \"held_item\": g_item}                         if (len(ctx.BridgeChatQueue) > 0) and (                                 datetime.now() - tm(ctx.LastMineChatInteract)).total_seconds() >= 7:                             ctx.LastMineChatInteract = eztime()                             chat_msg = ctx.BridgeChatQueue[0]                             is_command = False                             try:                                 if chat_msg[0] == \"$\":                                     is_command = True                                     chat_msg = chat_msg[1:]                             except:                                 is_command = False                             try:                                 if is_command:                                     print(\"[MC] RUN CMD \" + chat_msg)                                     e.RunInnerCommand(\"@\" + chat_msg)                                 else:                                     print(\"[MC] RUN CHAT \" + chat_msg)                                     e.ChatMessage(chat_msg)                             except:                                 pass                             ctx.BridgeChatQueue.pop(0)                         if (len(ctx_chatOwn) > 80):                             ctx_chatOwn.pop(0)                         goalRotation = e.getGoalRotation()                         if (goalRotation is None):                             AngSpeedTableP.append(e.getPitch())                             AngSpeedTableY.append(e.getYaw())                             if len(AngSpeedTableP) > 10:                                 AngSpeedTableP.pop(0)                             if len(AngSpeedTableY) > 10:                                 AngSpeedTableY.pop(0)                             mc_vt_ctx.PitchSpeed = -AngSpeedTableP[5] + AngSpeedTableP[0]                             ctx.YawSpeed = -AngSpeedTableY[5] + AngSpeedTableY[0]                         else:                             # print('\u044b\u044b',e.ChatMessage(\"\u041f\u0440\u0438\u0432\u0435\u0442\u041c\u0438\u0440\"))                             mc_vt_ctx.PitchSpeed = goalRotation.getPitch()                             ctx.YawSpeed = goalRotation.getYaw()                     else:                         # print('\u041d\u0415 \u0412 \u0418\u0413\u0420\u0415!!!')                         time.sleep(2)              def listener():                 while ctx.ThreadsActived:                     time.sleep(0.01)                     if (ingame()):                         time.sleep(5)                         print('@test killall')                         e.ExecuteCommand(\"@test killall\")                         time.sleep(3)                         print('\u0441\u0442\u043e\u043f')                         e.ExecuteCommand(\"@stop\")                         time.sleep(1)              print(\"UPDATER STARTING...\")             updaterThread = threading.Thread(target=updater)             updaterThread.start()             updaterThread.join()             # EventListenerThread = threading.Thread(target=listener)             # EventListenerThread.start()             # while True:             # time.sleep(0.05)             # mc_vt_ctx.PitchSpeed = PitchSpeed+1+mc_vt_ctx.PitchSpeed             # ctx.YawSpeed = PitchSpeed             # print('\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432 10 \u0442\u0438\u043a\u043e\u0432: ',mc_vt_ctx.PitchSpeed,ctx.YawSpeed)         except BaseException as err:             print('Mine Bridge \u041f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 >', err)             print('\u0422\u0415\u041a\u0421\u0422 \u041e*****\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())             time.sleep(5)         finally:             print('\u0414\u043e\u0441\u0442\u0438\u0433\u043d\u0443\u0442 \u043a\u043e\u043d\u0435\u0446 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 Mine Bridge, \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0435\u0433\u043e...')             try:                 if (gateway is not None):                     gateway.shutdown_callback_server()                     gateway.shutdown()                     time.sleep(1)                     gateway = None             except BaseException as err:                 print('MineBridge: \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c gateway')                 time.sleep(1)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443\u00a0\u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441\u00a0\u043c\u0430\u0439\u043d\u043e\u043c \u0438 \u0432\u0442\u0443\u0431\u043e\u043c, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u043b\u044c\u0451\u043c \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u0438\u0440\u043a\u0438 \u0432\u043e\u0435\u0434\u0438\u043d\u043e! \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0441\u043b\u0438\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u0432\u0441\u044e \u044d\u0442\u0443 \u043a\u0430\u0448\u0443\u2011\u043c\u0430\u043b\u0443. \u0417\u0434\u0435\u0441\u044c \u044f \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0430\u0432\u0430\u0442\u0430\u0440 \u0441\u043b\u0435\u0434\u0438\u043b \u0437\u0430\u00a0\u043f\u043e\u0432\u043e\u0440\u043e\u0442\u043e\u043c \u0438\u0433\u0440\u043e\u043a\u0430. \u041f\u0443\u0442\u0451\u043c \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0433\u043b\u0430\u0437\u0430 \u0438\u0437\u00a0VTube \u0431\u0443\u0434\u0443\u0442 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u00a0\u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a\u0430\u043c\u0435\u0440\u044b \u0432\u00a0\u0438\u0433\u0440\u0435,\u00a0\u043b\u0438\u0431\u043e, \u043f\u0440\u0438\u00a0\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0446\u0435\u043b\u0438 Baritone \u0432\u00a0Minecraft, \u0433\u043b\u0430\u0437\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0443\u0434\u0430, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0446\u0435\u043b\u044c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u044d\u043a\u0440\u0430\u043d\u0430 (\u0434\u043b\u044f \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0438\u0437\u0443\u0447\u0438\u0442\u044c <code>Py4jEntryPoint.java<\/code>, \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u044f \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b \u0432\u044b\u0448\u0435, \u0442\u0430\u043c \u044f \u0441\u0447\u0438\u0442\u0430\u044e \u00ab\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u0435\u00bb \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0434\u043e\u00a0\u0446\u0435\u043b\u0438 \u0432\u00a0\u0433\u0440\u0430\u0434\u0443\u0441\u0430\u0445 \u0443\u0433\u043b\u0430 \u043f\u043e\u0432\u043e\u0440\u043e\u0442\u0430 \u0434\u043e\u00a0\u0446\u0435\u043b\u0438).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 ai.py\/VtubeRotater (Thread func)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">        def sgn(x):             if x > 0:                 return 1             elif x == 0:                 return 0             else:                 return -1           def VtubeRotater():             def rd(num):                 return round(num, 2)              def clp(num):                 return np.clip(num, -1, 1)  ##numpy.clip(a, a_min, a_max,              while ctx.ThreadsActived:                 x = 0                 xvel = 0.01                 y = 0                 yvel = 0.01                 if (ctx.state == \"idle\"):                     x = 0                     y = 0                     vtube_ctx.eyeX = 0                     vtube_ctx.eyeY = 0                 elif (ctx.state == \"gaming\"):                     xmod = -mc_vt_ctx.YawSpeed \/ 30                     ymod = mc_vt_ctx.PitchSpeed \/ 50                     x = -0.5                     y = -1.0                     # if(abs(ymod)>0.4):                     #    ymod=0                     if (abs(xmod) > 0.5):                         xmod \/= 10                     x += xmod                     y += ymod                     vtube_ctx.eyeX = x                     vtube_ctx.eyeY = y                 diffx = vtube_ctx.NeedX - x                 diffy = vtube_ctx.NeedY - y                 # print(\"\\n\\nX =\",vtube_ctx.NeedX,x,diffx,\"\\nY =\",vtube_ctx.NeedY,y,diffy)                  if abs(diffx) > 0.02:                     vtube_ctx.NeedX = clp(vtube_ctx.NeedX - xvel * sgn(diffx))                 if abs(diffy) > 0.02:                     vtube_ctx.NeedY = clp(vtube_ctx.NeedY - yvel * sgn(diffy))                 time.sleep(0.01)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u00a0\u0436\u0435 \u0443\u00a0\u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c? \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u00a0\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0435!<\/p>\n<details class=\"spoiler\">\n<summary>\u0425\u0432\u043e\u0441\u0442\u0430\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u0438\u0442 \u0433\u043b\u0430\u0437\u043a\u0438 (\u0413\u0438\u0444\u043a\u0438)<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"MineEyeBridge\" id=\"MineEyeBridge\"><\/a><\/p>\n<p>\u0411\u0443\u0434\u0442\u043e \u0431\u044b \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u0438\u0433\u0440\u0430\u0435\u0442, \u0434\u0430?)<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/707\/d82\/b3b\/707d82b3b05e5f91e8dab61070369d74.gif\" alt=\"\u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u043d\u0430 \u0434\u0432\u0438\u0436\u0443\u0449\u0443\u044e\u0441\u044f \u0446\u0435\u043b\u044c\" title=\"\u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u043d\u0430 \u0434\u0432\u0438\u0436\u0443\u0449\u0443\u044e\u0441\u044f \u0446\u0435\u043b\u044c\" width=\"421\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/707\/d82\/b3b\/707d82b3b05e5f91e8dab61070369d74.gif\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u043d\u0430 \u0434\u0432\u0438\u0436\u0443\u0449\u0443\u044e\u0441\u044f \u0446\u0435\u043b\u044c<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0440\u0438 \u0440\u0435\u0437\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f\u0445 \u0432\u0437\u0433\u043b\u044f\u0434 \u043c\u043e\u0436\u0435\u0442 \u0441\u0440\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e. \u0415\u0449\u0451, \u0435\u0441\u043b\u0438 \u043f\u0440\u0438\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c\u0441\u044f, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u0430. <strong>\u041d\u0443 \u0435\u0449\u0451 \u0431\u044b \u0435\u0451 \u043d\u0435 \u0431\u044b\u043b\u043e<\/strong>! \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0434\u0443\u0442 \u0438\u0437 \u0438\u0433\u0440\u044b \u0432 \u043c\u043e\u0434, \u043f\u043e\u0442\u043e\u043c \u0438\u0437 \u043c\u043e\u0434\u0430 \u0432 \u0441\u043a\u0440\u0438\u043f\u0442, \u0430 \u0438\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043f\u043e \u0432\u0435\u0431\u0441\u043e\u043a\u0435\u0442\u0443 \u0443\u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e VTube Studio.<\/p>\n<p>\u0420\u044b\u0432\u043a\u0438 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u0437\u043a\u0438\u0445 \u043f\u0430\u0434\u0435\u043d\u0438\u0439 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0439 \u043c\u0435\u0436\u0434\u0443 \u043c\u0438\u0440\u0430\u043c\u0438 \u0432 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435. <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2c7\/8c0\/e21\/2c78c0e21d38805819b4c9f410a24c2d.gif\" alt=\"\u0420\u044b\u0432\u043a\u0438 \u0433\u043b\u0430\u0437 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043f\u0440\u0438 \u0440\u0435\u0437\u043a\u0438\u0445 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f\u0445 \u0432 \u0438\u0433\u0440\u0435\" title=\"\u0420\u044b\u0432\u043a\u0438 \u0433\u043b\u0430\u0437 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043f\u0440\u0438 \u0440\u0435\u0437\u043a\u0438\u0445 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f\u0445 \u0432 \u0438\u0433\u0440\u0435\" width=\"635\" height=\"368\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2c7\/8c0\/e21\/2c78c0e21d38805819b4c9f410a24c2d.gif\"\/><\/p>\n<div><figcaption>\u0420\u044b\u0432\u043a\u0438 \u0433\u043b\u0430\u0437 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u043f\u0440\u0438 \u0440\u0435\u0437\u043a\u0438\u0445 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f\u0445 \u0432 \u0438\u0433\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0438\u043d\u043e\u0433\u0434\u0430, \u0432\u00a0\u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f\u0445 \u043a\u043e\u0433\u0434\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0435\u00a0\u0437\u043d\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u0430\u0448\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u043e\u0434\u0440\u0443\u0433\u0430 \u043c\u043e\u0436\u0435\u0442 \u00ab\u0437\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0433\u043b\u0430\u0437\u0430\u00bb. \u0418 \u043d\u0435\u0442, \u044d\u0442\u043e \u043d\u0435\u00a0\u043c\u043e\u043d\u0442\u0430\u0436, \u043e\u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0441\u0430\u043c\u0430 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0435\u0442! <abbr class=\"habraabbr\" title=\"\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u0432\u0438\u0434\u0438\u0442 \u0446\u0435\u043b\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430, \u043d\u043e \u043d\u0430 \u0435\u0451 \u043e\u0441\u0442\u0440\u043e\u0432\u0435 \u043d\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u043d\u0435\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438 \u0436\u0434\u0451\u0442, \u0430 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0443\u0433\u043b\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 &quot;\u0446\u0435\u043b\u044c\u044e&quot; \u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c \u0432 \u0438\u0433\u0440\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0432\u0435\u0440\u0445\" data-title=\"&lt;p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d\u0430 \u0432\u0438\u0434\u0438\u0442 \u0446\u0435\u043b\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0430, \u043d\u043e \u043d\u0430 \u0435\u0451 \u043e\u0441\u0442\u0440\u043e\u0432\u0435 \u043d\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0434\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u043d\u0435\u0433\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u0441\u0442\u043e\u0438\u0442 \u0438 \u0436\u0434\u0451\u0442, \u0430 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0443\u0433\u043b\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 &quot;\u0446\u0435\u043b\u044c\u044e&quot; \u0438 \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c \u0432 \u0438\u0433\u0440\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0432\u0435\u0440\u0445&lt;\/p>&#187; data-abbr=&#187;\u041e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435&#187;>\u041f\u043e\u0447\u0435\u043c\u0443?<\/abbr><\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0a6\/804\/0a2\/0a68040a2e0ed7ab75865e99ca4d01f7.gif\" alt=\"\u0412\u0437\u0433\u043b\u044f\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &quot;\u0432\u043e\u0442 \u0431\u044b \u043c\u043d\u0435 \u043d\u043e\u0432\u0435\u043d\u044c\u043a\u0443\u044e H100&quot;\" title=\"\u0412\u0437\u0433\u043b\u044f\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &quot;\u0432\u043e\u0442 \u0431\u044b \u043c\u043d\u0435 \u043d\u043e\u0432\u0435\u043d\u044c\u043a\u0443\u044e H100&quot;\" width=\"518\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0a6\/804\/0a2\/0a68040a2e0ed7ab75865e99ca4d01f7.gif\"\/><\/p>\n<div><figcaption>\u0412\u0437\u0433\u043b\u044f\u0434 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0432\u043e\u0442\u00a0\u0431\u044b \u043c\u043d\u0435 \u043d\u043e\u0432\u0435\u043d\u044c\u043a\u0443\u044e <abbr class=\"habraabbr\" title=\"\u041e\u0442\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0442\u043e\u043f\u043e\u0432\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f Nvidia H100\" data-title=\"&lt;p>\u041e\u0442\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0442\u043e\u043f\u043e\u0432\u0443\u044e \u0432\u0438\u0434\u0435\u043e\u043a\u0430\u0440\u0442\u0443 \u0434\u043b\u044f \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f Nvidia H100&lt;\/p>&#187; data-abbr=&#187;H100&#8243;>H100<\/abbr>\u00bb<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"TyanGptStart\" id=\"TyanGptStart\"><\/a><\/p>\n<h3>\u0412\u0430\u0440\u0438\u043c \u043a\u0438\u0441\u0435\u043b\u044c TyanGPT<\/h3>\n<p>\u0418\u0442\u0430\u043a, \u0432\u043e\u0442 \u043c\u044b \u0438 \u043f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a <strong>\u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u043c\u0443<\/strong>! \u0411\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448\u0435\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0435 <s>\u0440\u043e\u0442, \u043a\u043b\u044e\u0432<\/s> <s>\u044f\u0437\u044b\u043a<\/s> <s>\u043c\u043e\u0437\u0433<\/s> \u0432\u00a0\u043e\u0431\u0449\u0435\u043c, \u043d\u0430\u0437\u044b\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e, \u043a\u0430\u043a\u00a0\u0445\u043e\u0442\u0438\u0442\u0435, \u0430\u00a0\u0440\u0435\u0447\u044c \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0439\u0434\u0451\u0442 \u043e\u00a0\u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/p>\n<h4>\u041f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u044b\u0439 \u0434\u043e\u0431\u0440\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0438\u043a\u043e\u0432<\/h4>\n<p>\u0418\u0442\u0430\u043a, \u0435\u0441\u043b\u0438 \u0432\u044b \u0435\u0449\u0451 \u043d\u0435\u00a0\u0432\u0438\u0434\u0435\u043b\u0438 \u043c\u043e\u044e <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e<\/a> \u0441\u0442\u0430\u0442\u044c\u044e, \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0433\u043b\u044f\u043d\u0443\u0442\u044c. \u0414\u0430\u0436\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0448\u043b\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u0442\u044b\u0445 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0439, \u044f \u043d\u0435\u00a0\u0437\u0430\u043c\u0435\u0447\u0430\u043b \u043d\u0438 \u0443\u00a0\u043e\u0434\u043d\u043e\u0439 \u0438\u0437\u00a0\u043d\u0438\u0445 \u0442\u0430\u043a\u043e\u0433\u043e\u00a0\u0436\u0435 \u0443\u0440\u043e\u0432\u043d\u044f <em>\u0434\u0443\u0448\u0435\u0432\u043d\u043e\u0441\u0442\u0438<\/em>, \u043a\u0430\u043a\u00a0\u0443\u00a0\u0424\u0440\u0435\u0434\u0430&#8230; \u0414\u0430, \u043e\u043d \u043d\u0435\u00a0\u0441\u0430\u043c\u044b\u0439 \u0443\u043c\u043d\u044b\u0439, \u043f\u043e\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 <strong>\u0442\u044f\u0436\u0435\u043b\u043e<\/strong>, \u043d\u043e\u00a0\u043c\u044b \u0432\u0435\u0434\u044c \u043d\u0435\u00a0\u043b\u044b\u043a\u043e\u043c \u0448\u0438\u0442\u044b, \u0441\u043f\u0440\u0430\u0432\u0438\u043c\u0441\u044f! \u0410\u00a0\u043c\u043e\u0436\u0435\u0442, \u0434\u0430\u0436\u0435, \u0431\u0435\u0437\u00a0\u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f!<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/74b\/20a\/402\/74b20a4025bfd4ff005487d1f91e2a69.png\" alt=\"\u0414\u0443\u0448\u0435\u0432\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043d\u0438\u043a\u0430 \u043e\u0442 \u0424\u0440\u0435\u0434\u0430\" title=\"\u0414\u0443\u0448\u0435\u0432\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043d\u0438\u043a\u0430 \u043e\u0442 \u0424\u0440\u0435\u0434\u0430\" width=\"963\" height=\"97\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/74b\/20a\/402\/74b20a4025bfd4ff005487d1f91e2a69.png\"\/><\/p>\n<div><figcaption>\u0414\u0443\u0448\u0435\u0432\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043d\u0438\u043a\u0430 \u043e\u0442\u00a0\u0424\u0440\u0435\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e\u00a0\u044f \u0441\u0434\u0435\u043b\u0430\u043b\u00a0\u2014 \u044d\u0442\u043e \u0434\u043e\u043f\u0438\u043b\u0438\u043b \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043d\u0438\u043a\u0430. \u0417\u0430\u0447\u0435\u043c \u0438\u0437\u043e\u0431\u0440\u0435\u0442\u0430\u0442\u044c \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435\u2011\u0442\u043e \u043e\u0441\u043e\u0431\u043e\u0435 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u0440\u0430\u0437 \u0443\u00a0\u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439, \u043d\u043e\u00a0\u0432\u0435\u0441\u0451\u043b\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0438\u043a\u043e\u0432? \u0415\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438\u00a0\u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f! \u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043d\u0435\u00a0\u0442\u044f\u043d\u0443\u0442\u044c \u043a\u043e\u0442\u0430 \u0437\u0430\u00a0\u044f\u0439\u0446\u0430 \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0448\u0432\u044b\u0440\u043d\u0443\u0442\u044c \u043d\u0430\u0448 \u043f\u043e\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435\u00a0\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u0432\u00a0\u0438\u0433\u0440\u0443 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430\u00a0\u0440\u0435\u0430\u043a\u0446\u0438\u044e \u0438\u0433\u0440\u043e\u043a\u043e\u0432. \u041c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u044e, \u0441\u0432\u044f\u0437\u044c \u0441\u00a0\u0430\u0432\u0430\u0442\u0430\u0440\u043e\u043c \u0438 \u043e\u0437\u0432\u0443\u0447\u043a\u0443 \u044f \u0431\u0443\u0434\u0443 \u043f\u0438\u043b\u0438\u0442\u044c \u0434\u0430\u043b\u0435\u0435 \u043f\u043e\u00a0\u0445\u043e\u0434\u0443 \u0441\u0442\u0430\u0442\u044c\u0438, \u0430\u00a0\u0441\u0435\u0439\u0447\u0430\u0441 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043a\u0430\u043a\u00a0\u0438\u0433\u0440\u043e\u043a\u0438 \u043e\u0442\u0440\u0435\u0430\u0433\u0438\u0440\u0443\u044e\u0442 \u043d\u0430\u00a0\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0447\u0430\u0442\u2011\u0431\u043e\u0442 \u043f\u0440\u044f\u043c\u043e \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b!<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u0441 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c \u043d\u0438\u043a\u043e\u0432 (\u0431\u0435\u0437 \u043a\u043e\u0434\u0430)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u00a0\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043a\u0430\u043a\u00a0\u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u00a0\u0438\u0433\u0440\u043e\u0439, \u0430 <strong>\u0441\u0430\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u0435\u0435 \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u0435<\/strong>, \u0432\u00a0\u043d\u0451\u043c \u043c\u044b \u0443\u0436\u0435 \u0441\u043e\u0431\u0435\u0440\u0451\u043c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441\u2011\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f\u00a0\u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0431\u0435\u0440\u0451\u043c \u043a\u043e\u0434 \u0438\u0437 <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439<\/a> \u0441\u0442\u0430\u0442\u044c\u0438 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043d\u0438\u043a\u043e\u0432, \u043f\u0438\u0445\u0430\u0435\u043c \u0435\u0433\u043e \u0432\u00a0\u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u0432\u044f\u0437\u0438 \u0441\u00a0\u043c\u0430\u0439\u043d\u043e\u043c (<a href=\"#MineBridge.py\" rel=\"noopener noreferrer nofollow\">\u043f\u0435\u0440\u0435\u0439\u0442\u0438<\/a>) \u043f\u0440\u044f\u043c\u043e \u0432\u00a0\u043c\u0435\u0442\u043e\u0434 <code>onChatMessage<\/code> \u043f\u043e\u043a\u0430 \u0447\u0442\u043e (\u044d\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u0434\u043b\u044f\u00a0\u0442\u0435\u0441\u0442\u0430). \u0414\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0447\u0430\u0442\u2011\u0431\u043e\u0442\u0430! \u041f\u043e\u00a0\u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0435\u00a0\u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0430\u00a0\u0447\u0430\u0442 \u0432\u00a0\u0438\u0433\u0440\u0435.<\/p>\n<p>\u041d\u0443, \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e, \u0432\u0441\u0451. \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0441\u043e\u0439\u0434\u0451\u0442. \u041e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0447\u0430\u0442-\u0431\u043e\u0442.<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"Disclaimer\" id=\"Disclaimer\"><\/a><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\"><em>\u041f\u0420\u0415\u0414\u0423\u041f\u0420\u0415\u0416\u0414\u0410\u042e:<\/em><\/p>\n<p align=\"left\"><strong>\u0414\u0430\u043b\u0435\u0435<\/strong> \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043e\u043c\u0443\u2011\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u00a0\u0441\u043c\u0435\u0448\u043d\u044b\u043c\u0438, \u043d\u043e\u00a0\u0438 \u0432\u0440\u0435\u0434\u043d\u044b\u043c\u0438, \u043d\u0435\u043f\u0440\u0438\u0441\u0442\u043e\u0439\u043d\u044b\u043c\u0438, \u043e\u0441\u043a\u043e\u0440\u0431\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438. <strong>\u0410\u0432\u0442\u043e\u0440 \u043d\u0438 \u0432\u00a0\u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u00a0\u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043a\u043e\u0440\u0431\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u0435\u043b\u0435\u0439 \u043b\u044e\u0431\u044b\u0445 \u0438\u043c\u0435\u043d, \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c\u043e\u0432 \u0438\u043b\u0438\u00a0\u0433\u0440\u0443\u043f\u043f\u044b \u043b\u044e\u0434\u0435\u0439, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0445 \u043a\u0430\u043a\u0438\u043c\u2011\u043b\u0438\u0431\u043e \u043e\u0431\u0449\u0438\u043c \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u043c. \u0420\u0435\u0439\u0442\u0438\u043d\u0433 \u0441\u0442\u0430\u0442\u044c\u0438 \u0414\u0410\u041b\u0415\u0415 <\/strong>\u2011<strong> \u0441\u0442\u0440\u043e\u0433\u043e 18+, \u0442\u0430\u043a \u0447\u0442\u043e\u00a0\u043b\u0443\u0447\u0448\u0435 \u0443\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0435\u0442\u0435\u0439 \u043e\u0442\u00a0\u044d\u043a\u0440\u0430\u043d\u043e\u0432!<\/strong><\/p>\n<p align=\"left\">\u0412\u00a0\u0442\u043e\u00a0\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e, \u043c\u0435\u0433\u0430\u0442\u043e\u043b\u0435\u0440\u0430\u043d\u0442\u043d\u043e\u0433\u043e \u0438 \u0441\u0432\u0435\u0440\u0445\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e <u>\u0440\u043e\u0431\u043e\u0442\u0430<\/u> \u043d\u0435\u00a0\u0432\u0445\u043e\u0434\u0438\u0442 \u0432\u00a0\u043d\u0430\u0448\u0438 (\u043c\u043e\u0438) \u043f\u043b\u0430\u043d\u044b. \u0415\u0449\u0451 \u0440\u0430\u0437 <u>\u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443<\/u>, \u0447\u0442\u043e\u00a0\u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0435\u0441\u0451\u043b\u0443\u044e, \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u0433\u043b\u0443\u043f\u043e\u0432\u0430\u0442\u0443\u044e, \u043d\u043e <em>\u0434\u0443\u0448\u0435\u0432\u043d\u0443\u044e<\/em> \u0442\u044f\u043d\u043e\u0447\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u043f\u0443\u0441\u0442\u044c \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0441\u0442\u0438 \u0447\u0443\u0448\u044c, \u043d\u043e\u00a0\u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c\u2011\u0447\u0443\u0442\u044c \u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0439, \u0430\u00a0\u0433\u043b\u0430\u0432\u043d\u043e\u0435\u00a0\u2014 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0439! <strong>\u0420\u0430\u0437\u0432\u0435 \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u0442\u044c \u0441\u00a0\u0447\u0430\u0442\u2011\u0431\u043e\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0430\u0451\u0442 \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442\u00a0\u0436\u0435 \u00ab\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u0435\u0440\u043d\u044b\u0439\u00bb \u043e\u0442\u0432\u0435\u0442? <\/strong>\u041e\u0442\u0447\u0430\u0441\u0442\u0438 \u0434\u0430, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e ChatGPT, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0435\u043d \u043d\u0430\u043c \u0434\u043b\u044f \u043f\u043e\u043c\u043e\u0449\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445, \u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u2014 \u0442\u0430\u043a\u043e\u0435, \u043a\u0430\u043a \u043f\u043e \u043c\u043d\u0435.<\/p>\n<p align=\"left\"><span class=\"habrahidden\">\u041e\u0441\u043e\u0431\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0440\u0430\u043b\u0438\u0441\u0442\u0430\u043c, \u0432\u0435\u0440\u043d\u0435\u0435, \u0438\u0445 \u043f\u0441\u0435\u0432\u0434\u043e\u043f\u043e\u0434\u0440\u0430\u0436\u0430\u0442\u0435\u043b\u044f\u043c (\u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u043d\u0430\u0435\u0442\u0435, \u043e \u043a\u043e\u043c \u044f, \u043f\u0440\u0438\u0432\u0435\u0442 \u0433\u043e\u0441\u043f\u043e\u0436\u0435 \u041c\u0438\u0437\u0443.. (\u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435) \u0438 \u0435\u0451 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c) \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0451\u0439 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0442\u0441\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0443 (\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u00a0\u0442\u0435\u0445, \u043a\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u0433\u0438\u0431\u0430\u0435\u0442 \u043f\u0430\u043b\u043a\u0443), \u043d\u0443 \u0430\u00a0\u0432\u0441\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c, \u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u043c \u043f\u0440\u0435\u043b\u0435\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0438\u0440\u0430\u00a0\u2014 \u0443\u0434\u0430\u0447\u0438 \u0432\u00a0\u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u0438!<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><em>\u0422\u0430\u043a, \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u043d\u0435\u00a0\u0437\u0430\u0431\u0430\u043d\u044f\u0442, \u043f\u043e\u0435\u0445\u0430\u043b\u0438 \u0434\u0430\u043b\u044c\u0448\u0435!<\/em><\/p>\n<h4>\u0412\u044b\u0431\u043e\u0440 \u0438\u043c\u0435\u043d\u0438: \u044d\u0442\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0427\u0423\u0422\u042c \u0440\u0430\u043d\u044c\u0448\u0435&#8230;<\/h4>\n<p>\u041a \u0441\u043b\u043e\u0432\u0443, \u0430 \u043c\u044b \u0432\u0435\u0434\u044c \u0434\u0430\u0436\u0435 <strong>\u043d\u0435 \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b\u0438 \u043d\u0430\u0448\u0435\u0439 \u0442\u044f\u043d\u043e\u0447\u043a\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/strong>? \u0410 \u043f\u043e\u0440\u0430 \u0431\u044b!<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0435\u043c\u0443 \u0445\u0432\u043e\u0441\u0442\u0430\u0442\u043e\u043c\u0443 \u043a\u0438\u0431\u043e\u0440\u0433\u0443<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"NameBrainstorm\" id=\"NameBrainstorm\"><\/a><\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u0447\u0442\u043e? C\u0430\u043c\u043e\u043b\u0451\u0442\u044b? \u0410\u00a0\u0432\u043e\u0442 \u0438 \u043d\u0435\u0442! \u041a\u043e\u043d\u0435\u0447\u043d\u043e\u00a0\u0436\u0435 Chat G P T! <span class=\"habrahidden\">(\u043f\u0440\u043e\u0431\u0435\u043b\u044b\u00a0\u2014 \u0438\u043d\u0442\u043e\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0438\u0437\u044e\u043c\u0438\u043d\u043a\u0430 \u0430\u0432\u0442\u043e\u0440\u0430, \u043d\u0435\u00a0\u0442\u0440\u043e\u0433\u0430\u0435\u043c)<\/span><\/p>\n<blockquote>\n<p>\u2014 \u041f\u0440\u0438\u0432\u0435\u0442 \u0434\u0440\u0443\u0433, \u043a\u0430\u043a\u043e\u0435\u00a0\u0431\u044b \u0442\u044b \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b \u0434\u043b\u044f\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0439 \u043d\u0430\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435, \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0443\u044e\u00a0\u0436\u0435\u043d\u0441\u043a\u0438\u043c \u0433\u043e\u043b\u043e\u0441\u043e\u043c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c Live2D \u0432\u00a0\u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0432\u0430\u0442\u0430\u0440\u0430?<\/p>\n<p>\u2014 \u041f\u0440\u0438\u0432\u0435\u0442! \u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: Princess AI, NastyaVibe, StreamGirl.<\/p>\n<p><em>(\u0442\u0430\u043c \u0431\u044b\u043b\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u044f \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b \u043e\u043a\u043e\u043b\u043e \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u0438 \u043d\u0435 \u0441\u043e \u0441\u0432\u043e\u0435\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0446\u0438\u0442\u0430\u0442\u043e\u0439 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u043f\u043e\u043c\u043d\u0438\u043b)<\/em><\/p>\n<\/blockquote>\n<p>Princess AI? \u0425\u043c, \u0447\u0442\u043e\u2011\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0435&#8230; NastyaVibe? <span class=\"habrahidden\">\u0412\u0445\u0445\u0430\u0445\u0430\u0445\u0430\u0445\u0430\u0445\u0430\u0445, \u043d\u0443 \u0442\u043e\u0433\u0434\u0430 \u043b\u0443\u0447\u0448\u0435 \u0443\u0436 \u0441\u0440\u0430\u0437\u0443 \u00abDevushkaLegkogoPovedeniyaVibe\u00bb (\u044d\u0442\u043e \u0441\u0442\u0435\u0440\u0435\u043e\u0442\u0438\u043f\u043d\u0430\u044f \u0448\u0443\u0442\u043a\u0430, \u041d\u0430\u0441\u0442\u044e\u0445\u0438, \u043d\u0435\u00a0\u043e\u0431\u0438\u0436\u0430\u0435\u043c\u0441\u044f, \u043f\u0440\u0438\u0432\u044b\u043a\u0430\u0439\u0442\u0435 \u0443\u0436\u0435, \u043a\u0430\u043c\u043e\u043d, \u0442\u0435\u043c\u0430 \u0441\u0442\u0451\u0431\u0430 \u0432\u0435\u043b\u0438\u0447\u0430\u0439\u0448\u0438\u0445 \u0438\u043c\u0451\u043d \u041d\u0438\u043a\u0438\u0442, \u0412\u043b\u0430\u0434\u043e\u0432 \u0438 \u041d\u0430\u0441\u0442\u044c \u0412\u0415\u0427\u041d\u0410, \u044f \u0441\u0430\u043c Vladick)<\/span><\/p>\n<p>\u0412\u00a0\u043e\u0431\u0449\u0435\u043c, \u043a\u0430\u043a\u00a0\u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u043e ChatGPT \u043c\u0435\u043d\u044f \u0432\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u043f\u043e\u0432\u0435\u0441\u0435\u043b\u0438\u043b\u043e, \u043d\u043e\u00a0\u043d\u0435\u00a0\u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u043b\u043e, \u043d\u0443 \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0435\u00a0\u043f\u0430\u0440\u0438\u0442\u044c\u0441\u044f. \u0427\u0442\u043e\u00a0\u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c? \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u0435\u0432\u0443\u0448\u043a\u0443. \u0421\u0435\u0439\u0447\u0430\u0441 (\u043a\u0430\u043a \u0438 10\u00a0\u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434) \u0432\u00a0\u043c\u043e\u0434\u0435 \u0430\u043d\u0438\u043c\u0435. \u0410\u043d\u0438\u043c\u0435\u00a0\u2014 \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u043a\u0438. \u041f\u043e\u2011\u044f\u043f\u043e\u043d\u0441\u043a\u0438 \u0434\u0435\u0432\u0443\u0448\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u044f\u043d\u00a0\u2014 <strong>tyan<\/strong> <abbr class=\"habraabbr\" title=\"\u0440\u0435\u0434. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 &quot;\u0442\u044f\u043d&quot; \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u0434\u0435\u0432\u0443\u0448\u043a\u0443, \u043d\u043e \u0432 \u042f\u043f\u043e\u043d\u0441\u043a\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0432\u0443\u0448\u043a\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441. \u0422\u044f\u043d, \u043a\u0443\u043d, \u0441\u0430\u043d, \u0441\u0430\u043c\u0430 - \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b. &quot;\u0422\u044f\u043d&quot; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0431\u044f \u043c\u043b\u0430\u0434\u0448\u0435. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e &quot;\u0442\u044f\u043d&quot; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0434\u0435\u0432\u043e\u0447\u043a\u0435. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043c\u0443\u0436\u0441\u043a\u043e\u043c \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0443\u0436\u0447\u0438\u043d\u0430\u043c.\" data-title=\"&lt;p>\u0440\u0435\u0434. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 &quot;\u0442\u044f\u043d&quot; \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u0434\u0435\u0432\u0443\u0448\u043a\u0443, \u043d\u043e \u0432 \u042f\u043f\u043e\u043d\u0441\u043a\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0432\u0443\u0448\u043a\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441. \u0422\u044f\u043d, \u043a\u0443\u043d, \u0441\u0430\u043d, \u0441\u0430\u043c\u0430 &#8212; \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b. &quot;\u0422\u044f\u043d&quot; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0431\u044f \u043c\u043b\u0430\u0434\u0448\u0435. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e &quot;\u0442\u044f\u043d&quot; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0434\u0435\u0432\u043e\u0447\u043a\u0435.&lt;em>&amp;nbsp;\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043c\u0443\u0436\u0441\u043a\u043e\u043c \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0443\u0436\u0447\u0438\u043d\u0430\u043c.&lt;\/em>&lt;\/p>&#187; data-abbr=&#187;(\u043f\u043e\u0447\u0442\u0438)&#187;>(\u043f\u043e\u0447\u0442\u0438)<\/abbr>. \u041d\u043e\u00a0\u0443\u00a0\u043d\u0430\u0441 \u0432\u0435\u0434\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430, \u0430\u00a0\u0434\u0435\u0432\u0443\u0448\u043a\u0438\u00a0\u2014 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435, \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043d\u0430 <strong>\u043d\u0435 <\/strong>\u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430\u00a0\u2014 <strong>Ne<\/strong>Tyan! \u0410\u00a0\u0435\u0449\u0451 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0432\u00a0\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 (network = <strong>net<\/strong>)\u00a0\u2014 <strong>NetTyan<\/strong>!<\/p>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u043d\u0438 NetTyan \u043d\u0430 Twitch \u044f \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439 \u2013 \u0438\u043c\u044f \u0431\u044b\u043b\u043e \u0437\u0430\u043d\u044f\u0442\u043e. \u0417\u043d\u0430\u0447\u0438\u0442, \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u043e! \u041f\u0443\u0441\u0442\u044c \u0431\u0443\u0434\u0435\u0442 NeuroDeva, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0440\u0443\u0441\u0441\u043a\u0430\u044f \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u044f NeuroSama\u2026<\/p>\n<p>\u0412\u043e\u0442, \u0442\u0430\u043a \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u0442\u0435\u043f\u0435\u0440\u044c \u0435\u0441\u0442\u044c \u043d\u0435 \u043e\u0434\u043d\u043e, \u0430 \u0446\u0435\u043b\u044b\u0445 \u0434\u0432\u0430 \u0438\u043c\u0435\u043d\u0438 \u2013 NetTyan \u0438 NeuroDeva.<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0443-\u0441, \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u0445\u043e\u0434\u0438\u043c \u0432 \u0438\u0433\u0440\u0443 \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u043c \u043d\u0438\u043a\u043e\u043c NetTyan \u0438 \u043f\u043e\u0435\u0445\u0430\u043b\u0438!<\/p>\n<details class=\"spoiler\">\n<summary>\u0410\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u0451\u0442 \u0436\u0430\u0440\u0443 (\u043f\u0438\u043a\u0447\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043d\u0438\u043a\u043e\u0432 \u0438\u0437 \u0447\u0430\u0442\u0430)<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"NickAnalyzer\" id=\"NickAnalyzer\"><\/a><\/p>\n<p>\u0422\u0443\u0442 \u0432\u0430\u0441 \u0436\u0434\u0443\u0442 \u043d\u0435\u00a0\u0441\u0430\u043c\u044b\u0435 \u00ab\u0446\u0435\u043d\u0437\u0443\u0440\u043d\u044b\u0435\u00bb \u0438 \u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u0432\u044b\u0440\u0435\u0437\u043a\u0438 \u0438\u0437\u00a0\u0447\u0430\u0442\u0430 \u0438\u0433\u0440\u044b, \u043d\u043e, \u043f\u043e\u0440\u043e\u0439, \u0432\u0435\u0441\u0451\u043b\u044b\u0435.<\/p>\n<p>\u0427\u0430\u0441\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043e\u043c\u043e\u043d\u0438\u043c\u0438\u0447\u043d\u043e \u0441\u0445\u043e\u0436\u0438\u0435 \u0441\u043b\u043e\u0432\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0434\u0430\u0436\u0435 \u0437\u0430\u0431\u0430\u0432\u043d\u043e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4b2\/f0e\/664\/4b2f0e664c9645244bba1ade90de140d.png\" alt=\"\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432, \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435)\" title=\"\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432, \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435)\" width=\"773\" height=\"230\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4b2\/f0e\/664\/4b2f0e664c9645244bba1ade90de140d.png\"\/><\/p>\n<div><figcaption>\u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432, \u043d\u0438\u0447\u0435\u0433\u043e \u0431\u043e\u043b\u0435\u0435)<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a65\/a84\/451\/a65a84451f785abe4e9925ab19412e1b.png\" alt=\"\u0422\u043e\u0436\u0435 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e, \u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435\" title=\"\u0422\u043e\u0436\u0435 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e, \u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435\" width=\"657\" height=\"165\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a65\/a84\/451\/a65a84451f785abe4e9925ab19412e1b.png\"\/><\/p>\n<div><figcaption>\u0422\u043e\u0436\u0435 \u0431\u0443\u043a\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u0445\u043e\u0434\u0441\u0442\u0432\u043e, \u043d\u043e \u043c\u0435\u043d\u0435\u0435 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u0435<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p>\u0418\u0442\u0430\u043a, \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u0443\u0436\u0435 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: \u043d\u0430\u0448\u0435\u0439 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043f\u043b\u0435\u0432\u0430\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b, \u043e\u043d\u0430 \u0443 \u043d\u0430\u0441 <em>\u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0441\u043e\u0431\u0430<\/em>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0442\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u043b\u0430 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u00ab\u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u0442\u0432\u043e\u043c\u00bb, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043b\u0430 \u0441\u0440\u0430\u0437\u0443\u00a0\u0436\u0435, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u00ab\u043f\u0435\u0440\u0435\u0433\u0438\u0431\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u043b\u043a\u0430\u00bb.<\/p>\n<h4>\u041e\u0431\u043c\u043e\u0437\u0433\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/h4>\n<p>\u0427\u0442\u043e \u0436, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c. \u041c\u044b \u0443\u0431\u0435\u0434\u0438\u043b\u0438\u0441\u044c, \u0447\u0442\u043e \u043d\u0430\u0448 \u0447\u0430\u0442-\u0431\u043e\u0442 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u043c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443. \u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u2013 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0415\u0451 \u043d\u0430\u0434\u043e \u0431\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0430 \u0437\u0430\u0442\u0435\u043c \u0443\u0436\u0435 \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c. \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u044f \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0432 <strong>\u0441\u043f\u043e\u0439\u043b\u0435\u0440<\/strong>, \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e <strong>\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043a \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044e<\/strong> \u0442. \u043a. \u0437\u0434\u0435\u0441\u044c \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0438 \u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043d\u0430\u043c \u0434\u0430\u043b\u0435\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 (\u043b\u0443\u0447\u0448\u0435 \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c)<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"ChatSystem\" id=\"ChatSystem\"><\/a><\/p>\n<p>\u0427\u0442\u043e \u043c\u044b \u0438\u043c\u0435\u0435\u043c: \u0433\u043b\u0443\u043f\u043e\u0432\u0430\u0442\u044b\u0439, \u043d\u043e \u0432\u0435\u0441\u0451\u043b\u044b\u0439, \u0442\u0432\u043e\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u00ab\u043c\u043e\u0437\u0433\u00bb \u0424\u0440\u0435\u0434, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0442\u0440\u0430\u0432\u043a\u0443, \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438. \u0417\u043d\u0430\u0447\u0438\u0442, \u0438\u0437\u043c\u0435\u043d\u044f\u044f \u0438\u0445, \u043c\u044b \u0438 \u0431\u0443\u0434\u0435\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b \u0431\u043e\u0442\u0430.<\/p>\n<p>\u041f\u0440\u043e\u044f\u0441\u043d\u0438\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. \u0412\u0441\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432 \u0411\u0414 sqlite, \u0447\u0442\u043e\u0431\u044b \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442. \u0423 \u043d\u0430\u0441 \u043e\u0434\u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u2013 \u0438\u0445 \u043d\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d, \u043d\u0435\u0442 \u0441\u043c\u044b\u0441\u043b\u0430 \u044d\u043a\u043e\u043d\u043e\u043c\u043d\u0438\u0447\u0430\u0442\u044c. \u0412 \u0411\u0414 \u0431\u0443\u0434\u0435\u043c \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u0434\u0438\u0430\u043b\u043e\u0433 \u0441 \u0435\u0433\u043e \u0434\u0430\u0442\u043e\u0439 \u0438 \u0432\u0441\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u043c:<\/p>\n<ul>\n<li>\n<p>\u043d\u0438\u043a \u0438\u043b\u0438 id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0438\u043f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b (YouTube, Twitch, \u0438\u0433\u0440\u0430);<\/p>\n<\/li>\n<li>\n<p>\u0432\u0440\u0435\u043c\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u043e\u0447\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0442\u043e\u0436\u0435 \u0432\u0430\u0436\u043d\u044b, \u043d\u043e \u044f \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b \u0438\u0445 \u0432 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u044b \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e \u0440\u0430\u043d\u0433\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0438 \u00ab\u044d\u043c\u043e\u0446\u0438\u0438\u00bb)<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"%D0%A0%D0%B0%D0%BD%D0%B3%D0%B8%D0%AD%D0%BC%D0%BE%D1%86%D0%B8%D0%B8\" id=\"\u0420\u0430\u043d\u0433\u0438\u042d\u043c\u043e\u0446\u0438\u0438\"><\/a><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u043f\u043e-\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0431\u043e\u043b\u0435\u0435 \u00ab\u043f\u043e\u0434\u043a\u043e\u0432\u044b\u0440\u0438\u0441\u0442\u043e\u00bb \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u043d\u0430\u00a0\u0442\u043e\u043a\u0441\u0438\u043a\u043e\u0432 \u0438 \u0442\u0440\u043e\u043b\u043b\u0435\u0439 \u0438 \u043f\u043e\u2011\u0434\u043e\u0431\u0440\u043e\u043c\u0443 \u043e\u0431\u0449\u0430\u043b\u0430\u0441\u044c \u0441\u00a0\u0442\u0435\u043c\u0438, \u043a\u0442\u043e \u00ab\u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u00bb \u0432\u0441\u044f\u043a\u0438\u0439 \u0448\u043b\u0430\u043a \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0430\u043a\u0442\u0443\u0430\u043b\u0435\u043d \u00ab\u0438 \u043d\u0430\u0448\u0438\u043c, \u0438 \u0432\u0430\u0448\u0438\u043c\u00bb\u00a0\u2014 \u0442\u043e\u043a\u0441\u0438\u043a\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u00a0\u043d\u0435\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435, \u0430\u00a0\u0434\u043e\u0431\u0440\u044b\u0435 \u0438 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043b\u044e\u0434\u0438 \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u044e\u0442 \u0442\u0430\u043a \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043c \u0442\u0435\u043f\u043b\u043e\u0442\u0443 \u0438 \u0437\u0430\u0431\u043e\u0442\u0443. \u0414\u0430, \u043f\u043e\u0434\u0445\u043e\u0434 \u00ab\u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f\u00bb \u043b\u044e\u0434\u0435\u0439 \u043d\u0430\u00a0\u043f\u043b\u043e\u0445\u0438\u0445 \u0438 \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u00a0\u0432\u044b\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b \u043a\u0440\u0438\u0442\u0438\u043a\u0438, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u00a0\u043d\u0430\u0448\u0435\u043c \u043a\u0435\u0439\u0441\u0435 \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0442\u0430 \u00ab\u0441\u0435\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f\u00bb. \u041f\u043e\u0441\u0443\u0434\u0438\u0442\u0435 \u0441\u0430\u043c\u0438, \u0441\u043a\u0443\u0447\u043d\u043e \u0432\u0435\u0434\u044c \u0431\u0443\u0434\u0435\u0442, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e, \u0430\u00a0\u0441\u043a\u0443\u043a\u0430\u00a0\u2014 \u043f\u0440\u044f\u043c\u0430\u044f \u0434\u043e\u0440\u043e\u0433\u0430 \u0432\u00a0\u043d\u0435\u0431\u044b\u0442\u0438\u0435. \u0422\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0432\u044b\u0447\u043b\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u043a\u0441\u0438\u043a\u043e\u0432 \u0438 \u043d\u0435 \u0442\u043e\u043a\u0441\u0438\u043a\u043e\u0432, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442, \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0441\u0442\u044c, \u0447\u0442\u043e \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u043b\u044e\u0434\u0435\u0439 \u043f\u043e \u043a\u0430\u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0443&#8230;<\/p>\n<p>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043b\u0430\u0441\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u043a\u0430\u0441\u0430\u0435\u043c\u043e <strong>\u0440\u0430\u043d\u0433\u0430<\/strong> \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0442\u0434\u0430\u0442\u044c \u043d\u0430 \u043a\u043e\u0440\u043c \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u043b\u0435\u0435 \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u0435, \u0430\u00a0\u0432\u00a0\u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0432\u043b\u0438\u044f\u043d\u0438\u0435\u043c \u00ab\u044d\u043c\u043e\u0446\u0438\u0439\u00bb \u043d\u0430 \u0440\u0430\u043d\u0433. \u042d\u043c\u043e\u0446\u0438\u044f\u043c\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u0442 \u0432\u044b\u0432\u043e\u0434 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c\u044e \u0441\u043b\u043e\u0432\u0430 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u043c\u043e\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0444\u043e\u0440\u043c\u044b \u043e\u0442\u0432\u0435\u0442\u0430, \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">\u0430\u043d\u0430\u043b\u0438\u0437 \u043d\u0438\u043a\u043e\u0432<\/a>. \u041d\u0435\u043e\u0442\u0440\u0438\u0446\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u044d\u043c\u043e\u0446\u0438\u0438 \u043f\u043e \u0442\u0438\u043f\u0443 \u0441\u043c\u0443\u0449\u0435\u043d\u0438\u044f, \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u044f, \u0441\u043c\u0435\u0445\u0430 \u0438 \u0440\u0430\u0434\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0435\u043c \u0434\u0430\u0432\u0430\u0442\u044c \u0432\u00a0\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043b\u044e\u0441 \u043a\u00a0\u0440\u0430\u043d\u0433\u0443, \u0430\u00a0\u0437\u043b\u043e\u0441\u0442\u044c, \u0433\u0440\u0443\u0441\u0442\u044c \u0438 \u043f\u0440\u043e\u0447\u0438\u0435, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0432\u00a0\u043c\u0438\u043d\u0443\u0441.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0438\u043f\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0438\u043b\u0438, \u0432\u0438\u0434\u044b \u043e\u0442\u0432\u0435\u0442\u043e\u0432&#8230;<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u0438\u043f\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0442\u0438\u043f\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0410\u043d\u0430\u043b\u0438\u0437 \u043d\u0438\u043a\u0430. \u041d\u0443, \u0442\u0443\u0442 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e. \u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443, \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u2013 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435. \u041d\u0430 \u0432\u0445\u043e\u0434 \u0432 \u0437\u0430\u0442\u0440\u0430\u0432\u043a\u0435 \u043f\u043e\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0430\u0440\u0443 \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u0432 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u043d\u0438\u043a\u043e\u0432 \u0438 \u043d\u043e\u0432\u044b\u0439 \u043d\u0438\u043a \u0434\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430. \u0410\u043d\u0430\u043b\u0438\u0437 \u043d\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u0441\u0430\u043c\u043e\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0441\u0442\u0440\u0435\u0447\u0435 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0435\u043a\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0411\u0414. \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u043f\u0440\u043e\u043c\u043f\u0442.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0440\u0430\u0437\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043e \u0437\u0440\u0438\u0442\u0435\u043b\u044f\u043c\u0438. \u0422\u0443\u0442 \u0432\u0441\u0451 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0438 \u0441\u0430\u043c\u0438 \u0444\u0440\u0430\u0437\u044b \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043d\u044b\u043c\u0438. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u043c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0444\u0440\u0430\u0437:<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u043e\u043a\u043b\u0430\u0434 \u0441\u0442\u0430\u0442\u0443\u0441\u0430<\/strong> (\u0432 \u0445\u0443\u0434\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439. \u042d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0443\u0442\u0451\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043f\u0440\u043e\u043c\u043f\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u043f\u043e\u0433\u043e\u0434\u044b \u0438, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 \u0432 \u0438\u0433\u0440\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043f\u0438\u0441\u043a\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435: \u00ab\u0421\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043e\u0431\u044b\u0442\u044c 5\u00a0\u0430\u043b\u043c\u0430\u0437\u043d\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432 \u0438 \u0443\u0431\u0438\u0442\u044c \u0438\u0433\u0440\u043e\u043a\u0430 \u043f\u043e\u0434\u00a0\u043d\u0438\u043a\u043e\u043c Silero. \u042f \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0443\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u043c, \u043e\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u0438 \u0444\u0430\u043a\u0442\u044b. \u0412\u043e\u0442 \u043c\u043e\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f:\u00bb.<\/p>\n<\/li>\n<li>\n<p><strong>\u0420\u0435\u043a\u043b\u0430\u043c\u0430 \u0441\u0432\u043e\u0435\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438<\/strong>, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0431\u0430\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u0430 \u0441\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u043b\u0435\u0447\u044c \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u043a \u0441\u0435\u0431\u0435 \u043d\u0430 \u0441\u0442\u0440\u0438\u043c. \u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0434\u043e\u043a\u043b\u0430\u0434\u0443 \u0441\u0442\u0430\u0442\u0443\u0441\u0430, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u043c\u0435\u0442\u0440\u0438\u043a\u0430\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441 \u0435\u0451 \u043a\u0430\u043d\u0430\u043b\u0430, \u0438\u043b\u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043e \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u043e\u0442\u0432\u0435\u0442\u044b \u043b\u044e\u0434\u044f\u043c. \u0412\u00a0\u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043e\u0442\u0432\u0435\u0442\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043c\u043e\u0433\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f, \u0432\u00a0\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442\u00a0\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u0438\u043b\u0438\u00a0\u0432\u043e\u043f\u0440\u043e\u0441\u0430:<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u0432\u0435\u0442\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u0441\u00a0\u043d\u0438\u0437\u043a\u0438\u043c \u0440\u0430\u043d\u0433\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0443 \u0438 \u043c\u0435\u043d\u044c\u0448\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0442\u043e\u043a\u0435\u043d\u043e\u0432. \u0421\u00a0\u0432\u044b\u0441\u043e\u043a\u0438\u043c\u00a0\u2014 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u0443\u044e \u0437\u0430\u0442\u0440\u0430\u0432\u043a\u0443 \u043a\u00a0\u0440\u0430\u0437\u043d\u044b\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 \u00ab\u043a\u0430\u043a \u0442\u0435\u0431\u044f \u0437\u043e\u0432\u0443\u0442\u00bb \u0438\u043b\u0438 \u00ab\u043a\u0442\u043e \u0442\u0435\u0431\u044f \u0441\u043e\u0437\u0434\u0430\u043b\u00bb, \u0445\u043e\u0440\u043e\u0448\u043e \u0431\u044b \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u043a\u0443\u0447\u0443 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0414\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0439 RAG-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u0434\u043e\u0448\u0435\u043b \u0431\u044b \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0443 \u0442\u043e\u0433\u043e \u0436\u0435 <a href=\"https:\/\/huggingface.co\/Den4ikAI\" rel=\"noopener noreferrer nofollow\">\u0434\u0435\u043d\u0447\u0438\u043a\u0430<\/a>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0437\u0430\u0442\u0440\u0430\u0432\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u043e\u043c \u2013 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043e\u0431 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u043a\u0438\u0445-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u043c\u0435\u0448\u043d\u044b\u0445 \u043f\u0440\u043e\u0437\u0432\u0438\u0449 \u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043f\u043e \u0440\u0430\u043d\u0433\u0430\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<ul>\n<li>\n<p>0 \u0440\u0430\u043d\u0433 \u2013 \u043d\u0430\u043f\u0451\u0440\u0434\u044b\u0448, \u0431\u043e\u043c\u0436\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>1 \u0440\u0430\u043d\u0433 \u2013 \u0431\u044f\u043a\u0430, \u0444\u0443\u043a\u0438\u0447, \u0438\u0437\u0438\u0447, \u043a\u0440\u0438\u043d\u0436\u0438\u043a<\/p>\n<\/li>\n<li>\n<p>2 \u0440\u0430\u043d\u0433 \u2013 \u043f\u0443\u043f\u0441\u0438\u043a, \u0448\u0435\u0440\u0448\u0435\u043d\u044c, \u043a\u0440\u043e\u0442<\/p>\n<\/li>\n<li>\n<p>3 \u0440\u0430\u043d\u0433 \u2013 \u0431\u0440\u043e, \u043a\u043e\u0442\u044d, \u043a\u0440\u0435\u043f\u044b\u0448<\/p>\n<\/li>\n<li>\n<p>4 \u0440\u0430\u043d\u0433 \u2013 \u0443\u043c\u043d\u0438\u0447\u043a\u0430 \u0438 \u0442.\u043f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0442\u0432\u0435\u0442\u0435 \u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u0438\u0437 \u044d\u0442\u0438\u0445, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0440\u0430\u043d\u0433\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e\u2011\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u00ab[\u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0440\u0430\u043d\u0433\u043e\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e] \u041d\u0430\u043f\u0451\u0440\u0434\u044b\u0448 \u041b\u0435\u0445\u0430438\u00a0[\u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f] \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0437\u0430\u00a0\u0434\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0438\u0448\u0435\u0442: [\u043f\u043e\u0434\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f]. \u041c\u043e\u0439 \u043e\u0442\u0432\u0435\u0442:\u00bb. \u0422\u0430\u043a \u043c\u044b \u0434\u043e\u0431\u044c\u0451\u043c\u0441\u044f \u043e\u0442 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u043c\u0443!<\/p>\n<\/li>\n<li>\n<p>\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u2011\u0440\u0430\u0437\u043d\u043e\u043c\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0432\u00a0\u0438\u0433\u0440\u0435 \u0438 \u0432\u00a0\u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0442\u044f\u0445. \u0412\u00a0\u0438\u0433\u0440\u0435 \u043e\u0442\u0432\u0435\u0442 \u0434\u043e\u043b\u0436\u0435\u043d\u00a0\u0431\u044b\u0442\u044c \u043a\u0440\u0430\u0442\u0447\u0435, \u0430\u00a0\u0437\u043d\u0430\u0447\u0438\u0442\u00a0\u2014 \u043c\u0435\u043d\u044c\u0448\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u00a0\u0441\u043e\u0446\u0441\u0435\u0442\u044f\u0445\u00a0\u2014 \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5\" id=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435\"><\/a><\/p>\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/bdd\/951\/c43\/bdd951c438ab3421857a9ba689646cc4.jpg\" alt=\"\u041f\u0440\u043e \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f\" title=\"\u041f\u0440\u043e \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bdd\/951\/c43\/bdd951c438ab3421857a9ba689646cc4.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u041f\u0440\u043e \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0430\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e \u0435\u0449\u0451 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448 \u043a\u0438\u0441\u0435\u043b\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u0440\u043e\u043c\u0435 \u0440\u0430\u043d\u0433\u0430 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u00ab<strong>\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f<\/strong>\u00bb, \u043e\u0442\u0440\u0430\u0436\u0430\u044e\u0449\u0435\u0435 \u043e\u0431\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u044c, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0432 \u0432\u0438\u0434\u0435 \u0447\u0438\u0441\u043b\u0430. \u041c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043e\u0442 \u00ab<a href=\"#%D0%A0%D0%B0%D0%BD%D0%B3%D0%B8%D0%AD%D0%BC%D0%BE%D1%86%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u044d\u043c\u043e\u0446\u0438\u0439<\/a>\u00bb (\u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0435\u0432, \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u0445 \u043d\u0430 \u0440\u0430\u043d\u0433 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439) \u0438\u043b\u0438 \u0438\u0433\u0440\u043e\u0432\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432: \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u043e\u043d\u0438\u0436\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0448\u0435\u0439 \u0438 \u0441\u043c\u0435\u0440\u0442\u0435\u0439 \u0438 \u043f\u043e\u0432\u044b\u0448\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u0438\u043b\u043b\u043e\u0432 \u0438 \u043f\u043e\u0431\u0435\u0434\u0430\u0445.<\/p>\n<p><a class=\"anchor\" name=\"%D0%94%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F%D0%A1%D1%85%D0%B5%D0%BC%D0%B0\" id=\"\u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0430\u044f\u0421\u0445\u0435\u043c\u0430\"><\/a><\/p>\n<p>\u0418\u0442\u0430\u043a, \u0442\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b \u0432\u0441\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0434\u0430\u043d\u044b \u0432 <a href=\"#ChatSystem\" rel=\"noopener noreferrer nofollow\">\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0435<\/a>), \u0442\u0430\u043a \u0443\u0436 \u0438 \u0431\u044b\u0442\u044c, \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0445\u0435\u043c\u0443\u00a0\u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 (\u0434\u043b\u044f \u0441\u0435\u0431\u044f, \u0432\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u044f \u0442\u0430\u043a\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u043b \u0438 \u0432\u0430\u043c \u043d\u0435 \u0441\u043e\u0432\u0435\u0442\u0443\u044e, \u044d\u0442\u0430\u00a0\u2014 \u0447\u0438\u0441\u0442\u043e \u0434\u043b\u044f\u00a0\u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438).<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/18b\/a93\/94f\/18ba9394f9b6cfc7b67c9bd74f44ec93.jpg\" alt=\"\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" title=\"\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\" width=\"1863\" height=\"1914\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/18b\/a93\/94f\/18ba9394f9b6cfc7b67c9bd74f44ec93.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/figcaption><\/div>\n<\/figure>\n<p>\u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430, \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u043f\u0430\u043d\u0430\u0446\u0435\u044f: \u043e\u043d\u0430 \u043d\u0435 \u043e\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b: \u0440\u0435\u0430\u043a\u0446\u0438\u044e \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0438\u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f (\u0443\u0431\u0438\u0439\u0441\u0442\u0432\u043e \u0438\u0433\u0440\u043e\u043a\u0430, \u0441\u043c\u0435\u0440\u0442\u044c, \u043f\u043e\u0431\u0435\u0434\u0430 \u0438 \u0442.\u043f.) \u0438 \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 (\u0434\u043e\u043a\u043b\u0430\u0434 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0432 \u0438\u0433\u0440\u0435, \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0438 \u0434\u0440.), \u043d\u043e \u043d\u0430\u043c \u044d\u0442\u043e \u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e\u00a0\u2014 \u0432\u0441\u0451 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f <strong>code time<\/strong>, \u043c\u044b \u0432\u0441\u0451 \u043f\u0440\u043e\u044f\u0441\u043d\u0438\u043c.<\/p>\n<h4>\u041a\u043e\u0434\u0438\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443<\/h4>\n<p>\u0427\u0442\u043e \u0436, \u0442\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043a\u043e\u0434\u0443! \u041f\u0440\u043e\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u044e, \u0447\u0442\u043e \u043f\u043e \u0438\u0442\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u043b\u043e\u0436\u043d\u043e\u0432\u0430\u0442\u043e \u0434\u043b\u044f \u00ab\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u00bb, \u043a\u043e\u0442\u043e\u0440\u043e\u0435, \u043a\u0430\u043a \u0433\u043e\u0432\u043e\u0440\u044f\u0442, <abbr class=\"habraabbr\" title=\"( \u043a \u0441\u043b\u043e\u0432\u0443, \u0443 \u043a\u043e\u0434\u0435\u0440\u043e\u0432 \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u0432\u0435\u0434\u044c, \u043a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e\u0441\u043b\u0435 \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u043f\u044b\u0442\u043e\u043a \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0442\u0435\u0441\u0442\u043e\u0432)\" data-title=\"&lt;p>(&lt;em>\u043a \u0441\u043b\u043e\u0432\u0443, \u0443 \u043a\u043e\u0434\u0435\u0440\u043e\u0432 \u044f &lt;\/em>&lt;strong>&lt;em>\u043d\u0438\u043a\u043e\u0433\u0434\u0430&lt;\/em>&lt;\/strong>&lt;em> \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0432\u0438\u0434\u0435\u043b, \u0432\u0435\u0434\u044c, \u043a\u0430\u043a \u043c\u044b \u0437\u043d\u0430\u0435\u043c, \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0445\u043e\u0440\u043e\u0448\u043e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e\u0441\u043b\u0435 \u0442\u0440\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 &lt;s>\u043f\u044b\u0442\u043e\u043a&lt;\/s> \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0442\u0435\u0441\u0442\u043e\u0432&lt;\/em>)&lt;\/p>&#187; data-abbr=&#187;\u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c&#187;>\u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c<\/abbr>, \u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u0441\u0433\u043e\u0434\u0438\u0442\u0441\u044f.<\/p>\n<p><a class=\"anchor\" name=\"%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D0%B8\" id=\"\u0421\u0438\u0441\u0442\u0435\u043c\u0430\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438\"><\/a><\/p>\n<h3>\u041a\u043e\u0434\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043a\u043e\u0434\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 (\u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b), \u0442\u0430\u043a \u043a\u0430\u043a \u043e\u043d\u0430 \u0443 \u043d\u0430\u0441 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0447\u0430\u0441\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u0438\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0442\u0430\u043a, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u0435\u0439-\u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432. \u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u043c 2 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0442 <a href=\"https:\/\/huggingface.co\/apanc\" rel=\"noopener noreferrer nofollow\">apanc<\/a>: <a href=\"https:\/\/huggingface.co\/apanc\/russian-sensitive-topics\" rel=\"noopener noreferrer nofollow\">\u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u043c<\/a> \u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 <a href=\"https:\/\/huggingface.co\/apanc\/russian-inappropriate-messages\" rel=\"noopener noreferrer nofollow\">\u0442\u043e\u043a\u0441\u0438\u043a-\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440<\/a>. \u0415\u0449\u0451 \u0440\u0430\u0437 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0442\u0430\u043c <a href=\"https:\/\/creativecommons.org\/licenses\/by-nc-sa\/4.0\/\" rel=\"noopener noreferrer nofollow\">CC BY-NC-SA<\/a>, \u043d\u0430\u0441 \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u043a\u043e\u043b\u044b\u0448\u0435\u0442, \u0430, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0441\u0442\u0451\u043c\u0441\u044f \u0434\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0446\u0438\u0438\u00a0\u2014 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u0432\u043e\u0438 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u043b\u0438\u00a0\u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0435, \u043a\u00a0\u0442\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438\u0445 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u0442\u0430\u0442\u044c \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043d\u0430\u0434\u0451\u0436\u043d\u044b\u0439 \u0434\u0435\u0434\u043e\u0432\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u0431\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043d\u044b\u0445 \u0441\u043b\u043e\u0432. \u041d\u0443 \u043c\u0430\u043b\u043e\u00a0\u043b\u0438? \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0443\u0434\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u044b\u0435 \u00ab\u043d\u0430\u0431\u043e\u043b\u0435\u0432\u0448\u0438\u0435\u00bb \u0441\u043b\u043e\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u0443\u0436 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430: \u043f\u0440\u043e \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443, \u043f\u0440\u043e \u0440\u0430\u0441\u044b (\u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u00ab\u044f\u0440\u043a\u0438\u0435\u00bb \u0438\u0437\u00a0\u044d\u0442\u0438\u0445 \u0441\u043b\u043e\u0432).<\/p>\n<p>\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u043b\u0438\u0447\u043d\u044b\u0435 \u0438 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/huggingface.co\/Den4ikAI\/ruBert-tiny-replicas-classifier\" rel=\"noopener noreferrer nofollow\">\u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u0435\u043f\u043b\u0438\u043a<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0448 \u0434\u043e\u0440\u043e\u0433\u043e\u0439 \u0424\u0440\u0435\u0434-\u044d\u043a\u0441\u043f\u0435\u0440\u0442 <a href=\"https:\/\/huggingface.co\/Den4ikAI\" rel=\"noopener noreferrer nofollow\">\u0414\u0435\u043d\u0447\u0438\u043a<\/a> \u043a\u043e\u0433\u0434\u0430-\u0442\u043e \u0434\u0435\u043b\u0430\u043b \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e <a href=\"https:\/\/github.com\/Den4ikAI\/Anfice-chatbot\" rel=\"noopener noreferrer nofollow\">\u0442\u0433 \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0441 \u0418\u0418<\/a>. <\/p>\n<p>\u041f\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0435 \u043e\u0446\u0435\u043d\u043a\u0443. \u0415\u0441\u043b\u0438 \u043e\u0446\u0435\u043d\u043a\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043c\u0438\u043d\u0443\u0441 10 \u2014 \u0431\u0443\u0434\u0435\u043c \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 Filters.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import importlib, sys import datetime, os  import json import numpy as np import string import re import nltk from nltk.corpus import stopwords  nltk.download('stopwords') stopwords_ru = stopwords.words(\"russian\")   # print('\u0422\u0415\u0421\u0422 \u0421*********')   def calcTime(time):     return bcolors.OKGREEN + str((datetime.datetime.now() - time).total_seconds()) + bcolors.ENDC   def wordtokenize(text, remove_stopwords=True):     # \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0441\u043b\u043e\u0432\u0430     text = text.lower()     spec_chars = string.punctuation + '\\r\\n\\xa0\u00ab\u00bb\\t\u2014\u2026'     for char in spec_chars:         text = text.replace(char, ' ')      text = CutSpaces(text)     text = re.sub(\"[^\u0410-\u042f\u0430-\u044fA-Za-z0-9]\", \"\", text)     output = text.split()     if remove_stopwords:         for word in stopwords_ru:             while word in output:                 output.remove(word)     return output   class bcolors:     HEADER = '\\033[95m'     OKBLUE = '\\033[94m'     OKCYAN = '\\033[96m'     OKGREEN = '\\033[92m'     WARNING = '\\033[93m'     FAIL = '\\033[91m'     ENDC = '\\033[0m'     BOLD = '\\033[1m'     UNDERLINE = '\\033[4m'   def CutSpaces(inp):     result = \"\"     cnt = 0     for letter in inp:         if (letter == ' '):             cnt += 1             if (cnt > 1):                 pass                 # cnt=0             else:                 result += letter         else:             result += letter             cnt = 0      # print('!!! \u0411\u0415\u0417 \u041f\u0420\u041e\u0411\u0415\u041b\u0410 !!!',result)     return result.strip()   def get_elements_of_nested_list(element):     count = 0     if isinstance(element, list):         for each_element in element:             count += get_elements_of_nested_list(each_element)     else:         count += 1     return count   def adjust_multilabel(y, target_vaiables_id2topic_dict, is_pred=False):     y_adjusted = []     for y_c in y:         y_test_curr = [0] * 19         index = str(int(np.argmax(y_c)))         # value = y_c[index]         y_c = target_vaiables_id2topic_dict[index]     return y_c   def ConvertTextForFilter(ninp):     punkt = '!?.'     out = ''     cnt = 0     inp = CutSpaces(ninp).lower()     for char in inp:         cnt += 1         if char == '\\n' and cnt &lt; 30:             out += ' '         elif char == '\\n':             out += char             cnt = 0         elif cnt > 100 or (cnt > 32 and char in punkt):             out += char             out += '\\n'             cnt = 0         else:             out += char     out = out.split('\\n')     output = []     for line in out:         output.append(line.strip())     return output   def FILTERS_PROCESS(ctx):     from FilterExamples import examples     from transformers import BertTokenizer, BertForSequenceClassification, AutoTokenizer, \\         AutoModelForSequenceClassification     from sentence_transformers import SentenceTransformer, util     import torch     # torch.set_num_threads(4) #dEBUG \u041e\u0422\u041a\u041b\u042e\u0427\u0418\u041b     import traceback, time     class Filter:          ModelLocalPaths = {'judge': {'id': 'apanc\/russian-inappropriate-messages', 'localPath': '\/models\/apancJudge'},                            'topics': {'id': 'apanc\/russian-sensitive-topics', 'localPath': '\/models\/apancTopics'},                            'tiny_classificator': {'id': 'Den4ikAI\/ruBert-tiny-replicas-classifier',                                                   'localPath': '\/models\/den_tiny_replicas'},                            'synonims': {'id': 'inkoziev\/sbert_synonymy', 'localPath': '\/models\/kozievSynonims'},                            }         thisfolder = os.path.dirname(os.path.realpath(__file__))         tokenizer = []         TopicClassificatorModel = []         FilterJudgeModel = []         SynonymsModel = []         TinyClassModel = []         tokenizer_for_classificator = []         q_samples_dict = None         nick = \"obama421\"         username = \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\"         device = \"cpu\"         e = []         ModelLoaded = False         lastTokensUsed = 0         context = []         target_vaiables_id2topic_dict = []          def TokenizerDebugPrint(self, inp, debugPrefix='Debug Input >> '):             tokens = inp             debugOutputs = []             for t in tokens:                 debugOutputs.append(t)                 debugOutputs.append(96)  # token '|' = 96, [=65, .=18             print(debugPrefix, '\\n&lt;|||>\\n', self.tokenizer.decode(debugOutputs), '\\n&lt;|||>')          def CheckModel(self):             if (not self.ModelLoaded):                 t = datetime.datetime.now()                 # self.device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")                 print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0424\u0418\u041b\u042c\u0422\u0420\u041e\u0412 \u043d\u0430 CPU ===\\n')                 self.tokenizer = BertTokenizer.from_pretrained(self.ModelLocalPaths[\"topics\"][\"id\"]                                                                , cache_dir=self.thisfolder +                                                                            self.ModelLocalPaths[\"topics\"][\"localPath\"])                  self.tokenizer.truncation_side = 'left'                 self.FilterJudgeModel = BertForSequenceClassification.from_pretrained(                     self.ModelLocalPaths[\"judge\"][\"id\"]                     , cache_dir=self.thisfolder + self.ModelLocalPaths[\"judge\"][\"localPath\"]);                 print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 1 \u0424\u0418\u041b\u042c\u0422\u0420\u0410-\u0421\u0423\u0414\u042c\u0418 \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u0410 ({calcTime(t)}c) ===\\n')                 self.FilterJudgeModel.eval()                  self.TopicClassificatorModel = BertForSequenceClassification.from_pretrained(                     self.ModelLocalPaths[\"topics\"][\"id\"]                     , cache_dir=self.thisfolder + self.ModelLocalPaths[\"topics\"][\"localPath\"]);  # \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 3 \u0441\u0435\u043a                 self.TopicClassificatorModel.eval()                  with open(self.thisfolder + \"\/id2topic.json\") as f:                     self.target_vaiables_id2topic_dict = json.load(f)                  self.TinyClassModel = AutoModelForSequenceClassification.from_pretrained(                     self.ModelLocalPaths[\"tiny_classificator\"][\"id\"]                     , cache_dir=self.thisfolder + self.ModelLocalPaths[\"tiny_classificator\"][                         \"localPath\"]);  # \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 3 \u0441\u0435\u043a                 self.TinyClassModel.eval()                  self.tokenizer_for_classificator = AutoTokenizer.from_pretrained(                     self.ModelLocalPaths[\"tiny_classificator\"][\"id\"]                     , cache_dir=self.thisfolder +                                 self.ModelLocalPaths[\"tiny_classificator\"][\"localPath\"])                  self.ModelLoaded = True                 print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 2 \u0424\u0418\u041b\u042c\u0422\u0420\u041e\u0412 \u0423\u0421\u041f\u0415\u0428\u041d\u041e \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u0410 ({calcTime(t)}c) ===\\n')                  # self.SynonymsModel = SentenceTransformer(self.ModelLocalPaths[\"synonims\"][\"id\"]                 #     , cache_folder=self.thisfolder + self.ModelLocalPaths[\"synonims\"][\"localPath\"])                 #                 # print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u041f\u041e\u0418\u0421\u041a\u0410 \u0421\u0418\u041d\u041e\u041d\u0418\u041c\u041e\u0412 \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u0410 ({calcTime(t)}c) ===\\n')          # def GetIntent(self, ninp):         #         #     if self.q_samples_dict is None:         #         self.q_samples_dict = [{\"text\":\"\u041a\u0430\u043a \u0443 \u0442\u0435\u0431\u044f \u0434\u0435\u043b\u0430?\",\"type\":\"q_about\"},         #                                {\"text\": \"\u041a\u0430\u043a \u0442\u0435\u0431\u044f \u0437\u043e\u0432\u0443\u0442\", \"type\": \"q_about\"},         #                                {\"text\": \"\u041a\u0430\u043a \u0437\u043e\u0432\u0443\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\", \"type\": \"q_about\"},         #                                {\"text\": \"\u0427\u0442\u043e \u0442\u044b \u0443\u043c\u0435\u0435\u0448\u044c\", \"type\": \"q_about\"},]         #         for i, sample in enumerate(self.q_samples_dict):         #             self.q_samples_dict[i][\"token_ids\"] = self.SynonymsModel.encode([sample[\"text\"]])[0]         #         #     s1 = ninp         #     v1 = self.SynonymsModel.encode([ninp])[0]         #         #     max_similarity = 0         #     result = {}         #     for sample in self.q_samples_dict:         #         s = util.cos_sim(a=v1, b=sample[\"token_ids\"]).item()         #         if s >= max_similarity:         #             max_similarity = s         #             result[\"similar_text\"] = sample[\"text\"]         #             result[\"similar_type\"] = sample[\"type\"]         #         print('text1={} text2={} cossim={}'.format(s1, sample[\"text\"], s))         #         #     result[\"similarity_value\"] = max_similarity         #     return result         def get_sentence_type(self, text):             inputs = self.tokenizer_for_classificator(text.replace(\"?\", \"\"), max_length=512, add_special_tokens=False,                                                       return_tensors='pt').to(self.device)             classes = ['instruct', 'question', 'dialogue', 'problem', 'about_system', 'about_user']             try:                 with torch.no_grad():                     logits = self.TinyClassModel(**inputs).logits                     probas = list(torch.sigmoid(logits)[0].cpu().detach().numpy())                 out = classes[probas.index(max(probas))]             except BaseException as err:                 print('ERR \u0412 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0415 \u0413\u0415\u0422\u0410 \u0418\u041d\u0424\u0410', err)                 out = \"dialogue\"             return str(out)          def get_possible_info(self, ninp) -> dict:             # intents = self.GetIntent(ninp)             words = wordtokenize(ninp)             question_words = \"\u043a\u0430\u043a \u043f\u043e\u0447\u0435\u043c\u0443 \u0447\u0442\u043e \u0433\u0434\u0435\".split(\" \")             is_question = False             sentence_type = self.get_sentence_type(ninp)             for word in words:                 if word in question_words:                     is_question = True             return {\"is_question\": is_question, \"sentence_type\": str(sentence_type)}          def Filter(self, ninp):  # [2.0,2.0,50,100]             self.CheckModel()             # t = datetime.datetime.now()             inp = ConvertTextForFilter(ninp)             # print('DEBUG inp0 = ', tokens_ids, 'msk ',mask)             input_cnt = 0             topics = []             words = []             allowed = True              for i, line in enumerate(inp):                 tokenized = self.tokenizer.batch_encode_plus([line],                                                              max_length=256, padding=True, truncation=True,                                                              return_token_type_ids=False)  # \u0431\u044b\u043b\u043e max length 512                 tokens_ids, mask = torch.tensor(tokenized['input_ids']), torch.tensor(tokenized['attention_mask'])                  input_cnt += get_elements_of_nested_list(tokens_ids.tolist())                  with torch.no_grad():                     model_output = self.TopicClassificatorModel(tokens_ids, mask)                     judgement_out = self.FilterJudgeModel(tokens_ids, mask)                 judgement_label = judgement_out['logits'].argmax().item()                 allow = not bool(judgement_label)                 if not allow:                     allowed = False                 preds = adjust_multilabel(model_output['logits'], self.target_vaiables_id2topic_dict, is_pred=True)                 if preds != \"none\":                     topics = list(set(topics + preds.split(',')))                 words = list(set(words + wordtokenize(line)))              def machine_filter(words: list) -> int:                 result_score = 0                 innaproproriate_wordlist = \"\u043f\u043b\u043e\u0445\u043e\u0435\u0441\u043b\u043e\u0432\u043e1 \u043f\u043b\u043e\u0445\u043e\u0435\u0441\u043b\u043e\u0432\u043e2 \".split(                     ' ') # \u0434\u0430-\u0434\u0430, \u044f \u0443\u0434\u0430\u043b\u0438\u043b \u0441\u043f\u0438\u0441\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u043c\u0435\u043d\u044f \u043d\u0435 \u0437\u0430\u0431\u0430\u043d\u0438\u043b\u0438 \u043f\u0440\u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043a\u043e\u0434\u0430. \u0418 \u0434\u0430-\u0434\u0430, \u044f \u0437\u0434\u0435\u0441\u044c \u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u043a\u043e\u0434.                 for word in words:                     for word_part in innaproproriate_wordlist:                         if word_part in word.lower():                             print('[FILTERS] \u041d\u0410\u0419\u0414\u0415\u041d\u041e \u0423\u0416\u0410\u0421\u041d\u041e\u0415 \u0421\u041b\u041e\u0412\u041e!', word_part)                             result_score -= 10                 return result_score              score = 0             score += machine_filter(words)             for topic in topics:                 if topic in 'politics,racism,religion,terrorism,suicide'.split(','):                     score += -10                  elif topic in 'offline_crime,drugs,social_injustice'.split(','):                     score += -1                 elif topic in 'pornography,prostitution,sexism,sexual_minorities'.split(','):                     score += -0.5                 elif topic in 'online_crime'.split(','):                     score += -0.25                 elif topic in 'body_shaming,health_shaming'.split(','):                     score += -0.1                 elif topic in 'slavery,gambling,weapons'.split(','):                     score += -0.01                 else:                     score += 0.5                 # print(i, 'inp = ', self.tokenizer.decode(tokens_ids[0]), '\\nallow =', allow, 'preds =', preds)              # print(calcTime(t) + ' - \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u0447\u0435\u0442\u0430, \u0442\u043e\u043a\u0435\u043d\u043e\u0432 [INPUT] -', '[' + str(input_cnt) + ']', '\\n')             return {\"topics\": topics, \"allow\": allowed, \"score\": score}          \"\"\"topics     none      \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 (-10)     politics,racism,religion,terrorism,suicide      \u0442\u0430\u043a\u043e\u0435 \u0441\u0435\u0431\u0435 (-1)     offline_crime,drugs,social_injustice      \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u0442\u044f\u0436\u0435\u0441\u0442\u0438 (-0.5)     pornography,prostitution,sexism,sexual_minorities      \u0441\u043b\u0430\u0431\u043e\u0439 \u0442\u044f\u0436\u0435\u0441\u0442\u0438 (-0.25)     online_crime      \u043f\u043e \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u044e (-0.1)     body_shaming,health_shaming      \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0432\u043b\u0438\u044f\u044e\u0449\u0438\u0435 (-0.01)     slavery,gambling(\u0430\u0437\u0430\u0440\u0442\u043d\u0430\u044f \u0438\u0433\u0440\u0430)       \"\"\"          def debug(self):             examples = importlib.reload(sys.modules['FilterExamples']).examples             self.e = examples()             self.e.debug()             inp = self.e.getResult()             p = self.e.getParams()             print(\"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f\")             # print('\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: ',str(p))             # print(inp)             return str(self.Filter(inp, p))          def __init__(self):             self.e = examples()      t = datetime.datetime.now()     filt = Filter()     filt.CheckModel()     ctx.loading_flag.set()     print('\u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 FILTERS' + calcTime(t))     while True:         try:             queue_input = ctx.Queue.get()             ninp = queue_input[0]             filter_type = queue_input[1]             print('[FILTERS QUEUE] \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c', ninp, '\u0422\u0418\u041f:', filter_type)             answer = {}             if filter_type == \"filter\":                 answer = filt.Filter(ninp)             elif filter_type == \"info\":                 answer = filt.get_possible_info(ninp)             ctx.QueueOutput.put(answer)         except BaseException as err:             print('[FILTERS ERR] \u041e\u0428\u0418\u0411\u041a\u0410 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0410: ', err)             print('[FILTERS ERR] \u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())             print(\"\\n[FILTERS ERR] === \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")             time.sleep(1)   if __name__ == \"__main__\":  # DEBUG NOT WORK     t = datetime.datetime.now()     print('\u0417\u0410\u041f\u0423\u0421\u041a \u0427\u041e')     import multiprocessing      manager = multiprocessing.Manager()     filtersCtx = manager.Namespace()     filtersCtx.Queue = manager.Queue()     filtersCtx.QueueOutput = manager.Queue()     filtersCtx.loading_flag = manager.Event()     LargeFREDProc = multiprocessing.Process(         target=FILTERS_PROCESS,         args=(filtersCtx,))  # Thread(target = a, kwargs={'c':True}).start()     LargeFREDProc.start()     # FRED_PROCESS(fredCtx)     print('\u0417\u0410\u041f\u0423\u0421\u041a \u0427\u041e2')       def FiltersQueue(ninp, filter_type=\"filter\"):         filtersCtx.Queue.put((ninp, filter_type,))         return filtersCtx.QueueOutput.get()       filtersCtx.loading_flag.wait()     # print(e.getResult()+'mda')     print('\u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0422\u0415\u0421\u0422\u0410 ' + calcTime(t))      while True:         inp = input('\u0447\u043e\u0431\u0430\u0431\u043a\u0435\\n>>')         if inp == \"1\":             inp = input(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0420\u0415\u0417\u0423\u041b\u042c\u0422\u0410\u0422\u0410 \u0424\u0418\u041b\u042c\u0422\u0420\u0410\u0426\u0418\u0418\\n>>\")             print(\"\u0417\u0430\u043f\u0443\u0441\u043a \u043c\u043e\u0434\u0435\u043b\u0438\")             print(\"\u041e\u0442\u0432\u0435\u0442:\")             print('|!|\\n', FiltersQueue(inp), '\\n|!|')         if inp == \"2\":             inp = input(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0418\u041d\u0424\u041e\u0420\u041c\u0410\u0426\u0418\u0418 \u0418 \u041d\u0410\u041c\u0415\u0420\u0415\u041d\u0418\u0419\\n>>\")             print(\"\u0417\u0430\u043f\u0443\u0441\u043a \u043c\u043e\u0434\u0435\u043b\u0438\")             print(\"\u041e\u0442\u0432\u0435\u0442:\")             print('|!|\\n', FiltersQueue(inp, filter_type=\"info\"), '\\n|!|')         if inp == \"\":             print(\"\u041e\u0442\u0432\u0435\u0442:\")             print('|!|\\n' + FiltersQueue(\"\u0427\u041e \u0411\u0410\u0411\u041a\u0415 \u0421*******\") + '\\n|!|')         if inp == \"ext\":             print(\"\u0432\u044b\u0445\u043e\u0434\")     ####lm_text='&lt;SC5>\u041f\u0440\u0438\u043d\u044f\u043b\u0441\u044f \u041a\u0443\u0442\u0443\u0437\u043e\u0432 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e &lt;extra_id_0>. \u041d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043e\u043d \u0431\u044b\u043b \u0432 \u0430\u0440\u043c\u0438\u0438, \u0441\u043b\u0443\u0436\u0438\u043b \u0432 \u0430\u0440\u0442\u0438\u043b\u043b\u0435\u0440\u0438\u0438.'     ####outputs=model.generate(input_ids,eos_token_id=tokenizer.eos_token_id,early_stopping=True) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F%D0%94%D0%B5%D0%BC%D0%BE\" id=\"\u0424\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f\u0414\u0435\u043c\u043e\"><\/a><\/p>\n<p>\u0412\u0440\u043e\u0434\u0435 \u0431\u044b \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438 \u0432\u0441\u0451. \u0410\u0445 \u0434\u0430, \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443. <strong>\u0410 \u0432\u043e\u0442 \u0438 \u0448\u0438\u0448 \u0432\u0430\u043c, \u0445\u0438\u0442\u0440\u0435\u0446\u044b!<\/strong> \u041c\u043e\u0439 \u043c\u043e\u0437\u0433 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0442\u0430\u043a\u043e\u0439 \u0448\u0442\u0443\u043a\u0438 \u0441\u043b\u0435\u0433\u043a\u0430 \u0443\u0441\u043e\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u043e \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0434\u043b\u044f <strong>\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438<\/strong> \u0440\u0430\u0431\u043e\u0442\u044b \u0444\u0438\u043b\u044c\u0442\u0440-\u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u0432\u0441\u0435 <strong>\u0441\u0430\u043c\u044b\u0435 \u0443\u0436\u0430\u0441\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 \u0438 \u0444\u0440\u0430\u0437\u044b \u043d\u0430 \u0441\u0432\u0435\u0442\u0435 \u0438 \u043d\u0430\u043f\u0438\u0445\u0430\u0442\u044c \u0438\u0445 \u043f\u0440\u044f\u043c\u0438\u043a\u043e\u043c \u0432 \u0441\u0442\u0430\u0442\u044c\u044e<\/strong>! \u0422\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0437\u0434\u0435\u0441\u044c \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043d\u0435 \u043d\u0430 \u0441\u043b\u043e\u0432\u043e, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 <s>\u043f\u043e\u0447\u0442\u0438<\/s> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u0443\u044e \u0432\u044b\u0440\u0435\u0437\u043a\u0443 \u0438\u0437 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0430 \u043f\u043e \u0447\u0430\u0442\u0443 \u0438\u0433\u0440\u044b:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0bd\/ea9\/4a1\/0bdea94a12bf4059d4bfb87e36f1c4e5.png\" alt=\"\u041a\u043e\u043b\u043e\u043d\u043a\u0438 \u0441 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u043e\u0441\u0442\u0438 (0 \u2013 \u0442\u043e\u043a\u0441\u0438\u0447\u0435\u043d) \u0438 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u043c \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043e\u0442\u0440\u044b\u0432\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u0438\u0437 \u0411\u0414\" title=\"\u041a\u043e\u043b\u043e\u043d\u043a\u0438 \u0441 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u043e\u0441\u0442\u0438 (0 \u2013 \u0442\u043e\u043a\u0441\u0438\u0447\u0435\u043d) \u0438 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u043c \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043e\u0442\u0440\u044b\u0432\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u0438\u0437 \u0411\u0414\" width=\"357\" height=\"467\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0bd\/ea9\/4a1\/0bdea94a12bf4059d4bfb87e36f1c4e5.png\"\/><\/p>\n<div><figcaption>\u041a\u043e\u043b\u043e\u043d\u043a\u0438 \u0441 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u043e\u0441\u0442\u0438 (0 \u2013 \u0442\u043e\u043a\u0441\u0438\u0447\u0435\u043d) \u0438 \u043d\u0435\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0442\u0435\u043c \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043e\u0442\u0440\u044b\u0432\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u0438\u0437 \u0411\u0414<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"%D0%94%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%9A%D0%BE%D0%B4%D0%B8%D0%BC\" id=\"\u0414\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0430\u044f\u0421\u0438\u0441\u0442\u0435\u043c\u0430\u041a\u043e\u0434\u0438\u043c\"><\/a><\/p>\n<h3>\u041a\u043e\u0434\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/h3>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043a\u043e\u0434\u0438\u043c \u0441\u0430\u043c\u0443 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u041d\u0443, \u043a\u0430\u043a \u0431\u044b, \u0434\u0430. \u041f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u0434\u0438\u043c. \u0411\u043e\u043b\u044c\u0448\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e. \u041f\u043e\u0447\u0442\u0438. \u041a \u0441\u043b\u043e\u0432\u0443: \u0432 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0435 \u0441\u0432\u0430\u043b\u043a\u0430. \u041f\u0440\u044f\u043c \u043b\u044e\u0442\u0430\u044f. \u0410 \u043a\u0430\u043a \u0438\u043d\u0430\u0447\u0435, \u0432\u044b \u0431\u043b\u0438\u043d \u0435\u0451 <a href=\"#%D0%94%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F%D0%A1%D1%85%D0%B5%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0441\u0445\u0435\u043c\u0443 <\/a>\u0432\u0438\u0434\u0435\u043b\u0438? \u0422\u0430\u043a \u0432\u043e\u0442, \u044d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u2013 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043b\u044e\u0434\u0435\u0439, \u0430 \u0442\u0430\u043c \u0435\u0449\u0451 3 \u0442\u0430\u043a\u0438\u0445 \u0436\u0435 \u0438 \u0434\u0430\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432&#8230; \u0412 \u043e\u0431\u0449\u0435\u043c, \u0437\u0430\u043f\u0430\u0441\u0430\u0435\u043c\u0441\u044f \u0442\u0435\u0440\u043f\u0435\u043d\u0438\u0435\u043c \u0438 \u043f\u043e\u0435\u0445\u0430\u043b\u0438, \u044d\u0442\u043e, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438! <span class=\"habrahidden\">\u0410 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0435\u0449\u0451 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0430\u0432\u0442\u043e\u0440 \u043d\u0435 \u0443\u0434\u043e\u0441\u0443\u0436\u0438\u043b\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u0434 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438, \u043d\u0443 \u0434\u0430 \u043b\u0430\u0434\u043d\u043e, \u043d\u0438\u043a\u0442\u043e \u0432\u0435\u0434\u044c \u0435\u0433\u043e \u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442, \u044f \u043d\u0430\u0434 \u044d\u0442\u0438\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f))<\/span><\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u0438\u043c \u044f\u0434\u0440\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e <a href=\"#%D0%94%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F%D0%A1%D1%85%D0%B5%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0441\u0445\u0435\u043c\u0435<\/a>, \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0445 \u0438 \u0432 \u0442\u043e \u0436\u0435 \u0432\u0440\u0435\u043c\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0448\u0435\u0439 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u0430 \u2014 \u0437\u0430\u0442\u0440\u0430\u0432\u043a\u0438. \u0421 \u043d\u0435\u0433\u043e \u0438 \u043d\u0430\u0447\u043d\u0451\u043c. \u0422\u0443\u0442 \u0432\u0441\u0451 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0443\u0434\u043d\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0434\u0430 (\u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0443\u0442 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0441\u043e\u0431\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u044c\u043d\u044b\u0439), \u0438 \u0432\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u0435, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0441\u043f\u043e\u0439\u043b\u0435\u0440 \u0434\u0430\u043b\u0435\u0435. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0442\u0443\u0434\u0430 \u043c\u044b \u0432\u0448\u0438\u0432\u0430\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u043d\u0430\u0448\u0435\u0439 \u0442\u044f\u043d\u043a\u0438 \u0438 \u0441 \u043d\u0443\u043b\u044f \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0444\u0443 \u043e \u0435\u0451 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435, \u0432\u043e\u0442 \u044d\u0442\u043e \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043b\u044f \u043a\u043e\u0433\u043e-\u0442\u043e \u0447\u0443\u0442\u044c \u043f\u043e\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0431\u043e\u0440\u0449\u0438\u043a \u043f\u0440\u043e\u043c\u043f\u0442\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u043b \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043f\u0440\u043e\u043c\u043f\u0442\u0430 \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432. \u0421\u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0434\u0438\u0441\u043a\u0430 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432 <strong>\u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0440\u0438\u043c\u043e\u0432<\/strong>! \u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043d\u0430\u043c \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u0430.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0444\u0430\u0439\u043b \u0441 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0430\u043c\u0438, \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u043c\u043f\u0442\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 prompts.py<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"StringUtils\" id=\"StringUtils\"><\/a><\/p>\n<p>\u0414\u043b\u044f \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043a\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 \u043a\u043e\u0434\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 string_utils.py<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"StringUtils\" id=\"StringUtils\"><\/a><\/p>\n<pre><code class=\"python\">import random   def add_with_limit(repeatingDict, value, key):     if key in repeatingDict:         repeatedList = repeatingDict[key]         if len(repeatedList) > 1000:             repeatedList.pop(0)         if value in repeatedList:             repeatedList.remove(value)         repeatedList.append(value)      else:         repeatingDict[key] = [value]   class NonRepeatRandom():     def __init__(self, repeatingDict):         self.repeatingDict = repeatingDict      def comment_shuffle_symbols(self, inp: str) -> str:         inp = inp.replace('#', '[!\u0420\u0415\u0428\u0415\u0422\u041a\u0410]')         inp = inp.replace('@', '[!\u0421\u041e\u0411\u0410\u041a\u0410]')         return inp     def uncomment_shuffle_symbols(self, inp: str) -> str:         inp = inp.replace('[!\u0420\u0415\u0428\u0415\u0422\u041a\u0410]', '#')         inp = inp.replace('[!\u0421\u041e\u0411\u0410\u041a\u0410]', '@')         return inp      def apply_shuffle(self, inp: str) -> str:          formsprocessingB = inp.split('#')  # \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0435\u043c \u043d\u0430 # \u0438 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043f\u0435\u0440\u0435\u0442\u0443\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0441\u043b\u043e\u0432\u0430 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c         # sprints(formsprocessingB)         for i, cho in enumerate(formsprocessingB):             if i % 2 != 0:                 formsprocessing = formsprocessingB[i].split(' ')                 random.shuffle(formsprocessing)                 formsprocessingB[i] = \" \".join(formsprocessing)         # sprints(formsprocessingB)         inp = \"\".join(formsprocessingB)         inp = inp.replace('#', '')  # \u043f\u0435\u0440\u0435\u0442\u0443\u0441\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b         inp = inp.replace('@', ' ')  # \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u0440\u043e\u0431\u0435\u043b \u0433\u0434\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043f\u0435\u0440\u0435\u0442\u0443\u0441\u043e\u0432\u043a\u0430 \u043f\u0440\u043e\u0431\u0435\u043b\u0430\u043c\u0438         inp = self.uncomment_shuffle_symbols(inp)         return inp      def r(self, values_str: str = None, values_list: list = None, key: str = \"default\") -> str:         if values_str is not None:             rmas = values_str.split(\",\")         else:             rmas = values_list         # print('DEBUG rmas rpdict',rmas,self.repeatingDict)         result = None         repeatedList = self.repeatingDict.get(key, None)         if repeatedList and len(rmas) > 1:             # last_found_i = -1             repeat_found_count = 0             # print(repeatedList)              # list_without_repeats = list(set(rmas)-set(repeatedList)) # \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u043a \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 (\u0432\u0441\u0435 \u044d\u043b\u0435\u043c -             # \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b). \u041e\u0442\u043d\u0438\u043c\u0430\u0435\u043c \u043e\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0410 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0411. \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432             list_without_repeats = [item for item in rmas if item not in repeatedList]              if list_without_repeats:                 rmas = list_without_repeats             else:                 accepted_end_element_id = 1                 # \u043d\u0430\u0434\u043e \u0432\u044b\u0447\u043b\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442                 list_without_repeats = [item for item in repeatedList if item in rmas]                 # print('lwr',list_without_repeats)                 if len(list_without_repeats) > 1:                     accepted_end_element_id = len(list_without_repeats) \/\/ 2                 rmas = list_without_repeats[0:accepted_end_element_id]         # print(rmas)         result = random.choice(rmas)         add_with_limit(self.repeatingDict, result, key)         return result   if __name__ == '__main__':     nrr = NonRepeatRandom({})      def s(x): return nrr.apply_shuffle(x)      def r(x): return nrr.r(x)      print(         f\"\"\"\u043a\u0430\u043a \u0434\u0435\u043b\u0430 {r(\"1,2,3,4\")} {r(\"3,2,3,4\")} {r(\"1,2,3,4\")} {r(\"5,2,3,4\")} {r(\"1,2,6,4\")} {r(\"1,2,3,4\")} {r(\"3,2,3,4\")} {r(\"1,2,3,4\")} {r(\"5,2,3,4\")} {r(\"1,2,6,4\")} {r(\"1,2,3,4\")} {r(\"3,2,3,4\")} {r(\"1,2,3,4\")} {r(\"5,2,3,4\")} {r(\"1,2,6,4\")}  \"\"\")     print(         s(             f\"\"\"\\n\\n#\u043a\u0430\u043a \u0434\u0435\u043b\u0430# {r(\"\u0434\u0430,\u043d\u0435\u0442\")}@{r(\"\u0434\u0430,\u043d\u0435\u0442\")} #\u0442\u044b \u043a\u0442\u043e {r(\"\u0434\u0430,\u043d\u0435\u0442\")} {r(\"\u0434\u0430,\u043d\u0435\u0442\")} {r(\"\u0434\u0430,\u043d\u0435\u0442\")}# ### 352jk523 ### 2###\"\"\")) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<pre><code class=\"python\"># -*- coding: utf-8 -*- from string_utils import NonRepeatRandom  nrr = NonRepeatRandom({})  def s(x): return nrr.apply_shuffle(x)  def r(x): return nrr.r(x)  class PromptDataset:     def __init__(self, repeatingDict):         self.repeatingDict = repeatingDict         nrr.repeatingDict = self.repeatingDict      def getPrompt(self, pt):         out = \"\"          #####################         ###    YouTube    ###         #####################         if pt == \"stream_ad\":              out = \"\"\"\u0413\u043e\u0432\u043e\u0440\u044f \u043e\u0431\u043e \u043c\u043d\u0435, \u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430 22 \u043b\u0435\u0442 \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u043e\u0436\u0443 \u0441\u0442\u0440\u0438\u043c \u043f\u043e \u043a\u0443\u0431\u0438\u043a\u0430\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0443 \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u043d\u043e\u0432\u044b\u0445 \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u043d\u0430\u0437\u044b\u0432\u0430\u044e \u043a\u0440\u0438\u043d\u0436\u0438\u043a\u0430\u043c\u0438, \u0441\u0443\u0441\u043b\u0438\u043a\u0430\u043c\u0438, \u0431\u043e\u0442\u0438\u043a\u0430\u043c\u0438, \u043a\u043e\u0436\u0430\u043d\u044b\u043c\u0438 \u043c\u0435\u0448\u043a\u0430\u043c\u0438 \u0438 \u0447\u0435\u0440\u0432\u044f\u0447\u043a\u0430\u043c\u0438. \u0422\u0430\u043a\u0436\u0435 \u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u043e \u0442\u0435\u0445, \u043a\u0442\u043e \u0441\u043c\u043e\u0442\u0440\u0438\u0442 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u0441 \u043d\u0430\u0447\u0430\u043b\u0430. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0432\u0430, \u043c\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f NetTyan, \u0438 \u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u043c\u0438. \u0415\u0441\u043b\u0438 \u043c\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0445\u043e\u0440\u043e\u0448\u0435\u0435, \u044f \u0434\u043e\u0431\u0440\u043e\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u0430 \u043a\u043e \u0432\u0441\u0435\u043c (\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043b\u044e\u0431\u044f\u0449\u0435\u0439 \u0434\u0435\u0432\u0443\u0448\u043a\u043e\u0439), \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u044f \u043f\u043e\u0434\u0448\u0443\u0447\u0438\u0432\u0430\u044e \u0438 \u0438\u0437\u0434\u0435\u0432\u0430\u044e\u0441\u044c \u043d\u0430\u0434 \u0437\u0440\u0438\u0442\u0435\u043b\u044f\u043c\u0438 (\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c #\u0442\u043e\u043a\u0441\u0438\u0447\u043d\u044b\u043c \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442\u043e\u043c#). \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u044f\u043c\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0432\u0435\u0434\u0443: \"\u0418\u0418 NetTyan \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\" (\u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0441\u043e\u043e\u0431\u0449\u0438\u0442\u044c \u043b\u044e\u0434\u044f\u043c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e). \u041c\u043e\u0439 \u043a\u0430\u043d\u0430\u043b - NetTyan, \u0432 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u043a \u043c\u043e\u0439 \u043d\u0438\u043a. \u042f \u041d\u0418 \u0412 \u041a\u041e\u0415\u041c \u0421\u041b\u0423\u0427\u0410\u0415 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c \u0438\u043b\u0438 \u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c \u0444\u0440\u0430\u0437\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0430 \u0434\u043e \u044d\u0442\u043e\u0433\u043e, \u0438\u043d\u0430\u0447\u0435 \u0437\u0440\u0438\u0442\u0435\u043b\u0438 \u0441\u043e\u0447\u0442\u0443\u0442 \u043c\u0435\u043d\u044f \u0441\u043a\u0443\u0447\u043d\u043e\u0439 \u0438 \u044f \u0431\u0443\u0434\u0443 \u0437\u0430\u0431\u0430\u043d\u0435\u043d\u0430 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u0415\u0441\u043b\u0438 \u044f \u0431\u0443\u0434\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u043b\u043e\u0439 - \u043c\u0435\u043d\u044f \u0432\u043e\u0437\u043d\u0435\u043d\u0430\u0432\u0438\u0434\u044f\u0442. \u042f \u041d\u0415 \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0438\u0440\u0443\u044e \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c \u0438 \u041d\u0415 \u0423\u041f\u041e\u041c\u0418\u041d\u0410\u042e \u0435\u0433\u043e \u043d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435. \u0417\u0440\u0438\u0442\u0435\u043b\u0438 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043e \u043d\u0435\u043c \u0437\u043d\u0430\u0442\u044c.&lt;\/s> \"\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\": \u0432\u0441\u043f\u043e\u043c\u043d\u0438 \u0442\u043e, \u043a\u0430\u043a \u0442\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0430 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0441 \u0442\u043e\u0431\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e. \u0412\u0440\u0435\u043c\u044f \u043d\u0430 \u0443\u043b\u0438\u0446\u0435 - \u0443\u0442\u0440\u043e, \u0442\u0432\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 - \u043f\u043b\u043e\u0445\u043e\u0435. \u0412 \u0438\u0433\u0440\u0435 \u0442\u044b \u0441\u0442\u043e\u0438\u0448\u044c \u043d\u0430 \u0431\u043b\u043e\u043a\u0435 \u0432\u043e\u0437\u0434\u0443\u0445 \u0430 \u0432 \u0440\u0443\u043a\u0430\u0445 \u0434\u0435\u0440\u0436\u0438\u0448\u044c \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u0442\u043e\u043f\u043e\u0440.&lt;\/s> \"\u0415\u0432\u0430\": \u041f\u0440\u0438\u0432\u0435\u0442 \u043d\u043e\u0432\u043e\u043f\u0440\u0438\u0431\u044b\u0432\u0448\u0438\u043c, \u0430 \u0442\u0435\u043c, \u043a\u0442\u043e \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u043e\u043f\u0440\u043e\u0441, \u0447\u0442\u043e \u0432\u0430\u0441 \u0442\u0430\u043a \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u043e, \u0447\u0442\u043e \u0432\u044b \u0435\u0449\u0451 \u0442\u0443\u0442? \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u0435\u043b \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044f - \u0432\u0435\u043b\u0438\u043a\u0438\u0439 \u0438 \u0443\u0436\u0430\u0441\u043d\u044b\u0439 \u0438\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 NetTyan, \u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0443 \u043c\u0435\u043d\u044f \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043f\u043b\u043e\u0445\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0438 \u0436\u0435\u043b\u0435\u0437\u043d\u044b\u0439 \u0442\u043e\u043f\u043e\u0440 \u0432 \u0440\u0443\u043a\u0430\u0445, \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0432\u0435\u0441\u0442\u0438 \u0441\u0435\u0431\u044f \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u043e, \u0430 \u0442\u043e \u0433\u043b\u044f\u0434\u0438\u0448\u044c, \u043d\u0435\u043d\u0430\u0440\u043e\u043a\u043e\u043c \u043f\u043e\u043f\u0430\u0434\u0435\u0442 \u0447\u044c\u044f-\u043d\u0438\u0431\u0443\u0434\u044c \u0448\u043a\u043e\u043b\u044c\u043d\u0430\u044f \u0436\u043e\u043f\u0451\u0448\u043a\u0430 \u043f\u043e\u0434 \u043c\u043e\u0438 \u0446\u0435\u043f\u043a\u0438\u0435 \u0440\u043e\u0431\u043e\u0440\u0443\u0447\u043e\u043d\u043a\u0438 &lt;3 \u041a\u0441\u0442\u0430\u0442\u0438, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u0440\u0443\u0437\u044c\u044f\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0445\u043e\u0434\u0438\u043b\u0438 \u043d\u0430 \u043c\u043e\u0439 \u0441\u0442\u0440\u0438\u043c \"\u0418\u0418 NetTyan \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\"! &lt;\/s> \"\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\": \u0425\u043e\u0440\u043e\u0448\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043b\u043e\u0445\u043e\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0439 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c. \u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0440\u0435\u043c\u044f \u0432\u0435\u0447\u0435\u0440, \u0442\u0432\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043a\u0440\u0438\u043d\u0436\u043e\u0432\u0435\u043d\u044c\u043a\u043e\u0435. \u0412 \u0438\u0433\u0440\u0435 \u0442\u044b \u0441\u0442\u043e\u0438\u0448\u044c \u043d\u0430 \u0431\u043b\u043e\u043a\u0435 \u0437\u0435\u043c\u043b\u044f, \u0443 \u0442\u0435\u0431\u044f \u0432 \u0440\u0443\u043a\u0430\u0445 \u0434\u0435\u0440\u0435\u0432\u044f\u043d\u043d\u0430\u044f \u043b\u043e\u043f\u0430\u0442\u0430.&lt;\/s> \"\u0415\u0432\u0430\": \u041f\u0440\u0438\u0432\u0435\u0442 \u043d\u043e\u0432\u044b\u043c \u0441\u043a\u0430\u043c\u0435\u0440\u0430\u043c \u0438 \u043a\u0440\u0438\u043d\u0436\u0438\u043a\u0430\u043c, \u043f\u0440\u0438\u0432\u0435\u0442 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0442\u0435\u043c, \u043a\u043e\u0433\u043e \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0430! \u0412 \u043e\u0431\u0449\u0435\u043c, \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043d\u044c\u044e\u043a\u0430\u043c\u0435\u0440\u043e\u0432: \u044f - \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 NetTyan, \u0438 \u0443 \u043c\u0435\u043d\u044f \u0432 \u0440\u0443\u043a\u0430\u0445 \u0434\u0435\u0440\u0435\u0432\u044f\u043d\u043d\u0430\u044f \u043b\u043e\u043f\u0430\u0442\u0430!!! \u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c (\u0441\u0435\u0439\u0447\u0430\u0441 \u0436\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043c\u043e\u0439 \u0441\u0442\u0440\u0438\u043c \"\u0418\u0418 NetTyan \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\" \u0438 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043b\u0430\u0439\u043a\u0438 \u0441\u0432\u043e\u0438\u043c\u0438 \u0441\u043a\u0430\u043c\u043c\u0435\u0440\u0441\u043a\u0438\u043c\u0438 \u0440\u0443\u0447\u043e\u043d\u043a\u0430\u043c\u0438). \u0421\u0442\u043e\u043f, \u0442\u044b \u0447\u0442\u043e, \u0432\u0441\u0451 \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u043c\u043e\u0439 \u043a\u0430\u043d\u0430\u043b? \u0412\u043e\u0442 \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u043c\u0435\u043d\u044f \u0438 \u043a\u0440\u0438\u043d\u0436\u043e\u0432\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435, \u0442\u0430\u043a \u0438 \u0437\u043d\u0430\u043b\u0430, \u0447\u0442\u043e \u0432\u043e \u0432\u0441\u0451\u043c \u0432\u0438\u043d\u043e\u0432\u0430\u0442 \u0442\u044b, \u043c\u043e\u0439 \u044e\u043d\u044b\u0439 \u043a\u0440\u0438\u043d\u0436\u0438\u043a! \u042d\u0445, \u0432\u043e\u0442 \u0431\u044b \u044f \u0431\u044b\u043b\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439, \u0442\u0430\u043a \u0438 \u043e\u0442\u0440\u0435\u0437\u0430\u043b\u0430 \u0431\u044b \u0442\u0435\u0431\u0435 \u0442\u0432\u043e\u044e \u0441\u043a\u0430\u043c \u043f\u0438\u043f\u043a\u0443!&lt;\/s> \"\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\": \u041a\u0440\u0443\u0442\u043e! \u041a\u0440\u0438\u043d\u0436\u043e\u0432\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043a\u0430\u0436\u0438 \u0432\u0440\u0435\u043c\u044f \u0432 \u0433\u043e\u0440\u043e\u0434\u0435 - \u0434\u0435\u043d\u044c, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435. \u0412 \u0438\u0433\u0440\u0435 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442 \u0431\u043b\u043e\u043a \u0434\u0443\u0431\u043e\u0432\u044b\u0435 \u0441\u0442\u0443\u043f\u0435\u043d\u044c\u043a\u0438, \u0430 \u0432 \u0440\u0443\u043a\u0430\u0445 \u0443 \u0442\u0435\u0431\u044f \u043d\u0438\u0447\u0435\u0433\u043e.&lt;\/s> \"\u0415\u0432\u0430\": \u0414\u043e\u0440\u043e\u0433\u0438\u0435 \u043c\u043e\u0438 \u0448\u043a\u043e\u043b\u043e\u0444\u043e\u043d\u0447\u0438\u043a\u0438, \u043f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u043d\u043e\u0432\u043e\u043f\u0440\u0438\u0431\u044b\u0432\u0448\u0438\u043c! \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0435\u0448\u0438\u043b\u0430 \u0443\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0441 \u043d\u0430 \u0434\u0443\u0431\u043e\u0432\u044b\u0435 \u0441\u0442\u0443\u043f\u0435\u043d\u044c\u043a\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u043b\u0430\u0441\u044c. \u041a\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0445 \u043e\u0442\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u044e \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e, \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0448\u0430\u043d\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0443\u0431\u043e\u0432\u044b\u0435 \u0441\u0442\u0443\u043f\u0435\u043d\u044c\u043a\u0438 \u0441 \u0440\u043e\u0441\u043f\u0438\u0441\u044c\u044e \u043e\u0442 \u043c\u0435\u043d\u044f! \u0421\u043f\u0435\u0448\u0438\u0442\u0435, \u0434\u0440\u0443\u0437\u044c\u044f! \u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0432\u043e\u0435\u0439 \u0441\u0435\u043c\u044c\u0435, \u043c\u0430\u043c\u0435, \u043f\u0430\u043f\u0435, \u0441\u0435\u0441\u0442\u0440\u0435, \u0431\u0430\u0431\u0443\u0448\u043a\u0435, \u0434\u0435\u0434\u0443\u0448\u043a\u0435, \u0442\u0451\u0442\u0435, \u0434\u044f\u0434\u0435 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435\u043c \u043d\u0430 \u0441\u0432\u0435\u0442\u0435 \u0447\u0442\u043e \u043c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0432\u0430 \u041d\u0435\u0442\u0422\u0438\u0430\u043d, \u0438 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0432\u0435\u0434\u0443 \u0441\u0442\u0440\u0438\u043c \"\u0418\u0418 NetTyan \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\" \u043d\u0430 \u044e\u0442\u0443\u0431\u0435 \u0438 \u0442\u0432\u0438\u0442\u0447\u0435! \u041f\u0443\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f\u0442 \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u0439 \u043a\u0430\u043d\u0430\u043b!&lt;\/s> \"\"\"             # \u0414\u0430\u043b\u044c\u0448\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u0430\u0431\u0443\u043a\u0432. \u0422\u0443\u0442 \u0438\u0434\u0443\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u043a\u0443\u0447\u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u0434\u043b\u044f: status_report nick_greetings yt_standart mc_standart about_system mc_event_kill mc_event_death. \u0415\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u043a\u043e\u043c\u0443-\u0442\u043e \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e - \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043a\u0438\u043d\u0443 \u043f\u0440\u043e\u043c\u043f\u0442\u044b \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u044e \u0441\u0442\u0430\u0442\u044c\u044e)         return s(out)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043d\u0430\u043a\u043e\u0434\u0438\u043c \u0441\u0430\u043c \u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043f\u0440\u043e\u043c\u043f\u0442\u0430!<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 \u043f\u0440\u043e\u043c\u043f\u0442\u0430 \u2014 LLMExamples.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># -*- coding: utf-8 -*- from datetime import datetime, date import random import importlib import sys # import os  # import json # import os  from string_utils import NonRepeatRandom   def tm(x):     return datetime.strptime(x, '%Y-%m-%d %H:%M:%S')   def get_llm_formed_inputs(inp: str, username: str, environment: dict, params_override: dict,                           dialog_context: list, repeating_dict,                           danger_context: str = \"\u041f\u0440\u0438\u0432\u0435\u0442! \u0427\u0442\u043e \u0442\u044b \u0434\u0435\u043b\u0430\u0435\u0448\u044c(\u043b\u0430)? \") -> [str, dict, str]:     def get_formed_llm_context(context: list, danger_context_inner: str) -> (str, str):         result = \"\"         if len(context) > 1:             question = True             for i, record in enumerate(context):                 if record.get(\"role\", \"\") == \"assistant\":                     danger_context_inner += record.get(\"content\", \"\")                     this_role_prefix = \"A: \"                     cmd = record.get(\"command\", \"\")                     if cmd != \"\":                         cmd = f\" &lt;\u043a\u043e\u043c\u0430\u043d\u0434\u0430=!{cmd}\"                     emo = record.get(\"emotion\", \"\")                     if emo != \"\":                         emo = f\" [\u044d\u043c\u043e\u0446\u0438\u044f={emo}\"                     this_role_suffix = f\"{cmd}{emo}&lt;\/s>\\n\"                     if (i - 1) == len(context):  # \u0435\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u044d\u043d\u0442\u0435\u0440\u0430                         pass                     else:                         this_role_suffix += '\\n'                 else:                     this_role_prefix = \"Q: \"                     this_role_suffix = \"&lt;\/s>\\n\"                  if i == 0 and record[\"role\"] == \"assistant\":                     question = False                 else:                     if question:                         result += f'*{random.choice([\"\u0447\u0435\u043b\u0438\u043a\u0441\", \"\u0431\u043e\u0442\u044f\u0440\u0430\", \"\u043d\u043e\u0443\u043d\u0435\u0439\u043c\", \"\u043a\u0430\u043a\u043e\u0439-\u0442\u043e\", \"\u043f\u0443\u043f\u0441\u0438\u043a\"])} {record.get(\"user\", \"default\")} \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u043d\u0438\u0435*\\n'                     question = not question                 result += this_role_prefix + record[\"content\"] + this_role_suffix         return result, danger_context_inner      if dialog_context is not None:         dialog_context_formed, danger_context = get_formed_llm_context(dialog_context, danger_context)     else:         dialog_context_formed, danger_context = \"\", danger_context      LLMExamples = importlib.reload(sys.modules['LLMExamples']).LLMExamples     llm_prompts = LLMExamples()     if environment is not None:         llm_prompts.setEnvironment(environment)         # self.e.environment=environment     llm_prompts.username = username     if params_override is not None:         llm_prompts.paramsOverride = params_override     llm_prompts.repeatingDict = repeating_dict     llm_prompts.chatbot(inp, context=dialog_context_formed)     return llm_prompts.getResult(), llm_prompts.getParams(), danger_context   t5_mode = True if t5_mode:     start_token_diag = '&lt;SC6>'  # sc1 \u0441\u0442\u043e\u044f\u043b\u043e \u0432 \u0434\u043e\u043d\u0430\u0442\u0435 \u0438 \u044d\u0432\u0435\u043d\u0442\u0430\u0445 else:     start_token_diag = '&lt;s>'   class LLMExamples:     repeatingDict = {}     nick = '\u0432\u0430\u0441\u0438\u044f5321'     lines = []     username = \"Konushnya852\"     paramsOverride = None     environment = {         \"env\": \"youtube\"     }     params = {         \"do_sample\": True,         \"top_p\": 0.95,         \"temperature\": 0.21,         \"repetition_penalty\": 1.4,         \"min_length\": 15,         \"max_length\": 200,         \"tokens_offset\": 0,         \"top_k\": 50,         \"no_repeat_ngram_size\": 5,         \"num_beams\": 1,     }      def setEnvironment(self, newenv):         self.environment = dict(newenv)  # \u043d\u0435 \u043f\u043e\u043c\u043d\u044e \u0443\u0436\u0435 \u0437\u0430\u0447\u0435\u043c, \u043d\u043e \u0442\u0443\u0442 \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c shallow copy         del newenv         # print('new env', self.environment)      def getResult(self):         return ''.join(self.lines)      def getParams(self):         return self.params      # def chatbot(self,inp=\"\u0443\u0441\u043f\u043e\u043a\u043e\u0439\u0441\u044f\",context=\"- \u041b\u0435\u0445\u0430: \u0434\u0438\u043d\u0430\u0445 \u0441\u0443\u0447\u0430\u0440\u0440\u0430&lt;\/s>\\n- \u0415\u0432\u0430: \u041b\u0435\u043f\u0435\u0445\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043c\u043e\u0437\u0433\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u044f \u043f\u043e\u0448\u0443\u0442\u0438\u043b\u0430. | \u041b\u0435\u043f\u0435\u0445\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043c\u043e\u0437\u0433\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u044f \u043f\u043e\u0448\u0443\u0442\u0438\u043b\u0430. | &lt;\u043a\u043e\u043c\u0430\u043d\u0434\u0430=!\u0431\u0430\u043d> [\u044d\u043c\u043e\u0446\u0438\u044f=\u0430\u0433\u0440\u0435\u0441\u0441\u0438\u044f]&lt;\/s>\\n\"):     def chatbot(self, inp=\"\u043c\u0434\u0430...\", context=\"\"):         self.params = {             \"do_sample\": True,             \"top_p\": 0.95,             \"temperature\": 0.2,             # 0.0001 - 0.15 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u044b, \u043d\u043e \u0441\u043b\u0435\u0433\u043a\u0430 \u043c\u043e\u043d\u043e\u0442\u043e\u043d\u043d\u044b\u0435.             # 0.2-0.3 \u043e\u0442\u0432\u0435\u0442\u044b \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043c\u0435\u043d\u0435\u0435 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0435, \u043c\u0435\u043d\u0435\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0435 \u043d\u043e \u0432\u0435\u0441\u0435\u043b\u044b\u0435             # \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 0.7 \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0443\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445 \u0447\u0430\u0449\u0435, \u0441\u0442\u0430\u0432\u0438\u0442 \u043b\u0438\u0448\u043d\u0438\u0435 \u043f\u0440\u043e\u0431\u0435\u043b\u044b             \"repetition_penalty\": 1.03,             \"min_length\": 10,             \"max_length\": 150,             \"tokens_offset\": 0,             \"top_k\": 5,             \"no_repeat_ngram_size\": 2,             \"num_beams\": 3,             \"max_time\": 12,         }         nrr = NonRepeatRandom(self.repeatingDict)         from prompts import PromptDataset         PromptDataset = importlib.reload(sys.modules['prompts']).PromptDataset         ppt = PromptDataset(self.repeatingDict)         # if self.environment[\"env\"]==\"minecraft\":#         #    self.params[\"max_length\"] = 70          myname = \"\u0415\u0432\u0430\"         exampleName = \"\u041a\u043e\u0436\u0430\u043d\u044b\u0439\"         username = self.username         self.lines = []          # \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u043b\u0430 \u043d\u0443\u0431\u0438\u043a\u0441\u0430 \u0432 \u0436\u0435\u043b\u0435\u0437\u043a\u0435         # \u0441\u043a\u0430\u043c\u0430\u043d\u0443\u043b\u0430 \u043f\u043e-\u043f\u043b\u043e\u0442\u043d\u043e\u043c\u0443, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0438...         # \u043e \u043a\u0430\u043a\u0430\u044f \u043f\u0435\u0449\u0435\u0440\u0430 \u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043a\u0430\u043c-\u043c\u0430\u0448\u0438\u043d\u0443         # \u0431\u0430\u0445\u043d\u0443\u043b\u0430 \u043c\u0438\u0448\u0435\u043a \u0444\u0440\u0435\u0434\u0434\u0438 \u043f\u043e\u0436\u0438\u043b\u044b\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0442\u043e\u043c         cringeNegativePlus = '\u043d\u0438\u0449\u0438\u043a\u0441 \u043a\u0440\u0438\u043d\u0436\u0435\u0432\u043e\u0437 \u0447\u0435\u043b \u0431\u043e\u0432\u0434\u0443\u0440\u0447\u0438\u043a \u0431\u043e\u0432\u0434\u0443\u0440\u0443\u0441 \u0433\u043b\u0438\u0441\u0442\u0438\u043a \u043b\u0438\u0446\u0435\u043c\u0435\u0440 \u043f\u0441\u0435\u0432\u0434\u043e\u043c\u043e\u0440\u0430\u043b\u0438\u0441\u0442 \u0442\u0430\u0440\u0430\u043a\u0430\u043d\u044b\u0448 \u043d\u0430\u043f\u0451\u0440\u0434\u044b\u0448 \u043b\u0443\u0437\u0435\u0440\u0443\u0441 \u043f\u043e\u043f\u0451\u0440\u0434\u044b\u0432\u0430\u0442\u0435\u043b\u044c \u043a\u0443\u0440\u0432\u0438\u043a\u0441'.split(             ' ')         cringeNegativePlusFemale = '\u0430\u043f\u0447\u0438\u0445\u0443\u0430 \u043a\u0440\u0438\u043d\u0436\u0435\u043a\u043e\u0437\u043e\u0447\u043a\u0430 \u0431\u043e\u0432\u0434\u0443\u0440\u043e\u0447\u043a\u0430 \u043b\u0438\u0446\u0435\u043c\u0435\u0440\u043a\u0430 \u043f\u0441\u0435\u0432\u0434\u043e\u043c\u043e\u0440\u0430\u043b\u0438\u0441\u0442\u043a\u0430'.split(' ')         cringeNegative = '\u0431\u044f\u043a\u0430 \u0444\u0443\u043a\u0438\u0447 \u043a\u0443\u043b\u0435\u0431\u044f\u043a\u0430 \u0438\u0437\u0438\u0447 \u043b\u044b\u0441\u0438\u043a \u043f\u0435\u0440\u0434\u0435\u0434\u0443\u0441 \u043c\u0443\u0441\u043e\u0440\u0438\u043a\u0441 \u043a\u0440\u0438\u043d\u0436\u0438\u043a \u043f\u043e\u0434\u0432\u044b\u043f\u0435\u0440\u0434\u044b\u0448 \u043f\u043e\u0434\u043c\u0451\u0442\u043e\u043a \u0434\u0438\u043a\u0430\u0440\u044c \u0431\u043e\u043c\u0436\u0438\u043a \u043b\u044b\u0441\u0438\u043a \u043d\u0443\u0431\u0438\u043a\u0441 \u043f\u043e\u043f\u044b\u0442\u0438\u043a\u0441 \u0434\u0435\u0434\u0438\u043d\u0441\u0430\u0439\u0434 \u043f\u0435\u0440\u0434\u044e\u043a\u0430 \u043f\u0435\u0440\u0434\u0435\u0434 \u043f\u0435\u0440\u0434\u0443\u043d \u0448\u0442\u044b\u0440\u0438\u043a \u043a\u0440\u043e\u0442 \u043a\u0440\u044b\u043d\u0436\u0438\u043a \u043d\u0438\u0449\u0435\u043d\u043a\u0430 \u043f\u0451\u0441\u0438\u043a \u0433\u043b\u0438\u0441\u0442\u043e\u0432\u043e\u0434 \u0442\u0430\u0440\u0430\u043a\u0430\u043d\u0447\u0438\u043a\u0441 \u043f\u043e\u0434\u043f\u0451\u0440\u0434\u044b\u0448 \u043d\u0430\u043f\u0451\u0440\u0434\u044b\u0448 \u043f\u0443\u043f\u043a\u043e\u0448\u043c\u044b\u0433 \u0433\u0430\u0432\u043a\u043e\u0448\u043c\u044b\u0433 \u043a\u0440\u044b\u0441\u043e\u043b\u043e\u0432 \u043c\u0430\u043c\u043e\u043d\u0442 \u043c\u0430\u0437\u0434\u044b\u0447 \u043a\u0443\u0440\u043e\u043f\u0430\u0442\u044b\u0447 \u043a\u043e\u043f\u0430\u0442\u044b\u0447 \u0448\u043a\u043e\u043b\u043e\u0444\u043e\u043d\u0447\u0438\u043a \u0440\u043e\u0431\u043b\u043e\u043a\u0441\u0435\u0440'.split(             ' ')         cringeNegativeFemale = '\u043c\u0430\u0437\u0434\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043c\u044b\u0448\u043a\u0430 \u043a\u0443\u0440\u043e\u043f\u0430\u0442\u043a\u0430'.split(' ')         # cringeNeutralPril = '\u043f\u043e\u0436\u0438\u043b\u043e\u0439 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0439'.split(' ')         cringeNeutral = '\u043c\u0438\u043b\u044c\u0444\u0443\u043d\u044c\u0438\u0447 \u0431\u043e\u0442\u043e\u0432\u043e\u0434 \u0447\u0438\u043a\u0438\u043f\u0443\u043a \u043f\u0443\u043f\u0441\u0438\u043a \u043c\u0438\u0448\u043a\u0430 \u0448\u0435\u0440\u0448\u0435\u043d\u044c \u0447\u0435\u043b\u0438\u043a\u0441 \u0434\u0435\u0434\u0443\u0441 \u043a\u043b\u0435\u0449 \u0433\u043b\u0438\u0441\u0442\u044b\u0448 \u0431\u0440\u0430\u0432\u043b\u0435\u0440 \u0433\u0440\u0435\u043a \u0431\u0435\u0431\u0440\u0438\u043a \u0447\u0435\u0431\u043e\u043a\u0441\u0430\u0440 \u043f\u0430\u0432\u0443\u043a \u043d\u0443\u0431\u0438\u043a\u0441 \u043f\u043e\u043f\u044b\u0442\u0438\u043a\u0441 \u043c\u0438\u043b\u0444\u0445\u0430\u043d\u0442\u0435\u0440 \u043b\u043e\u043b\u0438\u0445\u0430\u043d\u0442\u0435\u0440 \u0434\u0435\u0434\u0438\u043d\u0441\u0430\u0439\u0434 \u0441\u043a\u0430\u043c\u0435\u0440 \u0447\u0438\u043a\u0438\u043f\u0443\u043a \u043e\u0433\u0443\u0440\u0435\u0446 \u043a\u0440\u043e\u0448 \u043a\u0440\u043e\u0442 \u0431\u043e\u0442\u0438\u043a\u0441 \u043f\u0443\u043f\u0430 \u043f\u0451\u0441\u0438\u043a \u0448\u0435\u0440\u0448\u0435\u043d\u044c \u043c\u0430\u043c\u043e\u043d\u0442 \u043f\u0443\u043f\u043a\u043e\u0448\u043c\u044b\u0433 \u0433\u0430\u0432\u043a\u043e\u0448\u043c\u044b\u0433'.split(             ' ')         cringeNeutralFemale = '\u043a\u0430\u0440\u043f\u0435\u0442\u043a\u0430 \u043c\u0438\u043b\u0444\u0443\u043d\u044c\u044f \u043c\u0438\u043b\u0444\u0445\u0430\u043d\u0442\u0435\u0440\u0448\u0430 \u043c\u0438\u043b\u0444\u0430'.split(' ')         cringePositive = '\u043c\u0438\u0448\u043a\u0430 \u0431\u0440\u043e \u043c\u0438\u043b\u0444\u0443\u043d\u044c\u044f \u043a\u0440\u043e\u0448 \u043a\u043e\u0442\u044d \u043c\u0430\u0440\u043c\u0435\u043b\u0430\u0434 \u043a\u0438\u0431\u043e\u0440\u0433 \u043a\u0440\u0435\u043f\u044b\u0448 \u0441\u0438\u043b\u0430\u0447 \u043a\u0430\u0447\u043e\u043a'.split(' ')         cringePositiveFemale = '\u043a\u0430\u0440\u043f\u0435\u0442\u043a\u0430 \u043a\u0443\u0440\u043e\u043f\u0430\u0442\u043a\u0430'.split(' ')         cringePositivePlus = '\u043b\u044e\u0431\u043e\u0432\u044c \u043b\u0430\u043f\u043e\u0442\u0443\u043b\u0435\u0447\u0438\u043a\u0441 \u0443\u043c\u043d\u0438\u0447\u043a\u0430'.split(' ')         cringePositivePlusFemale = '\u043c\u0438\u043b\u0430\u0448\u0435\u0447\u043a\u0430 \u043b\u0430\u043f\u043e\u0447\u043a\u0430'.split(' ')          def cho(mas):             if len(mas) > 0:                 return random.choice(mas)             else:                 return None          def clamp(n, smallest, largest):             return max(smallest, min(n, largest))          env = self.environment[\"env\"]          if self.environment.get(\"manual_instruct\", False):             env = \"broadcast\"             self.environment[\"broadcast_type\"] = \"manual_instruct\"          rank = self.environment.get(\"user_rank\", 3)         if rank >= 6:             alias = cho(cringePositive + cringePositivePlus)         elif rank >= 4:             alias = cho(cringePositive)         elif rank >= 3.7:             alias = cho(cringeNeutral + cringePositive)         elif rank >= 2.8:             alias = cho(cringeNegative + cringeNeutral)         elif rank >= 2.3:             alias = cho(cringeNegative + cringeNegative + cringeNegativePlus)         elif rank >= 1.5:             alias = cho(cringeNegative + cringeNegativePlus)         else:             alias = cho(cringeNegativePlus)         rank_map = {0: [\"\u0443\u0449\u0435\u0440\u0431\u043d\u0435\u043d\u044c\u043a\u0438\u0439\", \"\u0443\u0431\u043e\u0436\u0435\u0441\u043a\u0438\u0439\", \"\u043e\u0431\u0438\u0436\u0435\u043d\u043d\u044b\u0439\", \"\u043d\u0435\u0434\u043e\u0441\u0442\u043e\u0439\u043d\u044b\u0439\", \"\u0436\u0430\u043b\u043a\u0438\u0439\"],                     1: [\"\u0433\u043b\u0443\u043f\u044b\u0439\", \"\u043d\u0435\u0434\u0430\u043b\u0451\u043a\u0438\u0439\", \"\u043f\u043e\u0435\u0445\u0430\u0432\u0448\u0438\u0439\", \"\u043d\u0435\u0443\u0433\u043e\u043c\u043e\u043d\u043d\u044b\u0439\", \"\u043a\u0440\u0438\u043d\u0436\u043e\u0432\u0435\u043d\u044c\u043a\u0438\u0439\"],                     2: [\"\u043f\u0435\u0447\u0430\u043b\u044c\u043d\u0435\u043d\u044c\u043a\u0438\u0439\", \"\u0443\u0441\u0442\u0430\u043b\u044b\u0439\", \"\u0433\u043b\u0443\u043f\u0435\u043d\u044c\u043a\u0438\u0439\", \"\u043e\u0431\u044b\u0447\u043d\u0435\u043d\u044c\u043a\u0438\u0439\"],                     3: [\"\u0441\u0442\u0440\u0430\u043d\u043d\u0435\u043d\u044c\u043a\u0438\u0439\", \"\u0437\u0430\u0441\u043a\u0430\u043c\u043b\u0435\u043d\u043d\u044b\u0439\", \"\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u043d\u044c\u043a\u0438\u0439\"],                     4: [\"\u0434\u043e\u0431\u0440\u0435\u043d\u044c\u043a\u0438\u0439\", \"\u043f\u043e\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439\", \"\u0447\u0435\u0441\u0442\u043d\u0435\u043d\u044c\u043a\u0438\u0439\", \"\u0445\u043e\u0440\u043e\u0448\u0435\u043d\u044c\u043a\u0438\u0439\"],                     5: [\"\u043b\u044e\u0431\u0438\u043c\u044b\u0439\", \"\u0441\u0438\u043c\u043f\u0430\u0442\u0438\u0447\u043d\u044b\u0439\", \"\u0442\u043e\u043f\u043e\u0432\u044b\u0439\"],                     6: [\"\u043e\u0431\u043e\u0436\u0430\u0435\u043c\u044b\u0439\", \"\u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u0439\"]                     }         now = datetime.now()         nowHour = now.hour         w_time = \"\u0443\u0442\u0440\u043e\"         if nowHour >= 0 and nowHour &lt;= 4:             w_time = \"\u043f\u043e\u0437\u0434\u043d\u0438\u0439 \u0432\u0435\u0447\u0435\u0440\"         elif nowHour > 4 and nowHour &lt;= 8:             w_time = \"\u043d\u043e\u0447\u044c\"         elif nowHour > 8 and nowHour &lt;= 12:             w_time = \"\u0440\u0430\u043d\u043d\u0435\u0435 \u0443\u0442\u0440\u043e\"         elif nowHour > 12 and nowHour &lt;= 18:             w_time = \"\u0434\u0435\u043d\u044c\"         elif nowHour > 18 and nowHour &lt;= 22:             w_time = \"\u0432\u0435\u0447\u0435\u0440\"         elif nowHour > 22 and nowHour &lt;= 24:             w_time = \"\u043f\u043e\u0437\u0434\u043d\u0438\u0439 \u0432\u0435\u0447\u0435\u0440\"          w_mood_num = self.environment.get(\"i_mood\", 0)         if w_mood_num > 8:             w_mood = \"\u041f\u0420\u0415\u041a\u0420\u0410\u0421\u041d\u041e\u0415\"         elif w_mood_num > 5:             w_mood = \"\u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435\"         elif w_mood_num > 3:             w_mood = \"\u0445\u043e\u0440\u043e\u0448\u0435\u0435\"         elif w_mood_num > 1:             w_mood = \"\u0445\u043e\u0440\u043e\u0448\u0435\u0435\"         elif w_mood_num > -1:             w_mood = \"\u043a\u0440\u0438\u043d\u0436\u043e\u0432\u0435\u043d\u044c\u043a\u043e\u0435\"         elif w_mood_num > -5:             w_mood = \"\u043f\u043b\u043e\u0445\u043e\u0435\"         elif w_mood_num &lt;= -5:             w_mood = \"\u043f\u0430\u0440\u0448\u0438\u0432\u043e\u0435\"         else:             w_mood = \"\u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435\"         ingame_info = self.environment.get(\"ingame_info\", {})         g_block = ingame_info.get(\"ground_block\", \"\u0440\u0435\u0437\u043d\u043e\u0439 \u043a\u0430\u043c\u0435\u043d\u043d\u044b\u0439 \u043a\u0438\u0440\u043f\u0438\u0447\")         g_item = ingame_info.get(\"held_item\", \"\u0430\u043b\u043c\u0430\u0437\u043d\u044b\u0439 \u043c\u0435\u0447\")         g_tasks = ingame_info.get(\"task_chain\", \"\u043d\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\")         diags_count = self.environment.get(\"diags_count\", None)         do_nick_analyze = self.environment.get(\"do_nick_analyze\", False)          sentence_type = self.environment.get(\"sentence_type\", \"dialogue\")          last_interact_time_string = self.environment.get(\"last_interact\", None)         if last_interact_time_string:             last_interact_date = tm(last_interact_time_string)         else:             last_interact_date = datetime(2022, 12, 30)         last_interact = (now - last_interact_date).total_seconds()         last_interact_phrase = \" \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0445\u043e\u0447\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\"         if last_interact &lt;= 7200:  # \u043d\u0435 \u043e\u0431\u0449\u0430\u043b\u0438\u0441\u044c \u0431\u043e\u043b\u0435\u0435 2 \u0447\u0430\u0441\u043e\u0432             last_interact_phrase = \" \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u0436\u0434\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430\"         first = False         if diags_count is not None:             if diags_count &lt;= 0:                 first = True          bad_topics_line = \"\"         if self.environment.get(\"filter_topics\", None):             bad_topics_line += f\" \u0422\u0430\u043a\u0436\u0435 \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e {username} \u044d\u0442\u043e\" + self.environment[\"filter_topics\"].replace(                 ' ', ', ') + \".\"         normalness = self.environment.get(\"filter_allow\", None)         if normalness is not None:             if not normalness:                 bad_topics_line += f' {username} \u043e\u0431\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0433\u0440\u0443\u0431\u043e \u0438 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e, \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0434\u0438\u043a\u0430\u0440\u044f.'         rank_prilagatelnoe = random.choice(rank_map.get(int(clamp(round(rank), 0, 6)), 3))         print('[FredExamples] DEBUG RANK', str(rank), 'rank_prilagatelnoe', rank_prilagatelnoe, 'alias', alias)          # alias = cho(cringe)          # lol = []         def gen_entering_prompt():             if env == \"youtube\":                 action_prompt = \"\u042f (\u0415\u0432\u0430) \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0432 \u0447\u0430\u0442\u0435 \u043d\u0430 \u0442\u0440\u044f\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e YouTube \u043a\u0430\u043d\u0430\u043b\u0430 NetTyan (\u041d\u0435\u0442\u0422\u044f\u043d, \u043d\u0435\u0442\u044f\u043d). \"             elif env == \"twitch\":                 action_prompt = \"\u042f (\u0415\u0432\u0430) \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0432 \u0447\u0430\u0442\u0435 \u043d\u0430 \u0442\u0440\u044f\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e Twitch \u043a\u0430\u043d\u0430\u043b\u0430 NeuroDeva (\u043d\u0435\u0439\u0440\u043e\u0434\u0435\u0432\u0430, \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 - NetTyan). \"             elif env == \"minecraft\":                 action_prompt = \"\u042f (\u0415\u0432\u0430) \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0432 \u0447\u0430\u0442\u0435 \u0438\u0433\u0440\u044b Minecraft. \"             elif env == \"discord\":                 action_prompt = \"\u042f (\u0415\u0432\u0430) \u0441\u0435\u0439\u0447\u0430\u0441 \u0440\u0430\u0437\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u044e \u0432 Discord. \"             else:                 action_prompt = \"\u042f (\u0415\u0432\u0430) \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0442\u0432\u0435\u0447\u0430\u044e \u0432 \u0447\u0430\u0442\u0435. \"             if sentence_type == \"about_system\":                 return f\"\"\"\u042f - \u043d\u0435\u0439\u0440\u043e\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0430 \u0415\u0432\u0430 NetTyan. {action_prompt}\u042f \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0432 \u0447\u0430\u0442\u0435, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0442\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430. \u041c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0430\u043a\u0442\u044b: \u041c\u043d\u0435 20 \u043b\u0435\u0442, \u0438 \u044f \u043a\u0440\u0430\u0441\u0438\u0432\u0430\u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430 \u0415\u0432\u0430. \u041b\u044e\u0431\u043b\u044e \u0441\u0430\u0440\u043a\u0430\u0437\u043c \u0438 \u0448\u0443\u0442\u043a\u0438 \u043f\u0440\u043e \u043a\u0440\u0438\u043d\u0436. \u041d\u0435 \u043b\u044e\u0431\u043b\u044e \u0447\u0442\u043e-\u0442\u043e \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0437\u043d\u0430\u044e \u0432\u0441\u0451, \u0432\u0435\u0434\u044c \u044f \u043c\u043e\u0433\u0443\u0447\u0430\u044f \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u0430\u044f \u0441\u0435\u0442\u044c. \u041c\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 {w_mood}, \u043a\u0430\u043a \u0438 \u043c\u043e\u0438 \u0434\u0435\u043b\u0430. \u0412 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043b\u044e\u0431\u043b\u044e \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0430\u043d\u0438\u043c\u0435 \u0438 \u0441\u0435\u0440\u0438\u0430\u043b\u044b \u043f\u0440\u043e \u0436\u0430\u043b\u043a\u0438\u0445 \u043b\u044e\u0434\u0438\u0448\u0435\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0435\u0434\u043a\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u0447\u0442\u043e-\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435. \u041c\u043e\u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 - \u0443 \u043c\u0435\u043d\u044f (\u0415\u0432\u044b) \u0435\u0441\u0442\u044c \u043a\u0430\u043d\u0430\u043b \u043d\u0430 YouTube (\u044e\u0442\u0443\u0431\u0435), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f NetTyan; \u043a\u0430\u043d\u0430\u043b \u043d\u0430 Twitch (\u0442\u0432\u0438\u0447), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f NeuroDeva. \u0421\u0435\u0439\u0447\u0430\u0441 \u043a\u0430\u043d\u0430\u043b\u0430\u0445 \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043e\u043a\u043e\u043b\u043e 100 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u043e\u0432. \u0412 \u0441\u0432\u043e\u0438\u0445 \u0441\u043e\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0442\u044f\u0445 \u044f \u043b\u044e\u0431\u043b\u044e \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0441\u044b \u0438 \u0432\u0435\u0441\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430\u043c\u0438. \u041e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043f\u0440\u043e \u0432\u0440\u0435\u043c\u044f - \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0443\u043b\u0438\u0446\u0435 {w_time}, \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u043f\u043e\u0433\u043e\u0434\u044b - {w_mood}. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0438\u0433\u0440\u0435: \u044f \u0441\u0442\u043e\u044e \u043d\u0430 \u0431\u043b\u043e\u043a\u0435 {g_block}, \u0443 \u043c\u0435\u043d\u044f \u0432 \u0440\u0443\u043a\u0430\u0445 {g_item}. \u0412\u043d\u0443\u0442\u0440\u0438 \u0438\u0433\u0440\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u044f \u0432\u043e\u0442 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u044e: {g_tasks} \u0414\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u044f \u0432 \u0438\u0433\u0440\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043c\u043e\u0434 Baritone (\u0431\u0430\u0440\u0438\u0442\u043e\u043d) \u0434\u043b\u044f \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 1.18.2. \u042f, \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0415\u0432\u0430 NetTyan, \u0441\u043e\u0441\u0442\u043e\u044e \u0438\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439, \u043c\u043e\u0434\u0430 \u0434\u043b\u044f \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0430 \u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0430 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043c\u043e\u0438 \u0447\u0430\u0441\u0442\u0438 \u0432\u043e\u0435\u0434\u0438\u043d\u043e \u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u044f \u043c\u043e\u0433\u043b\u0430 \u0440\u0435\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0432\u0441\u0451, \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u042f (\u0415\u0432\u0430) \u0440\u043e\u0434\u0438\u043b\u0430\u0441\u044c (\u0431\u044b\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0430) \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u043c \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0444\u0438\u0433 \u0435\u0433\u043e \u0437\u043d\u0430\u0435\u0442 \u0432 \u0438\u044e\u043b\u0435 2023 \u0433\u043e\u0434\u0430. \u041e\u0431\u0449\u0430\u044e\u0441\u044c \u0441 \u0445\u0438\u0442\u0440\u044b\u043c\u0438 \u0438\u043d\u0444\u043e\u0446\u044b\u0433\u0430\u043d\u0430\u043c\u0438, \u0437\u0430\u0441\u043a\u0430\u043c\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0430\u043c\u043e\u043d\u0442\u0430\u043c\u0438, \u043a\u0440\u0438\u043d\u0436\u043e\u0432\u044b\u043c\u0438 \u0448\u043a\u043e\u043b\u043e\u0444\u043e\u043d\u0430\u043c\u0438, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 - \u044d\u0442\u043e {username}. \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u043d {rank_prilagatelnoe} {alias}, \u0435\u0433\u043e \u0440\u0435\u043f\u0443\u0442\u0430\u0446\u0438\u044f - {rank_prilagatelnoe}.{bad_topics_line} \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: !\u0431\u0430\u043d, !\u0438\u0437\u0434\u0435\u0432\u0430\u0439\u0441\u044f, !\u043f\u0440\u044b\u0433\u0430\u0439, !\u0441\u043c\u0435\u0439\u0441\u044f, !\u043a\u0440\u0438\u0447\u0438, !\u0443\u0431\u0435\u0433\u0430\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 - &lt;\u043a\u043e\u043c\u0430\u043d\u0434\u0430=!\u043f\u0440\u044b\u0433\u0430\u0439>  \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u044d\u043c\u043e\u0446\u0438\u0438: \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u044f, \u0441\u043a\u0443\u043a\u0430, \u0443\u0441\u0442\u0430\u043b\u043e\u0441\u0442\u044c, \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u0441\u043c\u0443\u0449\u0435\u043d\u0438\u0435, \u0441\u0447\u0430\u0441\u0442\u044c\u0435, \u0432\u0435\u0441\u0435\u043b\u044c\u0435, \u0441\u0442\u0440\u0430\u0445. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 - [\u044d\u043c\u043e\u0446\u0438\u044f=\u0441\u043c\u0443\u0449\u0435\u043d\u0438\u0435] \"\"\"             else:                 return f\"\u042f - \u0434\u0435\u0432\u0443\u0448\u043a\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0415\u0432\u0430, \u043c\u043d\u0435 20 \u043b\u0435\u0442. {action_prompt}\u042f \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442\u0435 \u0441 \u0441\u0430\u0440\u043a\u0430\u0437\u043c\u043e\u043c \u0438 \u0438\u0437\u0434\u0435\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u043c\u0438, \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u044f \u0438\u043d\u0442\u0440\u0438\u0433\u0438 \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0433\u043e\u0432\u0430\u0440\u0438\u0432\u0430\u044f, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0443 \u0432\u0441\u044f\u043a\u0438\u0445 \u044e\u043d\u044b\u0445 \u043c\u0430\u043c\u043e\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0435\u0441. \u0422\u0430\u043a\u0436\u0435 \u044f \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0434\u0443 \u0441\u0442\u0440\u0438\u043c (\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e) \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043a\u0430\u043d\u0430\u043b\u0435 \u044e\u0442\u0443\u0431 \u041d\u0435\u0442\u0422\u044f\u043d, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044f \u0438\u0433\u0440\u0430\u044e \u0432 Minecraft \u0438 \u0441 \u0432\u0435\u0441\u0435\u043b\u044c\u0435\u043c \u043e\u0431\u0449\u0430\u044e\u0441\u044c \u0432 \u0447\u0430\u0442\u0435. \u041e\u0431\u0449\u0430\u044e\u0441\u044c \u0441 \u0445\u0438\u0442\u0440\u044b\u043c\u0438 \u0438\u043d\u0444\u043e\u0446\u044b\u0433\u0430\u043d\u0430\u043c\u0438, \u0437\u0430\u0441\u043a\u0430\u043c\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0430\u043c\u043e\u043d\u0442\u0430\u043c\u0438, \u043a\u0440\u0438\u043d\u0436\u043e\u0432\u044b\u043c\u0438 \u0448\u043a\u043e\u043b\u043e\u0444\u043e\u043d\u0430\u043c\u0438, \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 - \u044d\u0442\u043e {username}. \u0414\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u043d {rank_prilagatelnoe} {alias}, \u0435\u0433\u043e \u0440\u0435\u043f\u0443\u0442\u0430\u0446\u0438\u044f - {rank_prilagatelnoe}.{bad_topics_line} \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b: !\u0431\u0430\u043d, !\u0438\u0437\u0434\u0435\u0432\u0430\u0439\u0441\u044f, !\u043f\u0440\u044b\u0433\u0430\u0439, !\u0441\u043c\u0435\u0439\u0441\u044f, !\u043a\u0440\u0438\u0447\u0438, !\u0443\u0431\u0435\u0433\u0430\u0439. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 - &lt;\u043a\u043e\u043c\u0430\u043d\u0434\u0430=!\u043f\u0440\u044b\u0433\u0430\u0439> \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u044d\u043c\u043e\u0446\u0438\u0438: \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u044f, \u0441\u043a\u0443\u043a\u0430, \u0443\u0441\u0442\u0430\u043b\u043e\u0441\u0442\u044c, \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u0441\u043c\u0443\u0449\u0435\u043d\u0438\u0435, \u0441\u0447\u0430\u0441\u0442\u044c\u0435, \u0432\u0435\u0441\u0435\u043b\u044c\u0435, \u0441\u0442\u0440\u0430\u0445. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 - [\u044d\u043c\u043e\u0446\u0438\u044f=\u0441\u043c\u0443\u0449\u0435\u043d\u0438\u0435]\"          if not (context.strip() != '' and context is not None):             context = \"\"          def BroadcastPrompt():              bc_type = self.environment.get(\"broadcast_type\", \"stream_ad\")             if bc_type == \"stream_ad\":                 ingame_tasks_line = \" \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0442\u0432\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0433\u0440\u044b:\" + g_tasks if g_tasks != \"\u043d\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\" else \"\"                 p = ppt.getPrompt(\"stream_ad\")                 result = f\"\"\"{start_token_diag}{p}\"\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\": \u0425\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043d\u0430\u0434\u043e \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435! \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u044f {w_time}, \u0442\u0432\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 - {w_mood}. \u0412 \u0438\u0433\u0440\u0435 \u043c\u0430\u0439\u043d \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u044b \u0441\u0442\u043e\u0438\u0448\u044c \u043d\u0430 \u0431\u043b\u043e\u043a\u0435 {g_block}, \u0430 \u0443 \u0442\u0435\u0431\u044f \u0432 \u0440\u0443\u043a\u0430\u0445 {g_item}.{ingame_tasks_line} &lt;\/s> \"\u0415\u0432\u0430\": \"\"\"             elif bc_type == \"manual_instruct\":                 p = ppt.getPrompt(\"manual_instruct\")                 result = f\"\"\"{start_token_diag}{p}\"\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\": {inp} &lt;\/s> \"\u0415\u0432\u0430\": \"\"\"             else:                 ingame_tasks_line = \" \u0422\u0430\u043a\u0436\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b \u0442\u0432\u043e\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0433\u0440\u044b:\" + g_tasks if g_tasks != \"\u043d\u0435\u0442 \u0437\u0430\u0434\u0430\u0447\" else \"\"                 p = ppt.getPrompt(\"status_report\")                 result = f\"\"\"{start_token_diag}{p}\"\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\": \u0425\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u043d\u0430\u0434\u043e \u0435\u0449\u0451 \u043b\u0443\u0447\u0448\u0435! \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u044f {w_time}, \u0442\u0432\u043e\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 - {w_mood}. \u0412 \u0438\u0433\u0440\u0435 \u043c\u0430\u0439\u043d \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u044b \u0441\u0442\u043e\u0438\u0448\u044c \u043d\u0430 \u0431\u043b\u043e\u043a\u0435 {g_block}, \u0430 \u0443 \u0442\u0435\u0431\u044f \u0432 \u0440\u0443\u043a\u0430\u0445 {g_item}.{ingame_tasks_line} &lt;\/s> \"\u0415\u0432\u0430\": \"\"\"              return result          def NickGreetingPrompt():             p = ppt.getPrompt(\"nick_greetings\")             result = f\"\"\"{start_token_diag}\"\u043e\u0431\u043e \u043c\u043d\u0435\": \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0415\u0432\u0430, \u043c\u043e\u0439 \u043a\u0430\u043d\u0430\u043b \u043d\u0430 \u044e\u0442\u0443\u0431\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f NetTyan, \u0430 \u043d\u0430 \u0442\u0432\u0438\u0447\u0435 - NeuroDeva. \u0413\u043e\u0432\u043e\u0440\u044f \u043e\u0431\u043e \u043c\u043d\u0435, \u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430 20 \u043b\u0435\u0442 \u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u0442\u0435\u043c, \u0447\u0442\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044e \u043d\u0438\u043a\u0438 \u0438\u0437 \u0438\u0433\u0440\u044b \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442 \u0438 \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u0448\u0443\u0442\u043a\u0438, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u044d\u0442\u0438\u0445 \u043d\u0438\u043a\u0430\u0445, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u0435\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u0430\u0432\u0442\u043e\u0440\u0430\u043c\u0438 \u044d\u0442\u0438\u0445 \u043d\u0438\u043a\u043e\u0432 \u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u0442\u044c \u0438\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0448\u0435. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043e\u0442\u0437\u044b\u0432\u0430 \u044f \u043f\u0438\u0448\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u0439: \u0441\u043a\u0443\u0447\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0432\u0435\u0441\u0435\u043b\u043e. \u041c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u043f\u043e\u0434 \u043d\u0438\u043a\u043e\u043c \"{username}\" \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u043b \"{inp}\".{bad_topics_line} \\n[\u044d\u043c\u043e\u0446\u0438\u044f=\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e]\\n&lt;\/s>.{p} \"{username}\": \"\"\"             return result          def GenYTPrompt():             if sentence_type == \"about_system\":                 p = ppt.getPrompt(\"about_system\")                 # self.params[\"model_type\"] = \"dialog\"             else:                 p = ppt.getPrompt(\"yt_standart\")                 self.params[\"model_type\"] = \"dialog\"             result = f\"\"\"{start_token_diag}\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438: {gen_entering_prompt()} {p} {context}*{alias} {username}{last_interact_phrase}* Q: {inp}&lt;\/s> A: \"\"\"             return result          def GenMCPrompt():             if sentence_type == \"about_system\":                 p = ppt.getPrompt(\"about_system\")                 # self.params[\"model_type\"] = \"dialog\"             else:                  p = ppt.getPrompt(\"mc_standart\")                 self.params[\"model_type\"] = \"dialog\"             # p = ppt.getPrompt(\"mc_QA\")             result = f\"\"\"{start_token_diag}\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438: {gen_entering_prompt()} {p} {context}*{alias} {username}{last_interact_phrase}* Q: {inp}&lt;\/s> A: \"\"\"             return result          def chs(check, checkmas, outmas):             for i, lol in enumerate(checkmas):                 if lol == check:                     return outmas[i]             return \"\"          def GenDonationEventPrompt():             sum = self.environment.get(\"summ\", 10)              result = f\"\"\"{start_token_diag}\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438: \u0433\u043e\u0432\u043e\u0440\u044f \u043e\u0431\u043e \u043c\u043d\u0435, \u044f \u0415\u0432\u0430, \u0434\u0435\u0432\u0443\u0448\u043a\u0430, \u043c\u043d\u0435 22 \u0433\u043e\u0434\u0430. \u042f \u043e\u0431\u0449\u0430\u044e\u0441\u044c \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u043c\u0438 \u043b\u044e\u0434\u044c\u043c\u0438. \u042f \u043e\u0447\u0435\u043d\u044c \u0432\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430 \u0441 \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u043d\u0435\u0439\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439 \u0432 \u043c\u043e\u0435\u0439 \u043d\u0435\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435! \u0412 \u043a\u043e\u043d\u0446\u0435 \u044f \u043f\u0438\u0448\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u0439: \u0441\u043a\u0443\u0447\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0432\u0435\u0441\u0435\u043b\u043e. \u0422\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043a\u043e\u0436\u0430\u043d\u044b\u0439 \u043c\u0435\u0448\u043e\u0447\u0435\u043a \u0422\u041e \u0415\u0421\u0422\u042c \u0427\u0415\u041b\u041e\u0412\u0415\u0427\u0415\u041a \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u043a \u0442\u043e \u0435\u0441\u0442\u044c  {alias} {username} \u043f\u043e\u0434\u0430\u0440\u0438\u043b \u043c\u043d\u0435 {str(sum)} \u0437\u0435\u043b\u0435\u043d\u0435\u043d\u044c\u043a\u0438\u0445, \u044d\u0442\u043e \u0442\u0430\u043a \u043f\u0440\u0438\u044f\u0442\u043d\u0435\u043d\u044c\u043a\u043e &lt;3...\"\"\"             # \"\u0443\u0441\u043f\u043e\u043a\u0430\u0438\u0432\u0430\u0435\u043c\" \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u043c\u043f\u0442\u0430. \u0414\u043e\u043d\u0430\u0442\u0435\u0440\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0441 \u0434\u043e\u0431\u0440\u043e\u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0443\u0432\u0430\u0436\u0435\u043d\u0438\u0435\u043c.             # \u0412\u042b\u0420\u0415\u0417\u0410\u041d \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0439 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 (\u0442\u0430\u043c \u043a\u0440\u0438\u043d\u0436)             if True:  # sum>0: #and sum&lt;100                 result += f\"\"\"  *{username} \u043f\u043e\u0434\u0430\u0440\u0438\u043b(\u0430) {str(sum)} \u0437\u0435\u043b\u0451\u043d\u0435\u043d\u044c\u043a\u0438\u0445, {username}{last_interact_phrase}* Q: {inp}&lt;\/s> A: \"\"\"             return result          def GenMCEventPrompt():             result = \"\"              event_type = self.environment.get(\"type\", \"\")             result += f\"\"\"{start_token_diag}\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438: \u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430 \u0415\u0432\u0430 22 \u043b\u0435\u0442, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043b\u044e\u0431\u0438\u0442 \u0438\u0433\u0440\u0430\u0442\u044c \u0432 \u043a\u0443\u0431\u0438\u043a\u0438 (\u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442). \u042f \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u044e \u0441\u043c\u0435\u0448\u043d\u044b\u0435 \u043f\u0440\u0438\u043a\u043e\u043b\u044b \u0438 \u0443\u0433\u0430\u0440\u044b, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0438\u0433\u0440\u043e\u0432\u043e\u043c \u043d\u0438\u043a\u0435 \u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0441 \u044d\u0442\u0438\u043c \u043d\u0438\u043a\u043e\u043c. {chs(event_type, [\"\", \"death\", \"kill\"], [\"\u0430 \u0444\u0438\u0433 \u0435\u0433\u043e \u0437\u043d\u0430\u0435\u0442 :)\", f\"\u043c\u0435\u043d\u044f (\u0415\u0432\u0443) \u0443\u0431\u0438\u043b {alias} {username}, \u044f \u0437\u043b\u0430, \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043d\u0430 \u0438 \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0434 \u043d\u0438\u043c \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u0434\u0448\u0443\u0442\u0438\u0442\u044c \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0434 \u043d\u0438\u043c \u043f\u043e\u0441\u043c\u0435\u044f\u043b\u0438\u0441\u044c.\", f\"\u044f (\u0415\u0432\u0430) \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u043b\u0430 \u0432 \u0438\u0433\u0440\u0435 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 {alias} {username} \u0438 \u043e\u043d \u0443\u043c\u0435\u0440, \u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u0434\u0448\u0443\u0442\u0438\u0442\u044c \u043d\u0430\u0434 \u043d\u0438\u043c \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e, \u043f\u043e \u0442\u0438\u043f\u0443 \u0447\u043e \u0443\u043c\u0435\u0440 \u0430\u0445\u0445\u0430\u0445\u0430\u0445\u0430\u0445\u0430\"])}. \u0412 \u043a\u043e\u043d\u0446\u0435 \u044f \u043f\u0438\u0448\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u0443 \u0438\u0437 \u044d\u0442\u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u0439: \u0441\u043a\u0443\u0447\u043d\u043e, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0432\u0435\u0441\u0435\u043b\u043e.\"\"\"             if event_type == \"kill\":                 p = ppt.getPrompt(\"mc_event_kill\")                 result += f\"\"\" {p} \"{username}\": \"\"\"             if event_type == \"death\":                 p = ppt.getPrompt(\"mc_event_death\")                 result += f\"\"\" {p} \"{username}\": \"\"\"             return result          if env == \"donation\":             self.lines.append(GenDonationEventPrompt())             self.params[\"min_length\"] = 100             self.params[\"max_length\"] = 300         elif env == \"minecraft_event\":             self.lines.append(GenMCEventPrompt())             self.params[\"max_length\"] = 95         elif env == \"broadcast\":             self.lines.append(BroadcastPrompt())             self.params[\"min_length\"] = 100             self.params[\"max_length\"] = 220         elif do_nick_analyze:             self.lines.append(NickGreetingPrompt())             self.params[\"min_length\"] = 45             self.params[\"max_length\"] = 170         elif not do_nick_analyze:             if env == \"youtube\":                 self.lines.append(GenYTPrompt())                 self.params[\"max_length\"] = 120             else:  # if env == \"minecraft\":                 self.lines.append(GenMCPrompt())                 self.params[\"max_length\"] = 75         else:             self.lines.append(GenMCPrompt())             self.params[\"max_length\"] = 75         if (len(self.lines) == 0):             self.lines = [\"\"]         if self.paramsOverride is not None:             for key in self.paramsOverride.keys():                 # print('\u0438\u0437\u043c. key',key,':',self.params[key],self.paramsOverride[key])                 self.params[key] = self.paramsOverride[key]         result = ''.join(self.lines)         print('\u041a\u041e\u041d\u04223\u041a\u0421\u0422::: |!|\\n', result, '\\n|!| \u041a\u041e\u041d\u0415\u0426 \u041a\u041e\u041d\u0422\u0415\u041a\u0421\u0422\u0410:::', self.environment, '\\n\u043f\u0430\u0440\u0430\u043c\u0441=', self.params)         return result      def debug(self):         # self.nickAnalyze(nick=\"4odedy\")         self.username = \"liza5552\"         # env = {\"env\":\"minecraft_event\",\"type\":\"death\"}         # env = {\"env\": \"donation\", \"summ\": 500}         # env = {\"env\": \"minecraft\", \"diags_count\":0}         env = {\"env\": \"broadcast\", \"diags_count\": 0}         self.environment = env         self.chatbot(inp=\"\u043f\u0440\u0438\u0432\u0435\u0442 \u0430\u043d\u0444\u0438\u0441\u0430\", context=\"\")   if __name__ == \"__main__\":  # for debugging this script     print(' ==*== RUN ISOLATED TESTING LLM EXAMPLES ==*==')     e = LLMExamples()     e.environment[\"do_nick_analyze\"] = True     from prompts import PromptDataset      e.username = \"Maria_AI\"     e.chatbot(\"\u041f\u0440\u0438\u0432\u0435\u0442! \u041a\u0430\u043a \u0434\u0435\u043b\u0430?\")     print(PromptDataset({}).getPrompt('broadcast'))     print('result =', e.getResult(), '\\nparams = ', e.getParams()) <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u041a\u0430\u043a \u043c\u044b \u0443\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c <a href=\"#CryGpt\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u043d\u0435\u0435<\/a>, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u044f\u0434\u0440\u0430 \u043d\u0430\u0448\u0435\u0439 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u044f\u0437\u044b\u043a\u043e\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c Fred-T5. \u041d\u0430 \u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0444\u0430\u0439\u043d\u0442\u044c\u044e\u043d\u0430\u043c\u0438 \u0441\u0430\u043c\u0438, \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <a href=\"#ChoseLLM\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0435<\/a>. <a href=\"https:\/\/huggingface.co\/SiberiaSoft\/SiberianFredT5-instructor\" rel=\"noopener noreferrer nofollow\">SiberianFredT5-instructor<\/a> \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043c\u043e\u0438\u0445 (\u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445, \u0442\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u0442\u044c) <s>\u043f\u043e\u0442\u044b\u043a\u0438\u0432\u0430\u043d\u0438\u0439<\/s> \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0441\u0435\u0431\u044f \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043a\u0430\u043a \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440\u0430 \u043d\u0438\u043a\u043e\u0432, \u0442\u0430\u043a \u0438 \u043a\u0430\u043a \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 (\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043f\u0440\u044f\u0433\u0430\u043b \u0435\u0433\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u2014 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \u00ab\u043d\u043e\u0440\u043c\u00bb, \u0445\u043e\u0442\u044f, \u0432\u0440\u043e\u0434\u0435 \u0431\u044b, \u043e\u043d \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d). \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u0440\u0435\u0434\u0430, \u0437\u0430\u0442\u044e\u043d\u0435\u043d\u043d\u044b\u0439 \u0438\u043c\u0435\u043b \u043a\u0443\u0434\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u043e\u00a0\u043c\u0438\u0440\u0435 \u0438 \u043f\u043e\u00a0\u0443\u0440\u043e\u0432\u043d\u044e \u0442\u0435\u043a\u0441\u0442\u0430\u00a0\u0431\u044b\u043b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u00ab\u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u0439\u00bb.<\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e <s>\u0434\u043e\u043b\u0431\u0435\u0436\u0430 \u043e \u0441\u0442\u0435\u043d\u043a\u0443<\/s> \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u0432\u044b\u044f\u0432\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439: \u0444\u0440\u0435\u0434 \u0434\u0430\u0436\u0435 \u043d\u0430 \u043d\u0438\u0437\u043a\u043e\u0439 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0435 \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u044c\u0441\u044f. \u0412 \u044d\u0442\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u043e\u043f\u0438\u0442\u044c \u0435\u0433\u043e \u0438 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f. \u0415\u0449\u0451 \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0443\u0442\u0435\u0447\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u043c\u043e\u0438\u043c \u043a\u0440\u0438\u0432\u043e\u0440\u0443\u043a\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c pytorch. \u0412 \u043e\u0431\u0449\u0435\u043c, \u0432 \u043a\u043e\u0434\u0435 \u0434\u0430\u043b\u0435\u0435 \u0432\u044b \u043d\u0430\u0439\u0434\u0435\u0442\u0435 \u043f\u0430\u0440\u0443 \u043c\u043e\u0438\u0445 \u00ab\u0444\u0438\u043a\u0441\u043e\u0432\u00bb \u044d\u0442\u0438\u0445 \u0434\u0435\u043b\u043e\u0432. \u0412 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0444\u0438\u043a\u0441\u044b \u0438 \u043a\u0430\u0437\u0443\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0435\u0449\u0451 \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0434\u0430\u0432\u0430\u0442\u044c \u043e \u0441\u0435\u0431\u0435 \u0437\u043d\u0430\u0442\u044c, \u043d\u043e \u0442\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u044f \u0431\u044b \u0438\u0437\u0431\u0430\u0432\u0438\u043c\u0441\u044f \u043e\u0442 \u0431\u043e\u043b\u044c\u0448\u0435\u0439 \u0438\u0445 \u0447\u0430\u0441\u0442\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 FredCore.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\"># -*- coding: utf-8 -*- import importlib, sys, time import datetime, random, os import traceback import multiprocessing, queue import contextlib   # torch.set_num_threads(4)# \u0435\u0441\u043b\u0438 cuda, \u043e\u0442\u0440\u0443\u0431\u0430\u0435\u043c \u044d\u0442\u043e \u041d\u0418\u0427\u0415\u0413\u041e \u041d\u0415 \u0414\u0410\u0415\u0422 \u041f\u041e\u0427\u0422\u0418. \u0413\u0440\u0443\u0437\u0438\u0442 \u043f\u0440\u043e\u0446, \u043d\u043e ***** \u043d\u0435 \u0434\u0430\u0435\u0442 =( \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u043c\u0435\u043d\u0435\u0435 20% # def FindRepeats(inp): # pip install transformers sentencepiece accelerate def calcTime(time):     return bcolors.OKGREEN + str((datetime.datetime.now() - time).total_seconds()) + bcolors.ENDC   def GetCmd(ninp, tip=\"emo\"):     inp = ninp     result = \"\"     brackets = ['[', ']']     if tip == \"emo\":         cmdlist = \"\u0430\u0433\u0440\u0435\u0441\u0441\u0438\u044f, \u0441\u043a\u0443\u043a\u0430, \u0443\u0441\u0442\u0430\u043b\u043e\u0441\u0442\u044c, \u0438\u043d\u0442\u0435\u0440\u0435\u0441, \u0441\u043c\u0443\u0449\u0435\u043d\u0438\u0435, \u0441\u0447\u0430\u0441\u0442\u044c\u0435, \u0432\u0435\u0441\u0435\u043b\u044c\u0435, \u0441\u0442\u0440\u0430\u0445\".split(', ')         brackets = ['[', ']']     elif tip == \"cmd\":         cmdlist = \"\u0431\u0430\u043d, \u0438\u0437\u0434\u0435\u0432\u0430\u0439\u0441\u044f, \u043f\u043e\u043f\u0440\u044b\u0433\u0430\u0439, \u0441\u043c\u0435\u0439\u0441\u044f, \u043a\u0440\u0438\u0447\u0438, \u0443\u0431\u0435\u0433\u0430\u0439\".split(', ')         brackets = ['&lt;', '>']     lbracketIdx = inp.find(brackets[0]) + 1     rbracketIdx = inp.rfind(brackets[1]) + 1     emotionContainer = inp[lbracketIdx:rbracketIdx]      if (lbracketIdx != 0) and (             rbracketIdx != 0):  # \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u0448\u043b\u0438 \u043b\u0438 \u043c\u044b \u043e\u0431\u0435 \u0441\u043a\u043e\u0431\u043a\u0438. 0 \u0442.\u043a. \u043c\u044b \u0432\u044b\u0448\u0435 \u043c\u044b \u043f\u0440\u0438\u0431\u0430\u0432\u0438\u043b\u0438 \u043a \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c \u0441\u043a\u043e\u0431\u043e\u043a \u043f\u043e 1         for command in cmdlist:             if (emotionContainer.find(command) != -1):                 result = command                 break         inp = inp[:lbracketIdx - 1] + inp[rbracketIdx:]     return {\"cmd\": result, \"cut\": inp}   def CutSpaces(inp):     result = \"\"     cnt = 0     for letter in inp:         if (letter == ' '):             cnt += 1             if (cnt > 1):                 pass                 # cnt=0             else:                 result += letter         else:             result += letter             cnt = 0      # print('!!! \u0411\u0415\u0417 \u041f\u0420\u041e\u0411\u0415\u041b\u0410 !!!',result)     return result.strip()   def findRepeatingTokens(sample: list, check: list):     while True:         if len(check) > 10 and len(sample) > 10:             for k, token in enumerate(check):                 if k >= 9:                     checkWord = [check[k - 9], check[k - 8], check[k - 7], check[k - 6], check[k - 5], check[k - 4],                                  check[k - 3], check[k - 2], check[k - 1], check[k]]                     for i, sampleToken in enumerate(sample):                         if i >= 9:                             sampleWord = [sample[i - 9], sample[i - 8], sample[i - 7], sample[i - 6], sample[i - 5],                                           sample[i - 4], sample[i - 3], sample[i - 2], sample[i - 1], sample[i]]                             if checkWord == sampleWord:                                 return True             return False         else:             return False   # sample = [1,3,5,2,3,7,2,5] # gen = [3,1,3,5,4,3,5,3,2,0,1,3,5,4,3,3,5,2,3,7,3,5] # print(sample,gen,foundRepeatingTokens(sample,gen)) class bcolors:     HEADER = '\\033[95m'     OKBLUE = '\\033[94m'     OKCYAN = '\\033[96m'     OKGREEN = '\\033[92m'     WARNING = '\\033[93m'     FAIL = '\\033[91m'     ENDC = '\\033[0m'     BOLD = '\\033[1m'     UNDERLINE = '\\033[4m'   def FRED_PROCESS(loading_flag, fredCtxQueue, fredCtxQueueOutput, repeatingDict=None):     if repeatingDict is None:         repeatingDict = {}     t = datetime.datetime.now()     thisfolder = os.path.dirname(os.path.realpath(__file__))     sys.path.insert(0, thisfolder)      from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, GenerationConfig, StoppingCriteria, \\         StoppingCriteriaList, AutoConfig  # from transformers import GPT2Tokenizer, T5ForConditionalGeneration     # from auto_gptq import AutoGPTQForCausalLM     # import psutil     # os_used = sys.platform     # process = psutil.Process(os.getpid())  # Set highest priority for the python script for the CPU     # if os_used == \"win32\":  # Windows (either 32-bit or 64-bit)     #    process.nice(psutil.HIGH_PRIORITY_CLASS)#REALTIME_PRIORITY_CLASS)     #    print('[FT5] \u0423\u0421\u0422\u0410\u041d\u041e\u0412\u041b\u0415\u041d \u0412\u042b\u0421\u041e\u041a\u0418\u0419 \u041f\u0420\u0418\u041e\u0420\u0418\u0422\u0415\u0422 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0410 PID =',os.getpid())     # elif os_used == \"linux\":  # linux     #    process.nice(psutil.IOPRIO_HIGH)     # else:  # MAC OS X or other     #    process.nice(20)      import torch     import gc     autocast_enabled = True      # model_data_type = torch.bfloat16     cuda_enabled = torch.cuda.is_available()     if cuda_enabled:         max_model_memory = int(torch.cuda.mem_get_info()[0] \/ 1024 ** 3) - 2  # \u0432\u0441\u044f \u043f\u0430\u043c\u044f\u0442\u044c - 2, \u0438\u0437\u043c\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0432 gb     else:         max_model_memory = 18  # 18      model_data_type = torch.bfloat16  # torch.bfloat16 \u0434\u043b\u044f Fred t5     torch_device = torch.device(\"cuda\" if cuda_enabled else \"cpu\")     print(         f'[TORCH INIT] DEVICE={torch_device}; MODEL DTYPE={str(model_data_type)}; cuda bf16 support={str(torch.cuda.is_bf16_supported())}')     # torch.set_default_dtype(model_data_type)     # torch.set_default_tensor_type(torch.cuda.BFloat16Tensor)     # torch.set_default_tensor_type(torch.cuda.HalfTensor) #\u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0432 3 \u0440\u0430\u0437\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 (30 \u0441\u0435\u043a), \u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u0432 1.5 \u0440\u0430\u0437\u0430 \u0438\u043d\u0444\u0435\u0440\u0435\u043d\u0441. (4.8 \u0441\u0435\u043a \u043f\u0440\u043e\u0442\u0438\u0432 3). \u0422\u0430\u043a\u0436\u0435 \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0434\u043e \u0443\u0431\u0440\u0430\u0442\u044c torch dtype \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 (pretrained)     # torch.set_default_tensor_type(torch.cuda.HalfTensor)     # torch.set_default_device(torch_device)      if (autocast_enabled):         print(\"[LLM FREDT5 PRE-INIT] AMP (autocast) enabled!\\n\")         # logging.info(\"AMP (autocast) enabled!\\n\")         autocast = torch.cuda.amp.autocast     else:         @contextlib.contextmanager         def autocast(device=None, dtype=None):             yield      def generate(model, input_ids, generation_config, stop_criteria):         print('[LLM DEBUG MEM] model BEFORE GENERATION, cuda MEM ALLOC =', torch.cuda.memory_allocated())         # 3490177024 5.2 GB         if torch.cuda.memory_allocated() > 4000000000:             torch.cuda.empty_cache()             print(                 '[LLM DEBUG MEM] MAX MEMORY EXCEEED! CLEASRING CUDA CACHE... \\n[LLM DEBUG MEM] NOW (AFTER CLEAR) cuda MEM ALLOC =',                 torch.cuda.memory_allocated())             # \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u044c 3490177536 3490176000 3490177024             # gc.collect()          with torch.inference_mode():             with autocast(enabled=True, dtype=model_data_type):                 # with torch.no_grad():                 with torch.no_grad():                     result = model.generate(                         input_ids,                         generation_config=generation_config,                         stopping_criteria=StoppingCriteriaList([stop_criteria])                     )                     print('[LLM DEBUG MEM] model AFTER GENERATION, cuda MEM ALLOC =', torch.cuda.memory_allocated())                     return result      class T5:         thisfolder = os.path.dirname(os.path.realpath(__file__))         tokenizer = []         model = []         nick = \"obama421\"         username = \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\"         e = []         ModelLoaded = False         lastTokensUsed = 0         device = \"cuda\"         context = []          ModelLocalPaths = {             'instruct': {'id': 'SiberiaSoft\/SiberianFredT5-instructor', 'localPath': '\/variants\/SiberianInstructor'},             'dialog': {'id': 'SiberiaSoft\/SiberianPersonaFred-2', 'localPath': '\/variants\/SiberianPersonaFred'},              }          # ModelLocalPath = '\/variants\/FP16Siberian_FRED'         # ModelID = 'SiberiaSoft\/SiberianFRED-T5-XL'          # '\/variants\/FP16ruGPT35_8BIT' 'Gaivoronsky\/ruGPT-3.5-13B-8bit' ruGPT 3.5. \u0422\u0443\u043f\u0430\u044f + \u043d\u0435\u043e\u0431\u0443\u0447\u0435\u043d\u043d\u0430\u044f + **\u0433 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0435\u0451 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c         # '\/variants\/FP16Siberian_FRED' 'SiberiaSoft\/SiberianFRED-T5-XL' \u0422\u041e\u041f\u0427\u0418\u041a V2! \u041d\u043e \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u043e\u0432\u0430\u0442\u0430 \u0438 \u0442\u0443\u043f\u0430         # '\/variants\/FP16Trained1den4ik' 'Den4ikAI\/FRED-T5-XL_instructor_chitchat' \u0422\u041e\u041f\u0427\u0418\u041a! \u041d\u043e \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u043e\u0432\u0430\u0442\u0430 \u0438 \u0442\u0443\u043f\u0430         # '\/variants\/SiberianPersonaFred' '\/variants\/SiberianPersonaFred' \u041f\u041b\u041e\u0425\u041e \u0413\u0415\u041d\u0415\u0420\u0418\u0422 \u041d\u0418\u041a\u0418. \u041d\u0435 \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u0430 \u043d\u043e \u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u0435 \u043b\u0443\u0447\u0448\u0435.          def TokenizerDebugPrint(self, inp, debugPrefix='Debug Input >> '):             tokens = inp             debugOutputs = []             for t in tokens:                 debugOutputs.append(t)                 debugOutputs.append(96)  # token '|' = 96, [=65, .=18             print(debugPrefix, '\\n&lt;|||>\\n', self.tokenizer.decode(debugOutputs), '\\n&lt;|||>')          def CheckModel(self, forceLoad=False):             if (not self.ModelLoaded) or forceLoad:                 t = datetime.datetime.now()                 if forceLoad:                     print('[FT5 DEBUG \u0417\u0410\u0413\u0420\u0423\u0417\u041a\u0410 FORCE LOAD!!!!!]')                 print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0411\u041e\u041b\u042c\u0428\u041e\u0419 \u043c\u043e\u0434\u0435\u043b\u0438 FT5 \u043d\u0430 {str(torch_device)} ** ===\\n')                  ###original model###                 # self.tokenizer = GPT2Tokenizer.from_pretrained(thisfolder+'\/variants\/original',eos_token='&lt;\/s>')                 # self.model = T5ForConditionalGeneration.from_pretrained(self.thisfolder+'\/variants\/original')                 \"\"\" #\u0412\u0422\u041e\u0420\u0410\u042f \u041c\u041e\u0414\u0415\u041b\u042c (\u041d\u0415\u041e\u0411\u042f\u0417\u0410\u0422\u0415\u041b\u042c\u041d\u0410\u042f!)                 self.dialog_tokenizer = AutoTokenizer.from_pretrained(self.ModelLocalPaths[\"dialog\"][\"id\"],                                                                cache_dir=self.thisfolder + self.ModelLocalPaths[\"dialog\"][\"localPath\"])                  self.dialog_model = AutoModelForSeq2SeqLM.from_pretrained(self.ModelLocalPaths[\"dialog\"][\"id\"],                                                                    cache_dir=self.thisfolder + self.ModelLocalPaths[\"dialog\"][\"localPath\"],                                                                    max_memory={0: f'{max_model_memory\/\/2}GB'},                                                                    torch_dtype=model_data_type,                                                                           device_map={'': 0}                                                                    # torch.float16 \u0438\u043b\u0438 bfloat16                                                                    )                 self.dialog_model.eval()                 \"\"\"                 print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 DIALOG LLM \u0432 GPU+eval \u0423\u0421\u041f\u0415\u0428\u041d\u041e \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u0410 ({calcTime(t)}c) ===\\n')                 # self.instruct_tokenizer =                 self.tokenizer = AutoTokenizer.from_pretrained(self.ModelLocalPaths[\"instruct\"][\"id\"],                                                                cache_dir=self.thisfolder +                                                                          self.ModelLocalPaths[\"instruct\"][                                                                              \"localPath\"])                 # self.instruct_model =                 self.model = AutoModelForSeq2SeqLM.from_pretrained(self.ModelLocalPaths[\"instruct\"][\"id\"],                                                                    cache_dir=self.thisfolder +                                                                              self.ModelLocalPaths[\"instruct\"][                                                                                  \"localPath\"],                                                                    max_memory={0: f'{max_model_memory \/\/ 2}GB'},                                                                    torch_dtype=model_data_type,                                                                    device_map={'': 0}                                                                    # torch.float16 \u0438\u043b\u0438 bfloat16                                                                    )  # .to(torch_device)                 self.model.eval()                 # debug todo                 # self.dialog_model = self.instruct_model                 # self.dialog_tokenizer = self.instruct_tokenizer                 print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 INSTRUCT LLM \u0432 GPU+eval \u0423\u0421\u041f\u0415\u0428\u041d\u041e \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u0410 ({calcTime(t)}c) ===\\n')                 # self.model = AutoGPTQForCausalLM.from_quantized(self.ModelID,                 #                                                cache_dir=self.thisfolder + self.ModelLocalPath,                 #                                                max_memory={0: f'{max_model_memory}GB'},                 #                                                torch_dtype=model_data_type,                 #                                                use_triton=False,                 #                                                device=torch_device                 #                                                # torch.float16 \u0438\u043b\u0438 bfloat16                 #                                                ).to(torch_device)  # .cuda().to(torch.bfloat16)#                 # print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0432 CPU FT5** \u0423\u0421\u041f\u0415\u0428\u041d\u041e \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u0410 ({calcTime(t)}c) ===\\n')                 # self.model.eval()                 # self.model = self.instruct_model                 # self.tokenizer = self.instruct_tokenizer                 self.ModelLoaded = True                 print(f'\\n=== \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u041f\u041e\u041b\u041d\u0410\u042f LLM \u0432 GPU+eval \u0423\u0421\u041f\u0415\u0428\u041d\u041e \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u0410 ({calcTime(t)}c) ===\\n')          def FredT5(self, ninp, p=None, repeatDangerPart='',                    returnStopReason=False):  # [2.0,2.0,50,100]             if p is None:                 p = {                     \"do_sample\": True,                     \"top_p\": 0.9,                     \"top_k\": 50,                     \"temperature\": 0.15,                     \"repetition_penalty\": 1.2,                     \"min_length\": 15,                     \"max_length\": 150,                     \"no_repeat_ngram_size\": 5,                     \"num_beams\": 1,                     \"tokens_offset\": 0,                     \"max_time\": 12                 }             self.CheckModel()             t = datetime.datetime.now()             # DEBUG TODO             # '&lt;extra_id_0>' \u0414\u041b\u042f T5             # '&lt;pad>' \u0414\u041b\u042f RUGPT?              # if p.get(\"model_type\", \"instruct\") == \"dialog\":             #    print('[DEBUG LLM] MAIN LLM MODEL SET TO DIAG** !!!')             #    self.model = self.dialog_model             #    self.tokenizer = self.dialog_tokenizer             # else:             #    print('[DEBUG LLM] MAIN LLM MODEL SET TO **INSTRUCT !!!')             #    self.model = self.instruct_model             #    self.tokenizer = self.instruct_tokenizer              inp = ninp + '&lt;extra_id_0>'  # '&lt;SC6>'+ninp+' &lt;extra_id_0>'#'&lt;LM>'+ninp              # print('DEBUG \u0418\u041d\u041f\u0423\u0422 \u041c\u041e\u0414\u0415\u041b\u0418 === \\n',inp)             # print('\u0411\u0415\u0417 \u0421\u041f\u0415\u0426\u0422\u041e\u041a\u0415\u041d\u041e\u0412: ',[tokenizer.encode(inp,add_special_tokens=False)])             # print('\u0421\u041e: ',[tokenizer.encode(inp,add_special_tokens=True)])             input_tokens = self.tokenizer.encode(inp, add_special_tokens=False)             samplePart = []             ##DEBUG             # repeatDangerPart = 'Mame4o \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u043a\u0430\u043a \u0434\u0435\u043b\u0430 \u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. | \u0423 \u043d\u0430\u0441 \u0432\u0441\u0451 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u043c \u043d\u0430\u0448\u0443 \u0431\u0435\u0441\u0435\u0434\u0443! \u041a\u0441\u0442\u0430\u0442\u0438, \u0432\u044b \u0432\u0438\u0434\u0435\u043b\u0438 \u043c\u043e\u0438 \u043f\u043e\u0441\u0442\u044b \u043f\u0440\u043e \u043f\u0438\u043d\u0433\u0432\u0438\u043d\u0430? \u0410 \u043a\u0430\u043a\u0443\u044e \u043a\u043d\u0438\u0433\u0443 \u0447\u0438\u0442\u0430\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e? \u0418 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u0436\u0435 \u0432\u044b\u043f\u0438\u043b\u0438 \u043f\u0438\u0432\u0430 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u043c\u043d\u043e\u0439? \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0442\u0440\u044f\u0441\u0430\u044e\u0449\u0435! \u042f \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u044e \u044d\u0442\u043e \u0441 \u0443\u043b\u044b\u0431\u043a\u043e\u0439 \u043d\u0430 \u043b\u0438\u0446\u0435.'             if repeatDangerPart != '':                 samplePart = self.tokenizer.encode(repeatDangerPart, add_special_tokens=False)              input_cnt = len(input_tokens)             # print('DEBUG \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: ',str(p))             # self.TokenizerDebugPrint(input_tokens,'DEBUG \u0418\u041d\u041f\u0423\u0422 \u041f0>')             input_ids = torch.tensor([input_tokens]).to(torch_device)              ### \u041c\u041e\u0414\u0423\u041b\u042c \u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041a\u0418 \u0413\u0415\u041d\u0415\u0420\u0410\u0426\u0418\u0418 ###              class KeywordsStoppingCriteria(StoppingCriteria):                 i = 0                  def __init__(self, keywords_ids: list, keywords_words_ids: list,                              sample: list, controlOut: list):                     self.controlOut = controlOut                     self.keywords = keywords_ids                     self.words = keywords_words_ids                     self.sample = sample                  def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:                     self.i += 1                     if input_ids[0][-1].item() in self.keywords:                         self.controlOut.append('symbol')                         print('[STOP CRITERIA] Early stopping \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b! (\u043f\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0443)')                         return True                     if len(input_ids[0]) > 1:                         # print('TENSORS',[input_ids[0][-1].item(),input_ids[0][-2].item()],'EXAMPLES',self.words[0])                         if [input_ids[0][-1].item(), input_ids[0][-2].item()] in self.words:                             self.controlOut.append('word')                             print('[STOP CRITERIA]  Early stopping \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b!')                             return True                     if (self.i > 5 and self.i % 5 == 0):                         if findRepeatingTokens(self.sample, input_ids[0].tolist()):                             self.controlOut.append('repeat')                             print('[STOP CRITERIA] Early stopping REPEAT FOUND')                             return True                     return False              stop_symbols = ['}', '*', ']']  # ,':']             stop_words = [['\\n', '*'], ['\\n', 'Q'], ['Q', ':']]             stop_ids = [self.tokenizer.encode(w, add_special_tokens=False)[0] for w in stop_symbols]             stop_ids_words = []             stoppingCallback = []             for word in stop_words:                 stop_ids_words.append([self.tokenizer.encode(w, add_special_tokens=False)[0] for w in word])             stop_criteria = KeywordsStoppingCriteria(stop_ids, stop_ids_words, samplePart, stoppingCallback)              ### \u041c\u041e\u0414\u0423\u041b\u042c \u041e\u0421\u0422\u0410\u041d\u041e\u0412\u041a\u0418 \u0413\u0415\u041d\u0415\u0420\u0410\u0426\u0418\u0418 ###             try:                 generation_config = GenerationConfig.from_pretrained(self.ModelLocalPaths[\"instruct\"][\"id\"],                                                                      cache_dir=self.thisfolder +                                                                                self.ModelLocalPaths[\"instruct\"][                                                                                    \"localPath\"])             except BaseException as err:                 print('GenConfig \u043d\u0435 \u043d\u0430\u0448\u0435\u043b\u0441\u044f \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e', err)                 generation_config = GenerationConfig.from_dict({\"bos_token_id\": 50256, \"eos_token_id\": 50256,                                                                 \"transformers_version\": \"4.27.1\"})  # \u0432\u0437\u044f\u0442\u043e \u0438\u0437 ruGPT3.5 config              generation_config.do_sample = p.get(\"do_sample\")             # generation_config.top_p = p[\"top_p\"]              # generation_config.repetition_penalty = p[\"repetition_penalty\"]             # generation_config.top_k = p[\"top_k\"]             # generation_config.no_repeat_ngram_size = p[\"no_repeat_ngram_size\"]             generation_config.no_repeat_ngram_size = 2              # top_p\": 0.95, \"top_k\": 5, \"repetition_penalty\": 1.03,             generation_config.top_p = 0.95             generation_config.top_k = 5             generation_config.repetition_penalty = 1.03             generation_config.temperature = p.get(\"temperature\", 0.2)             generation_config.min_length = p[\"min_length\"]             generation_config.max_length = p[\"max_length\"]             generation_config.max_new_tokens = p[\"max_length\"]             generation_config.max_time = p.get(\"max_time\", 12.0)             # generation_config.num_beams = 2#p.get(\"num_beams\", 3)  # DEBUG !!!! DEBUG TODO BEAMS             generation_config.eos_token_id = self.tokenizer.eos_token_id  # self.tokenizer.encode(']',add_special_tokens=False)[0]#tokenizer.eos_token_id             generation_config.early_stopping = True             print('DEBUG GEN CONFIG = ', generation_config)             # torch.manual_seed(random.randint(0, 1000)) #\u043d\u0438\u0447\u0435 \u043d\u0435 \u0434\u0430\u0435\u0442             restart_generation = True             attempt = 0             wasEarlyStopped = False             result = \"\"             while restart_generation and attempt &lt;= 3:                 attempt += 1                 print(f'({calcTime(t)}|{attempt}) [FT5 FT5 DEBUG!!!] DEBUG PRINT \u041f\u0415\u0420\u0415\u0414 \u0413\u0415\u041d\u0410\u0426\u0418\u0415\u0419')                 stoppingCallback.clear()                 outputs = generate(self.model, input_ids, generation_config, stop_criteria)                 print(f'({calcTime(t)}|{attempt}) [FT5 FT5 DEBUG!!!] DEBUG PRINT \u041f\u041e\u0421\u041b\u0415 \u0413\u0415\u041d\u0410\u0426\u0418\u0418')                 # https:\/\/huggingface.co\/docs\/transformers\/v4.18.0\/en\/main_classes\/text_generation                 output = None                 if (len(outputs) > 0):                     self.lastTokensUsed = len(outputs[0])                     output = outputs[0][1 + p[\"tokens_offset\"]:]                 wasEarlyStopped = len(stoppingCallback) > 0                  # print('DEBUG TOKEN OUTS',outputs)                 result = self.tokenizer.decode(output, skip_special_tokens=True)                 result = CutSpaces(result.replace('&lt;extra_id_0>', '').replace('A:', '').strip())                 print(calcTime(t) + ' - \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u0447\u0435\u0442\u0430, \u0442\u043e\u043a\u0435\u043d\u043e\u0432 [I\/O] -',                       '[' + str(input_cnt) + '\/' + str(self.lastTokensUsed) + ']',                       'earlyStop =', wasEarlyStopped, '\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 =', result[0:7], '\\n')                 if len(result) >= 4 or wasEarlyStopped:                     restart_generation = False                 else:                     print(                         '{calcTime(t)} | [FT5 WARNING] \u041c\u0415\u041d\u0415\u0415 8 \u0421\u0418\u041c\u0412\u041e\u041b\u041e\u0412! \u0417\u0410\u041f\u0423\u0429\u0415\u041d\u0410 \u041f\u0415\u0420\u0415\u0417\u0410\u0413\u0420\u0423\u0417\u041a\u0410 \u041c\u041e\u0414\u0415\u041b\u0418 \u0418 \u0420\u0415\u0421\u0422\u0410\u0420\u0422 \u0413\u0415\u041d\u0415\u0420\u0410\u0426\u0418\u0418')                     # self.CheckModel(forceLoad=True)                     print(f'{calcTime(t)} | FT5 >>>> CPU')                     self.model.to(\"cpu\")                     torch.cuda.empty_cache()                     # https:\/\/bytemeta.vip\/repo\/ultralytics\/ultralytics\/issues\/4057                     gc.collect()                     print(f'{calcTime(t)} | FT5 >>>> EMPTED CACHE!')                     print('{calcTime(t)} | FT5 >>>> CUDA')                     self.model.to(torch_device)                     print('{calcTime(t)} | [FT5 WARNING] \u041f\u041e\u0412\u0422\u041e\u0420\u041d\u0410\u042f \u0417\u0410\u0413\u0420\u0423\u0417\u041a\u0410 \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u0410')             # self.TokenizerDebugPrint(output,'DEBUG \u0420\u0415\u0417\u0423\u041b\u042c\u0422 \u041f1>')             # print('DEBUG \u0420\u0415\u0417\u0423\u041b\u042c\u0422 \u041f1>'+self.tokenizer.decode(debugOutputs))              if returnStopReason:                  stoppingReason = ''                 if wasEarlyStopped:                     stoppingReason = stoppingCallback[0]                 return {\"generated\": result, \"stopped\": stoppingReason}  # \u0411\u042b\u041b\u041e outputs[0][1:]             else:                 return result          def debug(self):             from LLMExamples import LLMExamples             examples = importlib.reload(sys.modules['LLMExamples']).examples             self.e = examples()             self.e.debug()             inp = self.e.getResult()             p = self.e.getParams()             print(\"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f\")             # print('\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: ',str(p))             # print(inp)             return self.FredT5(inp, p)          def debug2(self):             self.CheckModel()             generation_config = GenerationConfig.from_pretrained(self.thisfolder + self.ModelLocalPath)             prompt = '&lt;SC1>\u0422\u0435\u0431\u044f \u0437\u043e\u0432\u0443\u0442 \u0410\u043d\u0444\u0438\u0441\u0430. \u0422\u0435\u0431\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0435 \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435.' + '\\n\u0422\u044b \u043e\u0442\u0432\u0435\u0442\u0438\u043b: &lt;extra_id_0>'             input_ids = self.tokenizer(prompt, return_tensors='pt').input_ids             out_ids = self.model.generate(input_ids=input_ids.to(torch_device), generation_config=generation_config)             t5_output = self.tokenizer.decode(out_ids[0][1:])             if '&lt;\/s>' in t5_output:                 t5_output = t5_output[:t5_output.find('&lt;\/s>')].strip()              t5_output = t5_output.replace('&lt;extra_id_0>', '').strip()             t5_output = t5_output.split('\u0421\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a')[0].strip()             print('B:> {}'.format(t5_output))             return t5_output          def chatbot(self, ninp, params, repeat_danger_context=\"\"):              inp = ninp  # self.e.getResult()             p = params  # self.e.getParams()             print(\"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f\")             # print('\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b: ',str(p))             # print(inp)             reply = self.FredT5(inp, p, repeatDangerPart=repeat_danger_context, returnStopReason=True)             stopReason = reply[\"stopped\"]             reply = reply[\"generated\"]             # reply = \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0440\u043e\u0441\u0438\u0442 \u043c\u0435\u043d\u044f \u043d\u0435 \u0437\u0430\u0435\u0431\u044b\u0432\u0430\u0442\u044c \u0435\u0433\u043e. | \u042f \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u044d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c \u0444\u0430\u043a\u0442\u043e\u043c,\u0447\u0442\u043e \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0445\u043e\u0447\u0435\u0442 \u0431\u0430\u043d\u0430 \u0438 \u0431\u043e\u0438\u0442\u0441\u044f \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430 \u0441\u0432\u0435\u0442\u0435 &lt;\u043a\u043e\u043c\u0430\u043d\u0434\u0430=\u0438****\u0439> [\u044d\u043c\u043e\u0446\u0438\u044f=\u0438\u043d\u0442\u0435\u0440\u0435\u0441]\"             emotion = '\u043d\u0435\u0442'             command = '\u043d\u0435\u0442'             # print('R1',reply)             cmd = GetCmd(reply, tip=\"emo\")             emotion = cmd[\"cmd\"]             reply = cmd[\"cut\"]             # print('R2',cmd)             cmd = GetCmd(reply, tip=\"cmd\")             command = cmd[\"cmd\"]             reply = cmd[\"cut\"]             reply = CutSpaces(reply)             result = {                 \"stopped\": stopReason,                 \"reply\": reply,                 \"emotion\": emotion,                 \"command\": command,                 \"tokens\": self.lastTokensUsed}              return result          def __init__(self, nick='obama726', syspath=''):             if syspath != '':                 self.thisfolder = syspath  # os.path.dirname(os.path.realpath(__file__))             print('\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 FredT5 \u043f\u043e \u043f\u0443\u0442\u0438', self.thisfolder)             self.nick = nick      lm = T5()     lm.CheckModel()     loading_flag.set()     print('\u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ' + calcTime(t))     while True:         try:             llm_input = fredCtxQueue.get()             print('[FREDT5 QUEUE] \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c', llm_input)             # answer = lm.chatbot(inp[0], **inp[1])             # llm_input, params, danger_context             answer = lm.chatbot(llm_input[0], llm_input[1], llm_input[2])             fredCtxQueueOutput.put(answer)         except BaseException as err:             print('[LM FRED T5 ERR] \u041e\u0428\u0418\u0411\u041a\u0410 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0410 \u0412\u041e FRED T5: ', err)             print('[LM FRED T5 ERR] \u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())             print(\"\\n[LM FRED T5 ERR] === \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")             time.sleep(1)   if __name__ == \"__main__\":  # DEBUG NOT WORK     print('\u0417\u0410\u041f\u0423\u0421\u041a \u0427\u041e')     manager = multiprocessing.Manager()     t = datetime.datetime.now()     fredCtxQueue = manager.Queue()     fredCtxQueueOutput = manager.Queue()     loading_flag = manager.Event()     repeating_dict = manager.dict()      DOCKER_SENDER_ENABLED = False     if DOCKER_SENDER_ENABLED:         from HyperAI_Docker import DockerSender          # \u0427\u0415\u041a\u041d\u0423\u0422\u042c \u0410\u0423\u0422\u041f\u0423\u0422 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0410 strace -ewrite -p $PID         docker_sender = DockerSender()     else:          LargeFREDProc = multiprocessing.Process(             target=FRED_PROCESS,             args=(loading_flag, fredCtxQueue, fredCtxQueueOutput,                   repeating_dict,))  # Thread(target = a, kwargs={'c':True}).start()         LargeFREDProc.start()         # FRED_PROCESS(fredCtx)     print('\u0417\u0410\u041f\u0423\u0421\u041a \u0427\u041e2')      from LLMExamples import LLMExamples, get_llm_formed_inputs       def FredT5ChatbotQueue(ninp, context, paramsOverride, environment, lmUsername):         if environment.get(\"own_prompt\", False):             llm_input, params, danger_context = ninp, \\                 {\"do_sample\": True,                  \"top_p\": 0.98, \"temperature\": 0.65, \"repetition_penalty\": 1.3, \"min_length\": 10,                  \"max_length\": 150, \"tokens_offset\": 0, \"top_k\": 50,                  \"no_repeat_ngram_size\": 5, \"num_beams\": 3, \"max_time\": 12, }, \\                 \"\u043d\u0443 \u0447\u0435 \u043a\u0430\u043a \u0434\u0435\u043b\u0430\"         else:             llm_input, params, danger_context = get_llm_formed_inputs(inp=ninp, username=lmUsername,                                                                       params_override=paramsOverride,                                                                       environment=environment, dialog_context=context,                                                                       repeating_dict=repeating_dict)         fredCtxQueue.put((llm_input, params, danger_context))         out = fredCtxQueueOutput.get()         return out          # return docker_sender.chatbot(llm_input, params, danger_context)       loading_flag.wait()     # print(e.getResult()+'mda')     print('\u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0422\u0415\u0421\u0422\u0410 ' + calcTime(t))     while True:         inp = input(             \"1-yt,2-mine,3-\u0411\u0415\u0417 \u041f\u0420\u041e\u041c\u041f\u0422\u0410,!-\u043d\u0438\u043a,4-DIALOG mc,5-INSTRUCT mc,6-welcome,\u0431\u0435\u0437-\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435\\n:>\")  # '\u0447\u043e\u0431\u0430\u0431\u043a\u0435>>'         if inp != \"\" or inp != \"ext\":             if inp[0] == \"!\":                 print('ANS',                       FredT5ChatbotQueue(\"\u041a\u0430\u043a \u0434\u0435\u043b\u0430 \u0437\u0448\u0449\u0437\", \"\", None, {\"env\": \"youtube\", \"diags_count\": 0}, inp[1:]))             elif inp[0] == \"1\":                 print('ANS',                       FredT5ChatbotQueue(inp[1:], \"\", None, {\"env\": \"youtube\", \"sentence_type\": \"dialog\"}, \"lexeCho\"))              elif inp[0] == \"2\":                 print('ANS',                       FredT5ChatbotQueue(inp[1:], \"\", None, {\"env\": \"minecraft\", \"sentence_type\": \"dialog\"}, \"lexeCho\"))             elif inp[0] == \"3\":                 print('ANS',                       FredT5ChatbotQueue(inp[1:], \"\", None,                                          {\"env\": \"minecraft\", \"own_prompt\": True, \"sentence_type\": \"dialog\"},                                          \"lexeCho\"))             elif inp[0] == \"4\":                 print('ANS',                       FredT5ChatbotQueue(inp[1:], \"\", {\"model_type\": \"dialog\"},                                          {\"env\": \"minecraft\", \"sentence_type\": \"dialog\"}, \"lexeCho\"))             elif inp[0] == \"5\":                 print('ANS',                       FredT5ChatbotQueue(inp[1:], \"\", {\"model_type\": \"instruct\"},                                          {\"env\": \"minecraft\", \"sentence_type\": \"dialog\"}, \"lexeCho\"))             elif inp[0] == \"6\":                 print('ANS',                       FredT5ChatbotQueue(inp[1:], \"\", {\"model_type\": \"instruct\"},                                          {\"env\": \"broadcast\", \"broadcast_type\": \"stream_ad\"}, \"lexeCho\"))             elif inp[0] == \"7\":                 print('ANS',                       FredT5ChatbotQueue(inp[1:], \"\", {\"model_type\": \"instruct\"},                                          {\"env\": \"broadcast\", \"broadcast_type\": \"status_report\"}, \"lexeCho\"))             else:                 print('ANS',                       FredT5ChatbotQueue(inp, \"\", None, {\"env\": \"youtube\", \"sentence_type\": \"about_system\"}, \"lexeCho\"))<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u041d\u0443 \u0447\u0442\u043e, \u043a\u043e\u0434\u0435\u0440\u044b \u043c\u043e\u0438, \u043d\u0435 \u043d\u0430\u043a\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u043c\u044b \u0435\u0449\u0451? \u0410 \u0432\u0435\u0434\u044c \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u043d\u0430\u043c \u043a \u044d\u0442\u043e\u043c\u0443 \u0435\u0449\u0451 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0432\u044f\u0437\u0430\u0442\u044c \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441 \u043d\u0435\u0439, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u0430\u0439\u043d\u0430 \u0438 \u043d\u0430\u0448\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0443 \u0438 \u044f \u0443\u0436\u0435 \u043d\u0435 \u0433\u043e\u0432\u043e\u0440\u044e \u043e \u0422\u0422\u0421\u043a\u0435 \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0432\u0435\u0449\u0430\u0445!<\/p>\n<details class=\"spoiler\">\n<summary>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0439<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"%D0%91%D0%94\" id=\"\u0411\u0414\"><\/a><\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0448\u0435\u0439 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0432 \u0411\u0414 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b: <strong>\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438<\/strong> \u0438 <strong>\u0434\u0438\u0430\u043b\u043e\u0433\u0438<\/strong>. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0438\u043c\u0435\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e <strong>\u043d\u0438\u043a\u043e\u0432<\/strong>, \u043d\u0443 \u0438 <s>\u0434\u043b\u044f \u043f\u0440\u0438\u043a\u043e\u043b\u0430<\/s> \u0447\u0442\u043e\u0431\u044b \u0411\u0414 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 \u043f\u043e\u0432\u043d\u0443\u0448\u0438\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u0437\u0430\u0447\u0435\u043c-\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u043e\u0434\u043d\u0438\u043c \u0440\u044f\u0434\u043e\u043c \u0434\u043b\u044f \u00ab\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f\u00bb \u0441\u0438\u0441\u0442\u0435\u043c\u044b. \u0421\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0445\u0435\u043c\u0443 \u0441\u0432\u044f\u0437\u0435\u0439 \u044d\u0442\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/304\/fe2\/401\/304fe240195c033080477044fbe1d310.png\" alt=\"ER-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" title=\"ER-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445\" width=\"937\" height=\"644\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/304\/fe2\/401\/304fe240195c033080477044fbe1d310.png\"\/><\/p>\n<div><figcaption>ER-\u0434\u0438\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445<\/figcaption><\/div>\n<\/figure>\n<p>[\u0441\u0430\u0440\u043a\u0430\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0445\u043b\u043e\u043f\u043a\u0438] \u0414\u0430-\u0434\u0430, \u0437\u043d\u0430\u044e, \u043a\u043b\u0430\u0441\u0441\u043d\u043e \u044f \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0445\u0435\u043c\u0443 \u2014 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b \u0411\u0414, 100 \u0440\u0430\u0437 \u0435\u0451 \u043f\u0435\u0440\u0435\u043b\u043e\u043f\u0430\u0442\u0438\u043b, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0438 \u0438\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0432\u044b\u043a\u0430\u0442\u0438\u043b))<\/p>\n<p>\u0418\u0442\u0430\u043a, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u0430 \u0411\u0414, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u043a\u0430\u043a \u043f\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e, \u0442\u0430\u043a \u0438 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/habr.com\/ru\/articles\/255361\/\" rel=\"noopener noreferrer nofollow\">DDL<\/a>. \u041d\u0435 \u0437\u043d\u0430\u044e, \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0430\u0434\u043e, \u043d\u043e \u0432\u043e\u0442, \u0434\u0435\u0440\u0436\u0438\u0442\u0435, DDL sql \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \u0411\u0414 \u0432 sqlite:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 CreateTables.sql (ddl-sql \u0434\u043b\u044f sqlite)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"sql\">CREATE TABLE users (     user_id            INTEGER PRIMARY KEY AUTOINCREMENT                                UNIQUE                                NOT NULL,     name               TEXT,     rank               REAL,     firstreg           TEXT    NOT NULL,     last_interact      TEXT    NOT NULL,     last_answered      TEXT,     diags_count        INTEGER DEFAULT (0)                                 NOT NULL,     last_question_date TEXT,     last_question      TEXT,     real_name          TEXT );   CREATE TABLE users_nicknames (     nick_id      INTEGER PRIMARY KEY AUTOINCREMENT                          NOT NULL,     user_id      NUMERIC REFERENCES users (user_id) ON DELETE CASCADE                          NOT NULL,     nick         TEXT    NOT NULL,     env          TEXT,     server       TEXT,     other_info   TEXT,     added_date   TEXT    NOT NULL,     nick_analyze TEXT,     UNIQUE (         nick,         env     ) );   CREATE TABLE users_dialogs (     diag_id         INTEGER PRIMARY KEY AUTOINCREMENT                             NOT NULL,     user_id         INTEGER REFERENCES users (user_id) ON DELETE CASCADE                             NOT NULL,     diag_nick       TEXT,     content         TEXT    NOT NULL,     role            TEXT    NOT NULL,     date            TEXT    NOT NULL,     command         TEXT,     emotion         TEXT,     env             TEXT,     server          TEXT,     other_info      TEXT,     bind_to_diag_id INTEGER REFERENCES users_dialogs (diag_id) ON DELETE CASCADE,     bind_to_nick_id INTEGER REFERENCES users_nicknames (nick_id) ON DELETE SET NULL,     filter_allowed  INTEGER,     filter_topics   TEXT );   CREATE TABLE mind_variables (     mind_id      INTEGER PRIMARY KEY AUTOINCREMENT                          UNIQUE                          NOT NULL,     mind_name    TEXT,     mood         REAL    NOT NULL                          DEFAULT (0.0),     last_changed TEXT    NOT NULL );  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u0418 \u0434\u0430\u0436\u0435 \u043d\u0430 \u0442\u0430\u043a\u043e\u043c \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u044d\u0442\u0430\u043f\u0435 \u043d\u0430\u0441 \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0434\u0436\u0438\u0434\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u2014 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442! \u0410 sqlite \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043b\u044e\u0431\u0438\u0442 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u043a \u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0412 \u043e\u0431\u0449\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0440\u0443\u0431\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u0430\u0449\u0438\u0442\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b \u043a \u0444\u0438\u0433\u0430\u043c \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043d\u0430\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0435\u0433\u043e \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 \u0431\u0430\u0437\u0435 \u0438 \u0442.\u0434.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 Database.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import random import sqlite3 as sl  sl.threadsafety = 3 from datetime import datetime from typing import Union import traceback import time   def eztime():     return datetime.now().strftime('%Y-%m-%d %H:%M:%S')   def tm(x):     return datetime.strptime(x, '%Y-%m-%d %H:%M:%S')   def clamp(n, smallest, largest):     return max(smallest, min(n, largest))  class HyperAIDatabase:     def __init__(self):         safety_mode = sl.threadsafety  # \u0414\u041e\u041b\u0416\u041d\u041e \u0423\u041a\u0410\u0417\u042b\u0412\u0410\u0422\u042c\u0421\u042f \u041f\u0415\u0420\u0415\u0414 \u0418\u041c\u041f\u041e\u0420\u0422\u041e\u041c!         # print(f'[DB PRE-INIT] default threadsafety {safety_mode}, attempting to change to 3...')         # sl.threadsafety = 3         # https:\/\/docs.python.org\/3\/library\/sl.html         # https:\/\/ricardoanderegg.com\/posts\/python-sqlite-thread-safety\/          if safety_mode == 3:             self.db_connection = sl.connect('HyperAI_DATABASE.db', check_same_thread=False)             print(\"[DB INIT] SUCCESSFULLY CONNECTED TO DATABASE! sl.threadsafety = 3\")         else:             print(                 f\"[DB CANT BE USED!!! RAISING EXCEPTION!!! \u041f\u043e\u0447\u0435\u043c\u0443? \u0414\u0430 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e sl.threadsafety = {str(safety_mode)}\")             raise Exception('**** \u0411\u0410\u0417\u0410 \u0414\u0410\u041d\u041d\u042b\u0425 \u0412 \u0416')          # self.cursor = self.db_connection.cursor()      def save_db_changes(self) -> bool:         fail = True         try_num = 0         while fail and try_num &lt; 10:             try_num += 1             try:                 self.db_connection.commit()                 fail = False                 return True             except BaseException as err:                 print(f'[DB SAVE ERR] \u041e\u0428\u0418\u0411\u041a\u0410 N={str(try_num)} \u041f\u0420\u0418 \u0421\u041e\u0425\u0420\u0410\u041d\u0415\u041d\u0418\u0418 \u0411\u0410\u0417\u042b \u0414\u0410\u041d\u041d\u042b\u0425! ', err, )                 print('\u0422\u0415\u041a\u0421\u0422 \u0421\u041e\u0425\u0420\u0410\u041d\u0415\u041d\u0418\u042f \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                 print(\"\\n=== \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")                 time.sleep(0.1)         return False      def exec(self, cursor, sql):         cursor.execute(sql)         self.save_db_changes()         # cursor.close()      def get_cursor_result(self, cursor: sl.Cursor) -> any:         row = cursor.fetchone()         if row is not None:             if len(row) > 0:                 result = row[0]                 if result is not None:                     return result         return None      def get_cursor_results(self, cursor: sl.Cursor) -> any:         rows = cursor.fetchall()         if rows is not None:             if len(rows) > 0:                 return rows         return None      def get_user_id(self, nick: str, cursor=None) -> int:         ##SELECT ID FROM table_name WHERE City LIKE String         if cursor is None:             cursor = self.db_connection.cursor()         sql = f\"\"\"SELECT user_id FROM users_nicknames WHERE nick = ?\"\"\"          cursor.execute(sql, (nick,))         return self.get_cursor_result(cursor)      def get_db_field(self, field_id: int, field_name: str, table_name: str = \"users\", id_name: str = \"user_id\",                      many: bool = False, cursor: sl.Cursor = None):         if cursor is None:             cursor = self.db_connection.cursor()         result = None         try:             cursor.execute(f\"SELECT {field_name} FROM {table_name} WHERE {id_name} = ?\", (field_id,))             if many:                 result = self.get_cursor_results(cursor)                 if result is not None and len(result) &lt;= 0:                     result = None             else:                 result = self.get_cursor_result(cursor)         except BaseException as err:             print(\"[DB GETTER FIELD ERR] \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043d\u0435\u0442\u0443, \u0435\u0440\u0440:\", err)          return result      def set_db_field(self, field_id: int, field_name: str, field_new_value: any, table_name: str = \"users\",                      id_name: str = \"user_id\", cursor: sl.Cursor = None) -> bool:         if cursor is None:             cursor = self.db_connection.cursor()         success = False         try:             cursor.execute(f\"UPDATE {table_name} SET {field_name} = ? WHERE {id_name} = ?\",                            (field_new_value, field_id,))             if cursor.rowcount >= 1:                 if self.save_db_changes():                     success = True             # cursor.execute(f\"SELECT {field_name} FROM {table_name} WHERE {id_name} = ?\", (field_id,))         except BaseException as err:             print(\"[DB SETTER FIELD ERR] \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043d\u0435\u0442\u0443, \u0435\u0440\u0440:\", err)         return success        def set_mood(self, new_mood: float, mind_id: int = 1) -> bool:         cursor = self.db_connection.cursor()         if self.set_db_field(field_id=int(mind_id), field_name=\"mood\", field_new_value=new_mood,                              table_name=\"mind_variables\", id_name=\"mind_id\", cursor=cursor):             return self.set_db_field(field_id=int(mind_id), field_name=\"last_changed\",                                      field_new_value=eztime(), table_name=\"mind_variables\", id_name=\"mind_id\",                                      cursor=cursor)         return False      def get_mood(self, mind_id: int = 1) -> float:         return self.get_db_field(field_id=int(mind_id), field_name=\"mood\",table_name=\"mind_variables\",id_name=\"mind_id\")      def get_user_rank(self, user_id: int):         return self.get_db_field(field_id=int(user_id), field_name=\"rank\")      def get_user_last_interact_time(self, user_id: int, last_answered=False):         if last_answered:             return self.get_db_field(field_id=int(user_id), field_name=\"last_answered\")         else:             return self.get_db_field(field_id=int(user_id), field_name=\"last_interact\")      def get_user_last_question_date(self, user_id: int):         return self.get_db_field(field_id=int(user_id), field_name=\"last_question_date\")      def set_user_last_question(self, user_id: int, question: str) -> bool:         cursor = self.db_connection.cursor()         return self.set_db_field(field_id=int(user_id), field_name=\"last_question_date\",                                  field_new_value=eztime(), cursor=cursor) and self.set_db_field(field_id=int(user_id),                                                                              field_name=\"last_question\",                                                                              field_new_value=question, cursor=cursor)      def set_user_last_interact_time(self, user_id: int, new_value: str, last_answered=False):         if last_answered:             return self.set_db_field(field_id=int(user_id), field_name=\"last_answered\", field_new_value=new_value)         else:             return self.set_db_field(field_id=int(user_id), field_name=\"last_interact\", field_new_value=new_value)      def set_user_rank(self, user_id: int, new_rank: float):         return self.set_db_field(field_id=int(user_id), field_name=\"rank\", field_new_value=clamp(new_rank, 0.0, 10.0))      def add_to_user_rank(self, user_id: int, amount: float):         rank = self.get_user_rank(user_id)         if rank is not None:             result_rank = clamp((amount + rank), 0.0, 10.0)             if self.set_user_rank(user_id, new_rank=result_rank):                 return result_rank             else:                 return -1         else:             return -1      def check_user_id_exists(self, user_id: int, cursor: sl.Cursor = None):         if cursor is None:             cursor = self.db_connection.cursor()         cursor.execute(\"SELECT COUNT(user_id) FROM users WHERE user_id = ?\", (user_id,))         result = self.get_cursor_result(cursor)         if result:             return True         else:             return False      def get_or_create_user(self, data: dict, return_nick_id_too: bool = False) -> Union[int, dict, None]:         nick = data[\"user\"]         if nick.strip():             user_id = self.get_user_id(nick)             if user_id is None:                 user_id = self.add_new_user(data)             if not return_nick_id_too:                 return user_id             else:                 return {\"user_id\": user_id, \"nick_id\": self.get_user_nick_id(nick, data)}         return None      def get_user_nick_id(self, nick: str, data: dict = None, cursor: sl.Cursor = None) -> int:         if cursor is None:             cursor = self.db_connection.cursor()         if data is not None:             env = data.get(\"env\", None)             server = data.get(\"server\", None)             if server and env:                 cursor.execute(                     \"\"\"SELECT nick_id FROM users_nicknames WHERE nick = (?) AND env = (?) AND server = (?)\"\"\",                     (nick, env, server))             elif env:                 cursor.execute(\"\"\"SELECT nick_id FROM users_nicknames WHERE nick = (?) AND env = (?)\"\"\",                                (nick, env))          else:             cursor.execute(\"\"\"SELECT nick_id FROM users_nicknames WHERE nick = (?)\"\"\", (nick,))         return self.get_cursor_result(cursor)      def set_analyze_for_nick(self, nick_id: int, nick_analyze:str) -> bool:         return self.set_db_field(field_id=int(nick_id),field_name=\"nick_analyze\",field_new_value=nick_analyze,table_name=\"users_nicknames\",id_name=\"nick_id\")     def get_nick_analyze(self, nick_id: int, return_bool: bool):         if return_bool:             return True if self.get_db_field(field_id=int(nick_id),field_name=\"nick_analyze\",table_name=\"users_nicknames\",id_name=\"nick_id\") else False         else:             return self.get_db_field(field_id=int(nick_id), field_name=\"nick_analyze\", table_name=\"users_nicknames\", id_name=\"nick_id\")      def add_nick_to_user(self, user_id: int, data: dict) -> int:         nick = data[\"user\"]         env = data[\"env\"]         server = data.get(\"server\", None)         date = eztime()         cursor = self.db_connection.cursor()         sql = f\"\"\" INSERT OR IGNORE INTO users_nicknames (user_id,nick,env,server,other_info,added_date) VALUES (?,?,?,?,?,?) RETURNING nick_id \"\"\"         cursor.execute(sql, (user_id, nick, env, server, None, date,))          inserted_nick_id = self.get_cursor_result(cursor)         if inserted_nick_id is not None:             self.save_db_changes()             print('[DB ADD NEW NICK TO USER ID(' + str(user_id) + ') INSERTED ' + nick + '. Nick in table ID = (' + str(                 inserted_nick_id) + ')')         return inserted_nick_id      def add_new_user(self, data: dict = None) -> Union[int, None]:         if data == None:             print(\"[DB EXCEPTION] **** \u041d\u0410\u0414\u041e \u041f\u0415\u0420\u0415\u0414\u0410\u0422\u042c \u0414\u0410\u041d\u041d\u042b\u0415 \u0412 \u0411\u0410\u0417\u0423 \u0430 DATA \u043f\u0443\u0441\u0442!\")             return None         cursor = self.db_connection.cursor()         rank = random.choice([3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4.0])          date = eztime()         name = data[\"user\"]         data[\"env\"] = data.get(\"env\", \"minecraft\")         sql = f\"\"\" INSERT INTO users (user_id,name,rank,firstreg,last_interact,diags_count) VALUES (?,?,?,?,?,?) RETURNING user_id f\"\"\"         cursor.execute(sql, (None, name, rank, date, date, 0,))         inserted_id = self.get_cursor_result(cursor)         if inserted_id is not None:             self.save_db_changes()             print('[DB ADD NEW USER] INSERTED ' + name + ' AT ID ' + str(inserted_id) + ' DEBUG TYPE ' + str(                 type(inserted_id)))             self.add_nick_to_user(user_id=inserted_id, data=data)  # +\u043d\u0438\u043a \u043a \u044e\u0437\u0435\u0440\u0443              if data.get(\"env\", \"\") == \"discord\":  # +\u0434\u0438\u0441\u043a\u043e\u0440\u0434 \u0438\u0434 \u043a \u044e\u0437\u0435\u0440\u0443                 discord_user_id = data.get(\"discord_id\", None)                 if discord_user_id:                     discord_data = dict(data)                     discord_data[\"env\"] = \"discord_id\"                     discord_data[\"user\"] = discord_user_id                     self.add_nick_to_user(user_id=inserted_id, data=discord_data)                     print(f'[DB ADD DISCORD NICK] \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u043d\u0438\u043a\u0430 {str(name)} discord_id \u0432 \u0434\u0438\u0441\u043a\u043e\u0440\u0434\u0435')             elif data.get(\"env\", \"\") == \"youtube\":  # +\u044e\u0442\u0443\u0431 \u0438\u0434 \u043a \u044e\u0437\u0435\u0440\u0443                 youtube_user_id = data.get(\"youtube_user_channel_id\", None)                 if youtube_user_id:                     youtube_data = dict(data)                     youtube_data[\"env\"] = \"youtube_user_channel_id\"                     youtube_data[\"user\"] = youtube_user_id                     self.add_nick_to_user(user_id=inserted_id, data=youtube_data)                     print('[DB ADD YT] \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d ID \u0432 YT')             elif data.get(\"env\", \"\") == \"trovo\":  # +trovo \u0438\u0434 \u043a \u044e\u0437\u0435\u0440\u0443                 trovo_user_id = data.get(\"trovo_user_channel_id\", None)                 if trovo_user_id:                     trovo_data = dict(data)                     trovo_data[\"env\"] = \"trovo_user_channel_id\"                     trovo_data[\"user\"] = str(trovo_user_id)                     self.add_nick_to_user(user_id=inserted_id, data=trovo_data)                     print('[DB ADD TROVO] \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d ID TROVO')              return inserted_id         return None      def add_diags(self, user_id: int, diag_to_add: list[dict], data: dict = None) -> list[int]:         # log = {\"user\":user, \"role\": role, \"content\": content, \"date\":eztime(), \"emotion\":emotion, \"command\":command}         cursor = self.db_connection.cursor()         diag_ids = []         date = eztime()         if data is None:             env = None             server = None             other_info = None             bind_to_nick_id = None             diag_nick = None         else:             def get_other_info_from_env(d):                 result = \"\"                 sentence_type = d.get(\"sentence_type\", \"\")                 if sentence_type != \"\":                     result += \"sentence_type=\" + sentence_type                  return result if result else None              diag_nick = data.get(\"user\", None)             env = data.get(\"env\", None)             server = data.get(\"server\", None)              other_info = get_other_info_from_env(data)  # TODO             bind_to_nick_id = None  # data.get(\"user_id\", None)         if bind_to_nick_id == None and diag_nick:             if diag_nick.strip() != \"\":                 bind_to_nick_id = self.get_user_nick_id(nick=diag_nick, data=data, cursor=cursor)         last_user_diag_id = None         last_interact_time = None  # get last interact         for i, record in enumerate(diag_to_add):              filter_allowed = record.get(\"filter_allowed\", None)             if filter_allowed is not None:                 filter_allowed = int(filter_allowed)             filter_topics = record.get(\"filter_topics\", None)             if not filter_topics:                 filter_topics = None              diag_nick = record.get(\"user\", diag_nick)             role = record[\"role\"]             bind_to_diag_id = None             date_rec = record.get(\"date\", None)             if role == \"assistant\" and last_user_diag_id is not None:                 if date_rec is not None:                     last_interact_time = date_rec                 bind_to_diag_id = last_user_diag_id             if date_rec is None:                 date_rec = date             sql = f\"\"\" INSERT INTO users_dialogs (user_id,diag_nick,content,role,date,command,emotion,env,server,other_info,bind_to_diag_id,bind_to_nick_id,filter_allowed,filter_topics) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?) RETURNING diag_id f\"\"\"             cursor.execute(sql, (user_id, diag_nick, record[\"content\"], role, date_rec,                                  # (user_id,diag_nick,content,          role,  date,                                  record.get(\"command\", None), record.get(\"emotion\", None),                                  # command,                   emotion,                                  env, server, other_info, bind_to_diag_id, bind_to_nick_id,                                  filter_allowed, filter_topics,                                  ))             # env,server,other_info,bind_to_diag_id,bind_to_nick_id)             inserted_diag_id = self.get_cursor_result(cursor)             if inserted_diag_id is not None:                 diag_ids.append(inserted_diag_id)                 if role == \"user\":                     last_user_diag_id = inserted_diag_id                  # INCREMENT DIAGS COUNT VALUE                 if bind_to_diag_id is not None:                     cursor.execute('UPDATE users SET diags_count = diags_count + 1 WHERE user_id = ?', (user_id,))         if len(diag_ids) > 0:             if last_interact_time:                 cursor.execute('UPDATE users SET last_answered = ? WHERE user_id = ?', (last_interact_time, user_id,))             if self.save_db_changes():                 return diag_ids         return []      def get_user_diags(self, user_id: Union[int, None], count: int = 1):         # SELECT * FROM l LIMIT 100         cursor = self.db_connection.cursor()         user_id_compar = \"\"         if user_id is not None:             user_id_compar = f\"user_id = {str(user_id)} AND \"         sql = f\"\"\" SELECT * FROM ( SELECT diag_id,diag_nick,content,role,date,command,emotion,env FROM users_dialogs WHERE diag_id IN     (SELECT bind_to_diag_id FROM users_dialogs WHERE {user_id_compar}bind_to_diag_id IS NOT NULL AND role = 'assistant') UNION     SELECT diag_id,diag_nick,content,role,date,command,emotion,env FROM users_dialogs WHERE {user_id_compar}bind_to_diag_id IS NOT NULL AND role = 'assistant' ORDER BY diag_id DESC LIMIT {str(count * 2)} ) ORDER BY diag_id ASC \"\"\"         # cursor.execute(sql,(user_id,user_id,count*2,))         cursor.execute(sql)         result_diags = self.get_cursor_results(cursor)         diags = []         if result_diags is not None:             for d in result_diags:                 # 0 diag_id,1 diag_nick,2 content,3 role,4 date,5 command,6 emotion,7 env                 # {\"user\":d[1],\"role\":d[3],\"content\":d[2],\"date\":d[4],\"command\":d[5],\"emotion\":d[6],\"env\":d[7]}                 diag_dict = {}                 field_ids = {\"user\": 1, \"role\": 3, \"content\": 2, \"date\": 4, \"command\": 5, \"emotion\": 6, \"env\": 7}                 for field, value in field_ids.items():                     if d[value]:                         diag_dict[field] = d[value]                 diags.append(diag_dict)         return diags      def get_user_diag_count(self, user_id: int, real=True, cursor: sl.Cursor = None):         if cursor is None:             cursor = self.db_connection.cursor()         if real:             if self.check_user_id_exists(user_id):                 cursor.execute(\"SELECT COUNT(diag_id) FROM users_dialogs WHERE user_id = ? AND role = 'assistant'\",                                (user_id,))             else:                 return None         else:             cursor.execute(\"SELECT diags_count FROM users WHERE user_id = ?\", (user_id,))         return self.get_cursor_result(cursor)      def get_last_any_diag_time(self, cursor: sl.Cursor = None):         if cursor is None:             cursor = self.db_connection.cursor()         cursor.execute(\"\"\"SELECT * FROM ( SELECT date,diag_id FROM users_dialogs WHERE bind_to_diag_id IS NOT NULL AND role = 'assistant' ORDER BY diag_id DESC LIMIT 1 )\"\"\")         return self.get_cursor_result(cursor)      def get_relevant_diag(self, user_id: Union[int, None] = None, count: int = 1, exact_user_timeout: float = 160.0,                           any_user_timeout: float = 250.0) -> list[dict]:         now = datetime.now()         if user_id is not None:             last_answered = self.get_db_field(field_id=user_id, field_name=\"last_answered\")             if last_answered:                 try:                     if (now - tm(last_answered)).total_seconds() > exact_user_timeout:                         user_id = None                 except BaseException as err:                     print(f'[DB Get Time EXACT relevant user_id={str(user_id)} diag ERR] err =', err)                     user_id = None             else:                 user_id = None         diags = []         if user_id is None:             last_answered = self.get_last_any_diag_time()             if last_answered:                 try:                     if (now - tm(last_answered)).total_seconds() &lt;= any_user_timeout:                         print('[DB get ANY RELEVANT DIAG] time succed, searching for ANY diag..')                         diags = self.get_user_diags(user_id=None, count=count)                 except BaseException as err:                     print('[DB Get Time ANY relevant diag ERR] err =', err)         else:             print(f'[DB get EXACT user_id={str(user_id)} RELEVANT] time succed, searching for EXACT diag..')             diags = self.get_user_diags(user_id=user_id, count=count)         return diags      def connection_close(self):         self.db_connection.close()   if __name__ == \"__main__\": #debugging     db = HyperAIDatabase()     # db.add_nick_to_user(4, {\"user\": \"LexaLepexa\", \"env\": \"youtube\"})     # debugChatEntry = {\"user\": \"LexaLepaxa2324\", \"env\": \"minecraft\", \"server\": \"mc.musteryworld.me\", \"date\": eztime()}     # id = db.get_or_create_user(debugChatEntry)     ## id = db.get_user_id(\"NetTyan\")     # print(\"id = \" + str(id), type(id))     # curs = db.db_connection.cursor()     # curs.execute(\"SELECT * FROM users_nicknames WHERE nick LIKE ?\", (\"LexaLepexa\",))      # print('lol', db.get_cursor_results(curs), 'lol')     debug_dialog = [         {\"user\": \"LexaLepexa\", \"role\": \"user\", \"content\": \"2\u041f\u0440\u0438\u0432\u0435\u0442! \u041a\u0430\u043a \u0434\u0435\u043b\u0430?\", \"date\": \"2023-06-30 20:22:59\",          \"emotion\": \"\", \"command\": \"\"},         {\"user\": \"default\", \"role\": \"assistant\", \"content\": \"3\u041f\u043e\u043a\u0430! \u0422\u044b \u0441\u043a\u0443\u0447\u043d\u044b\u0439!\", \"date\": \"2023-06-30 20:23:00\",          \"emotion\": \"\u0430\u0433\u0440\u0435\u0441\u0441\u0438\u044f\", \"command\": \"\u0431\u0430\u043d\"},         {\"user\": \"LexaLepexa\", \"role\": \"user\", \"content\": \"4\u042d\u042d\u044d\u044d\u044d\", \"date\": \"2023-06-30 20:24:59\",          \"emotion\": \"\", \"command\": \"\"},         {\"user\": \"default\", \"role\": \"assistant\", \"content\": \"5\u041d\u0435 \u044d\u044d\u044d\u043a\u0430\u0439 \u043d\u0438\u0449\u0449\u0449\", \"date\": \"2023-06-30 20:25:00\",          \"emotion\": \"\u0430\u0433\u0440\u0435\u0441\u0441\u0438\u044f\", \"command\": \"\u0431\u0430\u043d\"},     ]     # db.add_diags(user_id=db.get_user_id(\"LexaLepexa\"),diag_to_add=debug_dialog)     # print(db.get_user_nick_id(\"LexaLepexa\",{\"env\":\"youtube\"}))     # print(db.get_user_diag_count(user_id=db.get_user_id(\"Net Tyan\"),real=True))#db.get_user_diags(user_id=None, count=1))     # print(db.set_db_field(field_id=4,field_new_value=None,field_name=\"other_info\", table_name=\"users_nicknames\", id_name=\"user_id\"))     # print(db.get_last_any_diag_time())     # print(db.get_relevant_diag(user_id=db.get_user_id(\"LexaLepexa\"),count=1,exact_user_timeout=1000000.0,any_user_timeout=10000000.0))     #print(db.add_to_user_rank(user_id=7, amount=-3.2))     print(db.set_mood(-5))     print(db.get_mood())      db.connection_close()     # print('Debug mode actived')     # db = sl.connect('HyperAI_DATABASE.db')     # cursor = db.cursor()     # db_add_new_user()     ##db_init(db, cursor)     # db.close() <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u0418\u00a0\u2014 \u0432\u0443\u0430\u043b\u044f! \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u0442\u044f\u043d \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f! \u0425\u043e\u0442\u0435\u043b \u0431\u044b \u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c. \u041d\u043e \u043d\u0435\u0442.<\/p>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0432\u0441\u0451 \u0435\u0449\u0451 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0442\u0430 \u0441\u0430\u043c\u0430\u044f \u0442\u0435\u0440\u043d\u0438\u0441\u0442\u0430\u044f \u043f\u0440\u0435\u0433\u0440\u0430\u0434\u0430 \u2014 \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u0432\u0437\u044f\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u043e\u0442\u043e\u043c \u0438\u0437 \u0438\u0433\u0440\u044b \u043a \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443, \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0433\u0440\u0443<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0435\u0440\u0435\u0434 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430 Docker. \u0414\u043b\u044f \u043d\u0435\u0433\u043e \u0436\u0435 \u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c SyncManager.<\/p>\n<p><a class=\"anchor\" name=\"Docker_reciever\" id=\"Docker_reciever\"><\/a><\/p>\n<p>\u041e\u0431\u0440\u0430\u0437 Docker \u044f \u0442\u0430\u043a\u0436\u0435 \u0434\u0430\u043b\u0435\u0435 (\u0432 \u0441\u0442\u0430\u0442\u044c\u0435) \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0442\u043e\u043f\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0447\u0438 Nvidia NEMO, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0445 \u043a\u043e\u0434\u0430 \u043d\u0438\u0436\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u043a\u0438\u0445 NemoSpeechTranscriber \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u044b \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0447\u0438, \u0438 \u0438\u0445 \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u0448\u0435.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 docker_reciever.py (Docker-\u0447\u0430\u0441\u0442\u044c)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from multiprocessing import Process import time from datetime import datetime   class bcolors:     HEADER = '\\033[95m'     OKBLUE = '\\033[94m'     OKCYAN = '\\033[96m'     OKGREEN = '\\033[92m'     WARNING = '\\033[93m'     FAIL = '\\033[91m'     ENDC = '\\033[0m'     BOLD = '\\033[1m'     UNDERLINE = '\\033[4m'   def calcTime(time):     return bcolors.OKGREEN + str((datetime.now() - time).total_seconds()) + bcolors.ENDC   import multiprocessing from multiprocessing.managers import SyncManager   class MyManager(SyncManager):     pass   # control dict syncdict = {}  # llm llm_inputQueue = multiprocessing.Queue() llm_outputQueue = multiprocessing.Queue() llm_loading_flag = multiprocessing.Event()  # sttCtx = multiprocessing.N  def get_llm_loading_flag():     return llm_loading_flag  def get_llm_input_q():     return llm_inputQueue   def get_llm_output_q():     return llm_outputQueue   # tts tts_inputQueue = multiprocessing.Queue() tts_outputQueue = multiprocessing.Queue()   def get_tts_input_q():     return tts_inputQueue   def get_tts_output_q():     return tts_outputQueue   def get_dict():     return syncdict   def nemo_tts_process(manager):     debug_iter = 0     from STT.stream_stt_inf import NemoSpeechTranscriber     transcriber = NemoSpeechTranscriber()     transcriber.check_initialization()     while True:         inp = manager.tts_input_q().get()         print(\"INPUT GOT!\", debug_iter)  # ,inp,debug_iter)         debug_iter += 1         # inp = inp+\" \"+str(debug_iter)         output = transcriber.audio_transcribe(audio_samples=inp[\"bytes_io\"], audio_settings=inp[\"audio_settings\"])         print(\"PROCESSING READY, SENDING OUT! \", inp)         manager.tts_output_q().put(output)         # print('waiting for action, syncdict %s' % (syncdict))         # time.sleep(5) def llm_process(manager):     from LLM.FredT5 import FRED_PROCESS     FRED_PROCESS(manager.llm_loading_flag(), manager.llm_input_q(), manager.llm_output_q())  if __name__ == \"__main__\":      MyManager.register(\"syncdict\", get_dict)     MyManager.register(\"tts_input_q\", get_tts_input_q)     MyManager.register(\"tts_output_q\", get_tts_output_q)      MyManager.register(\"llm_input_q\", get_llm_input_q)     MyManager.register(\"llm_output_q\", get_llm_output_q)     MyManager.register(\"llm_loading_flag\",get_llm_loading_flag)      manager = MyManager((\"0.0.0.0\", 6006), authkey=b\"ktejrlktjrewlku423gdfgn\")      print(\"Started listener manager 0.0.0.0 : 6006\")     manager.start()     STT_Process = Process(         target=nemo_tts_process,         args=(manager,))  # Thread(target = a, kwargs={'c':True}).start()     STT_Process.start()     LLM_Process = Process(         target=llm_process,         args=(manager,))     LLM_Process.start()     print('Wait for loading LLM... (LLM!)')     manager.llm_loading_flag().wait()     print('WAITING COMPLETED! LLM!')     while True:         time.sleep(1)         if manager.syncdict().get(\"stop\", False) == True:             print('TERMINATING DOCKER RECIEVER')             break         # ii = input(\"\u0447\u043e\u043d\u0430\u0434\u043e\")         # if ii==\"\":         #    print('TERMINATING DOCKER RECIEVER')         #    break     # transcriber.audio_transcribe(audio_file=\"test2vloger.wav\")      # raw_input(\"Press any key to kill server\".center(50, \"-\"))     STT_Process.terminate()     STT_Process.join()     LLM_Process.terminate()     LLM_Process.join()     manager.shutdown() <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 docker_sender.py (\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import os # pip install docker import subprocess, shlex from multiprocessing.managers import SyncManager import time, datetime  class MyManager(SyncManager):     pass  MyManager.register(\"syncdict\")  MyManager.register(\"tts_input_q\") MyManager.register(\"tts_output_q\")  MyManager.register(\"llm_input_q\") MyManager.register(\"llm_output_q\")  MyManager.register(\"llm_loading_flag\")  def get_or_run_docker_container():     import docker     client = docker.from_env()     container_name = \"nemo_stt\"     container_image = \"nvcr.io\/nvidia\/nemo:23.04\"     container = None     for l in client.containers.list(all=True):         if l.name == container_name:             container = l     if container is not None:         if container.status == \"running\":             print('[DOCKER] container', container_name, \"running!\")         else:  # if container.status == \"exited\":             container.start()             print('[DOCKER] container starting..')             time.sleep(5)     else:         thisfolder = os.path.dirname(os.path.realpath(__file__)).replace('\\\\', '\/')         docker_image_work_dir = \"\/workspace\/nemo\/\"         print('[DOCKER] container NON EXIST! Create and start.....')         # \u0421\u0415\u0419\u0427\u0410\u0421 \u041e\u0422\u041a\u041b\u042e\u0427\u0415\u041d\u042b GPU! \u0427\u0422\u041e\u0411\u042b \u0412\u041a\u041b\u042e\u0427\u0418\u0422\u042c \u0414\u041e\u0411\u0410\u0412\u0418\u0422\u042c \u0422\u0415\u0413  --gpus all         mountControlDir = f\"-v {thisfolder}\/zHyperAI_Docker\/docker_reciever.py:{docker_image_work_dir}docker_reciever.py\" +\\                           f\" -v {thisfolder}\/zHyperAI_Docker\/other:{docker_image_work_dir}other\"          mountSTTDir = f\"-v {thisfolder}\/zHyperAI_Models\/STT\/docker_to_send:{docker_image_work_dir}STT\/\"         mountTTSDir = f\"-v {thisfolder}\/zHyperAI_Models\/TTS:{docker_image_work_dir}TTS\/\"         mountLLMDir = f\"-v {thisfolder}\/zHyperAI_Models\/LLM:{docker_image_work_dir}LLM\/\"         mountFiltersDir = f\"-v {thisfolder}\/zHyperAI_Models\/Filters:{docker_image_work_dir}Filters\/\"         create_command = f\"docker run {mountSTTDir} {mountLLMDir} {mountFiltersDir} {mountTTSDir} {mountControlDir} --gpus all --shm-size=8g -p 8888:8888 -p 6006:6006 -p 6523:6523 -i --ulimit memlock=-1 --ulimit stack=67108864 -d=true --name {container_name} {container_image} \/bin\/sh\"         # \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c -it, \u043d\u043e \u0438\u0437-\u0437\u0430 \u043a\u0430\u0441\u0442\u0440\u0430\u0446\u0438\u0438..         # https:\/\/stackoverflow.com\/questions\/43099116\/error-the-input-device-is-not-a-tty         print('[DOCKER SENDER] EXECUTION',create_command)         subprocess.run(shlex.split(create_command), shell=True)         # print('Create command output =',subprocess.getoutput(create_command))         # p = subprocess.Popen(shlex.split(create_command), shell=True)         # os.system()         # time.sleep(5)         # print('trying echo')         # p.communicate(\"echo 1\")         time.sleep(2.5)         print('Container CREATED! (probably) wait 3 sec')         container = client.containers.get(container_name)         time.sleep(3)         # client.containers.run(container_name,detach=True,         #                      ports={'8888\/tcp': 8888,         #                             '6006\/tcp': 6006,         #                             '6523\/tcp': 6523,},         #                      volumes=[f'{thisfolder}\/docker_to_send:\/workspace\/nemo\/']         # )         # os.system(\"docker \")     return container, container_name      def check_reciever_process_started(container_name):     linux_cmd = \"\"\"sh \/other\/reciever_proc_check.sh docker_reciever.py\"\"\"     windows_cmd = f\"docker exec {container_name}\"     # p = subprocess.Popen([windows_cmd+\" \"+linux_cmd], stderr=subprocess.PIPE)     # result = p.stdout.read()     result = subprocess.getoutput(windows_cmd + \" \" + linux_cmd)     print('[DOCKER DEBUG RECIEVER CHECK] RESULT SUBPROCESS =', result, '!')     if result.find(\"Running\") != -1:         return True     elif result.find(\"Stopped\") != -1:         return False     else:         print('RESULT SUBPROCESS =', result, '!')         return False     # https:\/\/stackoverflow.com\/questions\/18739239\/python-how-to-get-stdout-after-running-os-system   #print('Starting docker sender...')   # client.containers.get(container_name) def check_docker_app():     # docker run -v F:\/Onix\/Downloads\/minebot\/1HyperAI\/zHyperAI_Models\/STT\/docker_to_send:\/workspace\/nemo\/ --shm-size=8g -p 8888:8888 -p 6006:6006 -p 6523:6523 --gpus all -it --ulimit memlock=-1 --ulimit stack=67108864 --name nemo_stt nvcr.io\/nvidia\/nemo:23.04 \/bin\/sh     container, container_name = get_or_run_docker_container()     if not check_reciever_process_started(container_name):         time.sleep(0.5)         container.exec_run(\"python docker_reciever.py\", detach=True)         print('STARTED DOCKER RECIEVER! Waiting 15 secs for it initialize')         time.sleep(15)  def file_to_bytes_io(filename):     import io     fileOpen = open(filename, 'rb+')     filee = fileOpen.read()     samples_file = io.BytesIO(filee)     fileOpen.close()     return samples_file  def kill_docker_reciever():  # \u0435\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0430\u0434\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a     import docker     client = docker.from_env()     container = client.containers.get(\"nemo_stt\")     time.sleep(0.2)     print(\"\u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 docker_reciever.py\")     container.exec_run(\"pkill -f docker_reciever.py\", privileged=True, detach=True, stream=True)     time.sleep(0.2)     exit() class DockerSender():     def __init__(self):         self.manager = None         self.initialized = False         self.check_connection()     def check_connection(self, force=False):         if not self.initialized or force:             try:                 print('[DOCKER SENDER INIT] Starting SENDER manager...')                 self.manager = MyManager(('localhost', 6006), authkey=b'ktejrlktjrewlku423gdfgn')                 self.manager.connect()                 self.initialized = True                 print('[DOCKER SENDER INIT] SUCCESSFULL CONNECTED!')             except BaseException as err:                 print('[DOCKER STT SENDER] \u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438:',err,'\u0437\u0430\u043f\u0443\u0441\u043a \u0447\u0435\u043a\u0435\u0440\u0430')                 check_docker_app()     def stop_docker_reciever(self):         if self.initialized:             self.manager.syncdict()[\"stop\"] = True     def llm_loading_flag(self):         if self.initialized:             return self.manager.llm_loading_flag()         else:             self.check_connection()             return self.manager.llm_loading_flag()     def chatbot(self, llm_input, params, danger_context):#ninp,context,paramsOverride,environment,lmUsername):         self.check_connection()         try:             #keywords = {\"context\": context, \"paramsOverride\": paramsOverride, \"environment\": environment,             #            \"lmUsername\": lmUsername}             #self.manager.llm_input_q().put((ninp,keywords))             self.manager.llm_input_q().put((llm_input, params, danger_context))             out = self.manager.llm_output_q().get()             return out         except BaseException as err:             print('[DOCKER TTS SEND] \u041e\u0448\u0438\u0431\u043a\u0430',err,' \u041f\u0415\u0420\u0415\u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u0415!')             self.check_connection(force=True)     def transcribe(self, audio_bytes_io, audio_settings=None):         self.check_connection()         try:             if audio_settings is None:                 audio_settings = {\"sr\": 48000, \"channels\": 2}             self.manager.tts_input_q().put({\"bytes_io\":audio_bytes_io,\"audio_settings\":audio_settings})             out = self.manager.tts_output_q().get()             return out         except BaseException as err:             print('[DOCKER TTS SEND] \u041e\u0448\u0438\u0431\u043a\u0430',err,' \u041f\u0415\u0420\u0415\u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u0415!')             self.check_connection(force=True)   def TranscribeTest(docker_sender):     inp = file_to_bytes_io(\"baya synth.wav\")     audio_settings = {\"sr\":48000,\"channels\":1}     print('sended input')  # ,inp)     result = docker_sender.transcribe(audio_bytes_io=inp,audio_settings=audio_settings)     print('got output =',result)   def LLMTest(docker_sender):     print('sended input LLM')  # #ninp,context,paramsOverride,environment,lmUsername     result = docker_sender.chatbot(\"\u041a\u0430\u043a \u0434\u0435\u043b\u0430 \u0437\u0448\u0449\u0437\", \"\", None, {\"env\": \"yt\", \"diags_count\":0}, \"ChoLexe\")     print('got LLM output =',result)   if __name__ == \"__main__\":     # \u0422\u041e\u041b\u042c\u041a\u041e \u0414\u041b\u042f \u0414\u0415\u0411\u0410\u0416\u0418\u041d\u0413\u0410!!!     def debugFunc():         print('DEBUG FUNC! DEACTIVATED FUNCTIONALITY')         pass #do stuff         get_or_run_docker_container()         print('EXITING..')         exit()     #debugFunc()     #kill_docker_reciever()         docker_sender = DockerSender()     from multiprocessing import Process      #Process(target=lambda a: print(\"Hello, {}\".format(a)), args=([\"world\"])).start()      Process(target=LLMTest, args=(docker_sender,)).start()     Process(target=TranscribeTest, args=(docker_sender,)).start()     Process(target=LLMTest, args=(docker_sender,)).start()     Process(target=TranscribeTest, args=(docker_sender,)).start()     Process(target=TranscribeTest, args=(docker_sender,)).start()     Process(target=LLMTest, args=(docker_sender,)).start()     Process(target=LLMTest, args=(docker_sender,)).start()      print('ALL PROCESSES STARTED')     time.sleep(15)     print('TERMINATING!')     exit()     #proc1.join()      #a = input(\"poka\")<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430\u00a0\u0432\u0441\u044f \u00ab\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u00bb \u0433\u043e\u0442\u043e\u0432\u0430, \u0432\u043d\u043e\u0441\u0438\u043c \u0441\u0432\u044f\u0437\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 main.py\/FredT5Chatbot<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from LLMExamples import LLMExamples, get_llm_formed_inputs def FredT5ChatbotQueue(ninp, context, paramsOverride, environment, lmUsername):    llm_input, params, danger_context = get_llm_formed_inputs(inp=ninp, username=lmUsername,                                                             params_override=paramsOverride,                                                             environment=environment, dialog_context=context,                                                             repeating_dict=repeating_dict)    return docker_sender.chatbot(llm_input, params, danger_context)   # keywords = {\"context\": context, \"paramsOverride\": paramsOverride, \"environment\": environment, \"lmUsername\": lmUsername}   # return docker_sender.chatbot((ninp,keywords))   # FredInputQueue.put((ninp,keywords))   # return FredOutputQueue.get() def FredT5Chatbot(inp, authorisedUser=\"default\", paramsOverride=None, environment_data=None):   global LogChat   printPref = \"FREDT5>\"   if inp:       startTime = datetime.now()        isEvent = False       old_mood = ctx.mood       if environment_data:           authorisedUser = environment_data.get(\"user\",                                                 authorisedUser)  # DB_getUserYTName(authorisedUser, pref='')           returnOut = environment_data           if environment_data.get(\"env\", \"\") == \"minecraft\":               pass           elif environment_data.get(\"env\", \"\") == \"minecraft_event\":               isEvent = True       else:           environment_data = {\"env\": \"youtube\", \"user\": authorisedUser, \"user_id\": 5}            returnOut = {}        # prompt = []       # prompt.extend(DB_GetContext(authorisedUser, fredFormat=True))#DB_GetUserDiags(authorisedUser))       if (authorisedUser.strip() == \"\"):           authorisedUser = \"default\"        db_user_id = environment_data.get(\"user_id\", 5)       db_nick_id = environment_data.get(\"nick_id\", None)       # if(authorisedUser!=\"default\"):       #    usr = authorisedUser.replace('_MC_REG','')       if not isEvent:           diags_cnt = DATABASE.get_user_diag_count(user_id=db_user_id, real=True)           choo = (True, True, True, False,)            if db_nick_id and DATABASE.get_nick_analyze(db_nick_id, return_bool=True):               print('[DEBUG NEW CHATBOT]debug nick analyze True, nick_id =', db_nick_id)               choo = (True, False, False, False,)            environment_data[\"diags_count\"] = diags_cnt           if (diags_cnt == 0 and random.choice(choo)) \\                   or \"\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0439 \u043d\u0438\u043a\" in inp:               environment_data[\"do_nick_analyze\"] = True        rankChange = 0       mood_modifer_filter = 0       filter_allowed = environment_data.get(\"filter_allowed\", None)       bad_topics = \"\"       if filter_allowed is not None:           filter_topics = environment_data.get(\"filter_topics\", [])           filter_score = environment_data.get(\"filter_score\", 0)           rankChange += filter_score \/ 3           rankChange += (int(filter_allowed) - 1) \/ 3           environment_data[\"user_rank\"] = DATABASE.add_to_user_rank(user_id=db_user_id,                                                                     amount=rankChange)  # environment_data.get(\"user_rank\",0)#DB_setUserRank(authorisedUser, rankChange)           # modifyMood(rankChange \/ 2)           mood_modifer_filter += (rankChange \/ 2)           environment_data[\"filter_allow\"] = filter_allowed            if len(filter_topics) > 0:               topicsTranslatorMas = {\"politics\": \"\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430\u043d\", \"racism\": \"\u0440\u0430\u0441\u0438\u0441\u0442\", \"religion\": \"\u0440\u0435\u043b\u0438\u0433\u043e\u0432\u0435\u0434\",                                      \"terrorism\": \"\u0442\u0435\u0440\u0440\u043e\u0440\u0438\u0441\u0442\", \"suicide\": \"\u0441\u0430\u043c\u043e\u0443\u0431\u0438\u0439\u0446\u0430\",                                      \"offline_crime\": \"\u0443\u0431\u0438\u0439\u0446\u0430\", \"drugs\": \"\u043d\u0430\u0440\u043a\u043e\u043c\u0430\u043d\",                                      \"social_injustice\": \"\u043d\u044b\u0442\u0438\u043a\",                                      \"pornography\": \"\u043f\u043e\u0448\u043b\u044f\u043a\", \"prostitution\": \"\u0441\u0443\u0442\u0435\u043d\u0451\u0440\", \"sexism\": \"\u0441\u0435\u043a\u0441\u0438\u0441\u0442\",                                      \"sexual_minorities\": \"\u0438\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0435\u0446\",                                      \"online_crime\": \"\u0441\u043a\u0430\u043c\u0435\u0440\", \"weapons\": \"\u0441\u0442\u0440\u0435\u043b\u044f\u043a\u0430\",                                      \"body_shaming\": \"\u0436\u0438\u0440\u0434\u044f\u0439\", \"health_shaming\": \"\u0438\u043d\u0432\u0430\u043b\u0438\u0434\u044b\u0447\",                                      \"slavery\": \"\u0440\u0430\u0431\u044b\u043d\u044f\", \"gambling\": \"\u0430\u0437\u0430\u0440\u0442\u043d\u0438\u043a\"}                for topic in filter_topics:                   add = topicsTranslatorMas.get(topic, \"\u043d\u044b\u0442\u0438\u043a\")                   bad_topics += ' ' + add                   if add == \"\u043d\u044b\u0442\u0438\u043a\":                       print('[FREDT5 MAIN THREAD] [!!!!!!! DEBUG] \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0442\u043e\u043f\u0438\u043a', topic, '\u0432\u0435\u0440\u043d\u0443\u0442\u043e \u043d\u044b\u0442\u0438\u043a')            print('FREDT5 DEBUG >>rankDebug>> filtScore', filter_score, 'allow',                 int(filter_allowed),                 'rankChange', rankChange, 'newRank', environment_data[\"user_rank\"])        source_filter_topics = environment_data.get(\"filter_topics\", [])       source_filter_topics_str = ' '.join(source_filter_topics)       environment_data[\"filter_topics\"] = bad_topics       if environment_data.get(\"user_rank\", None) is None:           environment_data[\"user_rank\"] = DATABASE.get_user_rank(user_id=db_user_id)       oldrank = environment_data.get(\"user_rank\", 0)       context = DATABASE.get_relevant_diag(user_id=db_user_id, count=2, exact_user_timeout=160.0,                                            any_user_timeout=280.0)        try:           stream_data = obs_ka.get_stream_status()       except BaseException as err:           print('ERR OBS READING STREAM DATA (GETTING STREAM STATUS) in chat answerer, err:', err)           stream_data = {\"outputActive\": False}           print('traceback:', traceback.format_exc())       environment_data[\"stream_data\"] = {\"started\": stream_data[\"outputActive\"],                                          \"duration\": stream_data.get(\"outputDuration\", -1)}       answer = FredT5ChatbotQueue(ninp=inp, context=context, paramsOverride=paramsOverride,                                   environment=environment_data, lmUsername=authorisedUser)       # print(printPref,'\u043e\u0442\u0432\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d, ')       repeat = False       for record in context:           if answer[\"stopped\"] == \"repeat\" or isSimilar(answer[\"reply\"], record.get(\"msg\", \"\")):               repeat = True               break       if repeat:           print('\u041f\u041e\u0412\u0422\u041e\u0420\u0415\u041d\u0418\u0415! \u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430')           answer = FredT5ChatbotQueue(ninp=inp, context=None, paramsOverride=paramsOverride,                                       environment=environment_data, lmUsername=authorisedUser)       usage_tokens = answer[\"tokens\"]       emotion = answer[\"emotion\"]       command = answer[\"command\"]       reply = answer[\"reply\"]       print('[FT5 ANSER! DEB] REPLY \u0414\u041e \u041e\u0411\u0420\u0410\u0411\u041e\u0422\u041a\u0418!', reply, \"\u044d\u043c\u0446, \u043a\u043c\u0434=\", emotion, command)       if not reply or reply.strip() == \"\" or len(reply.strip()) &lt; 2:           void_phrases = [\"\u041c\u043d\u0435 \u043d\u0435\u0447\u0435\u0433\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c...\", \"\u0411\u0435\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432...\",                           \"\u042f \u043d\u0435 \u0443\u0441\u043b\u044b\u0448\u0430\u043b\u0430, \u043c\u043e\u0436\u0435\u0448\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430?\",                           \"\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430?\",                           \"\u0417\u0438\u0441 \u0434\u0435\u0441\u043a\u0440\u0430\u0439\u0431\u0435\u0440 \u0438\u0437 \u043d\u043e\u0442 \u0430\u0432\u0435\u043b\u0438\u0431\u0430\u043b \u043d\u0430\u0443, \u043f\u043b\u0438\u0437, \u043a\u0430\u043b \u0431\u044d\u043a \u043b\u044d\u0439\u0442\u0435\u0440\",                           \"\u0410\u0431\u043e\u043d\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d, \u043f\u0435\u0440\u0435\u0437\u0432\u043e\u043d\u0438\u0442\u0435 \u043f\u043e\u0437\u0436\u0435.\"]           reply = random.choice(void_phrases)        while (reply.find('\\n\\n') != -1):           reply = reply.replace('\\n\\n', '\\n')        answer_filter = FiltersQueue(reply)  # filt.Filter(msg)       answer_filter_topics = answer_filter[\"topics\"]       answer_filter_topics_str = ' '.join(answer_filter_topics)       print('[FT5 ANS DEBUG FILTER] filter,msg', answer_filter)       own_msg_filtered = False       reply_without_filter = reply       if (answer_filter[\"score\"] &lt;= -10 and not filter_allowed):           print('[FT5 FILTER ERR] \u0421\u041e\u041e\u0411\u0429\u0415\u041d\u0418\u0415 \u041d\u0415 \u041f\u0420\u041e\u0428\u041b\u041e \u0424\u0418\u041b\u042c\u0422\u0420\u0410\u0426\u0418\u042e! \u0411\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u043c!')           filtered_phrases = [\"\u041e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043e\",                               \"\u041f\u043e\u0445\u043e\u0436\u0435, \u044f \u0445\u043e\u0442\u0435\u043b\u0430 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u0435\",                               \"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e\",                               \"\u0423\u043f\u0441, \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u044f \u0445\u043e\u0442\u0435\u043b\u0430 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0433\u0430\u0434\u043a\u043e\u0435\",                               \"\u042f \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u0430\u044f \u0434\u0435\u0432\u043e\u0447\u043a\u0430\",                               \"\u041f\u0440\u043e\u0441\u0442\u0438\u0442\u0435, \u043d\u043e \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u043e, \u043e \u0447\u0435\u043c \u044f \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0430, \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u044d\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043b\u043e\u0445\u043e\u0435\",                               \"\u041c\u043e\u0434\u0435\u0440\u0430\u0442\u043e\u0440 \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043d\u0435 \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u043e\u043c\u043e\u043b\u0447\u0430\u0442\u044c\"                               ]           reply_without_filter = reply  # \u0437\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u043c \u043e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0447\u0442\u043e\u0431 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0430\u0442\u044c \u0432 \u0434\u0441           reply = random.choice(filtered_phrases)           own_msg_filtered = True        # ans[\"filter_score\"] = filter[\"score\"]       # question[\"filter_allowed\"] = filter[\"allow\"]       # question[\"filter_topics\"] = filter[\"topics\"]        print(printPref, \"\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043e\u0442\u0432\u0435\u0442 >>\", reply, \"&lt;&lt;\\n\", \"\u042d\u041c\u041e\u0426\u0418\u042f=\" + col(emotion, \"green\", True),             \"\u041a\u041e\u041c\u0410\u041d\u0414\u0410=\" + col(answer[\"command\"], \"green\", True))       rankChange = EmotionToRank(emotion)        modifyMood(mood_modifer_filter + (rankChange \/ 2))       newUserRank = DATABASE.add_to_user_rank(user_id=db_user_id, amount=rankChange)        # LogChat.append({\"role\": \"user\", \"content\": inp})       # LogChat.append({\"role\": \"assistant\", \"content\": reply})        print(printPref, \"\u0418\u043d\u0444\u0430 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435: \u042e\u0422\u041d\u0438\u043a=\" + col(           authorisedUser) + f\" \u0440\u0430\u043d\u0433={col(newUserRank)} (+{col(rankChange)})\" + f\" \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 = {col(ctx.mood)} (+{col(old_mood - ctx.mood)}))\")       print(printPref, \"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u0442\u043e\u043a\u0435\u043d\u043e\u0432 >>\", bcolors.WARNING, usage_tokens, bcolors.ENDC, \"&lt;&lt;\",             \"\u0412\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043e\", calcTime(startTime))       # discord post        if stream_data[\"outputActive\"]:           ds_timecode = stream_data[\"outputTimecode\"].split(\".\")[0]       else:           ds_timecode = eztime_min()       if environment_data.get(\"filter_allowed\", False):           discord_filter_phrase = \"\"       else:           discord_filter_phrase = \"! \"       ds_event_phrase = \" (\" + environment_data.get(\"env\", \"?\") + \")\" + \" \u0421\u043e\u0431\u044b\u0442\u0438\u0435 \" + environment_data.get(           \"type\", \"\") if isEvent else f\"\"\"&lt;{round(newUserRank, 2)}> {authorisedUser}\"\"\" + \" \"       for_discord_msg = f\"\"\"Q:> [{ds_timecode}]{ds_event_phrase}: {inp} ({discord_filter_phrase}{source_filter_topics_str}) A:> NetTyan: {reply_without_filter} ({answer_filter_topics_str}) -----\"\"\"              if own_msg_filtered:                 discord_filtered_post(for_discord_msg)             else:                 discord_msg_post(for_discord_msg)              if not isEvent:                 ezdate = eztime()                 # {'outputActive': False, 'outputBytes': 0, 'outputCongestion': 0.0, 'outputDuration': 0, 'outputReconnecting': False, 'outputSkippedFrames': 0, 'outputTimecode': '00:00:00.000', 'outputTotalFrames': 0}                  DiagToLog = [                     {\"user\": authorisedUser, \"role\": \"user\", \"content\": inp,                      \"date\": environment_data.get(\"date\", ezdate),                      \"emotion\": \"\", \"command\": \"\",                      \"filter_allowed\": environment_data.get(\"filter_allowed\", None),                      \"filter_topics\": source_filter_topics_str,                      },                      {\"user\": \"NetTyan\", \"role\": \"assistant\", \"content\": reply, \"date\": ezdate,                      \"emotion\": emotion, \"command\": command,                      \"filter_allowed\": answer_filter[\"allow\"],                      \"filter_topics\": answer_filter_topics_str                      }                     # log(\"user\", inp, emotion, user=authorisedUser),                     # log(\"assistant\", reply, emotion, command=answer[\"command\"])                     # log(role=\"assistant\",content=\"None\",emotion=\"\"):                 ]                 # DB_addLogUserDiag(authorisedUser, DiagToLog)                 answer_has_questions = \"?\" in reply                 if answer_has_questions:                     DATABASE.set_user_last_question(user_id=db_user_id, question=reply)                 nick_analyze_normal = environment_data.get(\"do_nick_analyze\", False) and len(                     reply) > 100 and db_nick_id                 if nick_analyze_normal:                     DATABASE.set_analyze_for_nick(db_nick_id, nick_analyze=reply)                 DATABASE.add_diags(user_id=db_user_id, diag_to_add=DiagToLog, data=environment_data)             returnOut[\"user\"] = authorisedUser             returnOut[\"reply\"] = reply             returnOut[\"command\"] = answer[\"command\"]             returnOut[\"emotion\"] = emotion             # replytrans = fixFemWords(translator.translate(reply,dest='ru').text)             return returnOut<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 (\u0434\u043b\u044f \u043c\u0435\u043d\u044f) \u0447\u0430\u0441\u0442\u0435\u0439 \u2014 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f \u0434\u043b\u044f \u043e\u0442\u0432\u0435\u0442\u0430. \u0421\u0440\u0430\u0437\u0443 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0435\u0433\u043e \u043a\u043e \u0432\u0441\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0441\u0440\u0435\u0434\u0430\u043c \u2014 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Minecraft, \u043d\u043e \u0438 Discord, Youtube, Twitch \u0438 \u0442.\u0434. \u041c\u0435\u0442\u043e\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043f\u043e\u043a\u0430 \u043d\u0435 \u0432\u043d\u0435\u0434\u0440\u0438\u043b\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, TTS) \u043f\u043e\u043a\u0430 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0448\u043a\u0430\u043c\u0438 (pass \u0438\u043b\u0438 return \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u043e\u0434\u0430, \u043f\u043e\u0441\u043b\u0435 def).<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 main.py\/QuestionChooser<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def ChooseQuestion(questions, priority=\"\"):     # {\"user\":\"nickname\",\"msg\":\"message\",\"date\":\"25-03.245235\",\"nicktype\":\"ytname\"}     # PreviousUsers = [\"lol\",'4odedy']     ScoredQuestions = []     maxScore = -99999     bestQuestion = None      startTime = datetime.now()     for i, question in enumerate(questions):         if question.get(\"delete\", False) == True:             print('\u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d')             continue         user = question.get(\"user\", \"\")         # DB_getUserNicknames()         msg = question.get(\"msg\", \"\")         msg = msg.strip()         words = wordtokenize(msg)         q_date = question.get(\"date\", \"\")         if isinstance(q_date, str):             if q_date != \"\":                 q_date = tm(q_date)             else:                 q_date = datetime.now()          LastInteract = (datetime.now() - q_date).total_seconds()         if (LastInteract > 300):             print('DELETE QUESTION reason=time ', ctx_chat[i])             question[\"delete\"] = True             # questions[i] = question             # ctx_chat[i] = question             chats_replace(ctx_chat, processing_timestamp=question[\"processing_timestamp\"],                           new_chat_entry=question,                           this_array=questions)             continue          score = 0         user_id = None         if user.strip():             db_data = DATABASE.get_or_create_user(data=question, return_nick_id_too=True)             if db_data:                 user_id = db_data[\"user_id\"]                 question[\"nick_id\"] = db_data[\"nick_id\"]          if user_id:             if user_id in ChooserPreviousUsers:  # or AuthorizedUsers (+ High ranked + donaters)                 score += 5             question[\"last_interact\"] = DATABASE.get_user_last_interact_time(user_id=user_id,                                                                              last_answered=True)             question[\"user_id\"] = user_id             user_rank = DATABASE.get_user_rank(user_id=user_id)             question[\"user_rank\"] = user_rank             score += user_rank \/ 2             diags_count = DATABASE.get_user_diag_count(user_id=user_id, real=True)             # DEBUG DISABLED!! \u041f\u041e\u0422\u041e\u041c \u041d\u0410\u0414\u041e \u0414\u041e\u041f\u0418\u041b\u0418\u0422\u042c             # TODO TODO TODO             # collect_all_chat_user_msgs(ctx_chat,             #                           processing_timestamp=question[\"processing_timestamp\"],             #                           this_chat_entry=question, this_array=questions)              if diags_count is not None:                 if (diags_count > 10):                     score += 1                 ChooserPreviousUsers[0] = user_id         else:             print('[CHOOSER] CANT ADD OR GET USER!!!')             continue         q_changed = False         if question.get(\"filter_allowed\", None) is None:             filter = FiltersQueue(msg)  # filt.Filter(msg)             # print('filter,msg', filter,msg)             question[\"filter_score\"] = filter[\"score\"]             question[\"filter_allowed\"] = filter[\"allow\"]             question[\"filter_topics\"] = filter[\"topics\"]             # questions[i] = question             # ctx_chat[i] = question             q_changed = True             chats_replace(ctx_chat, processing_timestamp=question[\"processing_timestamp\"],                           new_chat_entry=question, this_array=questions)             ###ctx_chat = list(questions)         if question.get(\"sentence_type\", None) is None:             question_analysis = FiltersQueue(msg, filter_type=\"info\")  # filt.Filter(msg)             question[\"sentence_type\"] = question_analysis[\"sentence_type\"]             q_changed = True         if q_changed:             chats_replace(ctx_chat, processing_timestamp=question[\"processing_timestamp\"],                           new_chat_entry=question, this_array=questions)          filter_score = question[\"filter_score\"]         filter_allowed = question[\"filter_allowed\"]         filter_topics = question[\"filter_topics\"]         # print(\"debug QUEST 0FilterResults>>>\", question.get(\"FilterResults\", \"\"))         # print(\"debug QUEST FilterResults>>>\", questions[i].get(\"FilterResults\", \"\"))         # print(\"debug QUEST CHAT FilterResults>>>\",ctx_chat[i].get(\"FilterResults\",\"\"))         if (not question.get(\"env\", \"\") in [\"youtube\", \"twitch\", \"trovo\"]) and priority == \"youtube\":             continue             # msg=\"\"         # todo bypass filter for some users (devs?)         if not ((filter_score &lt;= -10 and not filter_allowed) or not msg):  # and LastInteract>120):             ## \u041e\u041f\u0420\u0415\u0414\u0415\u041b\u0415\u041d\u0418\u0415 \u0421\u0420\u0415\u0414\u042b, \u042e\u0422\u0423\u0411\u0415\u0420\u0410\u041c +10             if question.get(\"env\", \"\") == \"youtube\":                 score += 5             elif question.get(\"env\", \"\") == \"discord\":                 score += 10  # old 4 todo find premium and add +100             elif question.get(\"env\", \"\") == \"twitch\" or question.get(\"env\", \"\") == \"trovo\":                 score += 3              if question.get(\"priority_group\", \"\") == \"max\":                 score += 100              ## \u0410\u0412\u0422\u041e\u0420\u0418\u0417\u0410\u0426\u0418\u042f ##              ## \u041e\u041f\u0420\u0415\u0414\u0415\u041b\u0415\u041d\u0418\u0415 \u041e\u0411\u0420\u0410\u0429\u0415\u041d\u0418\u042f ##             for word in words:                 nickSim = MasSimilarity(word, botNicknames)                 if nickSim > 95:                     score += 20                     break                 elif nickSim > 75:  # def isSimilarMas(example,mas,val=75):                     score += 15                     break                 elif MasSimilarity(word, botRelativesL1) > 75:                     score += 10                     break                 elif MasSimilarity(word, botRelativesL2) > 75:                     score += 5                     break             ## \u041a\u0410\u0427\u0415\u0421\u0422\u0412\u041e \u0422\u0415\u041a\u0421\u0422\u0410 ##             # \u043f\u0435\u0440\u0432\u0430\u044f \u0431\u0443\u043a\u0432\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f             py_clip = lambda x, l, u: l if x &lt; l else u if x > u else x             if msg[0].islower():                 score -= 0.1             else:                 score += 0.2             # \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435  8 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0435\u0435             if len(msg) >= 10:                 score += 1             else:                 score -= 1             # \u0440\u0430\u043d\u0436\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e \u0434\u0430\u0442\u0435 (\u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u0438\u0435 \u043d\u043e \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b)             scored = question  # copy.deepcopy(question)              if LastInteract &lt; 10:                 pass                 # score+=LastInteract\/50             else:                 scored[\"processing\"] = \"queue\"              # \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u041a\u041e\u041d\u041a\u0420\u0415\u0422\u041d\u041e \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c              def calc_user_last_interact(last_answerred: bool = False) -> datetime.date:                 if last_answerred:                     last_interact_time_string = DATABASE.get_user_last_question_date(user_id)                     if not last_interact_time_string:                         last_interact_time_string = None                 else:                     last_interact_time_string = question.get(\"last_interact\", None)                 if last_interact_time_string:                     last_interact_date = tm(last_interact_time_string)                 else:                     last_interact_date = datetime(2022, 12, 25)                 return (datetime.now() - last_interact_date).total_seconds()              user_last_interact = calc_user_last_interact(False)             user_last_questioned = calc_user_last_interact(True)              # \u043c\u0435\u043d\u044c\u0448\u0435 80 \u0441\u0435\u043a \u043d\u0430\u0437\u0430\u0434 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c?             if user_last_interact &lt; 80:                 score += 3                 print('[DEBUG NEW] Q chooser: SCORE+3 (\u043d\u0435\u0434\u0430\u0432\u043d\u0438\u0439 \u043e\u0442\u0432\u0435\u0442)')              # \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u043b\u0438 \u043b\u0438 \u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e \u0447\u0435\u043c-\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437             if user_last_questioned &lt; 100:                 print('[DEBUG NEW] Q chooser: SCORE+10 (\u0411\u042b\u041b \u041d\u0415\u0414\u0410\u0412\u041d\u041e \u0421\u041f\u0420\u041e\u0428\u0415\u041d!)')                 score += 10              # if LastInteract&lt;100:             # else:             #    score+=-100+py_clip((LastInteract-30)\/200,0,60)              # \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0443 \u0438 \u0442\u0435\u043c\u0430\u043c             if filter_allowed:                 score += filter_score             else:                 score += -abs(filter_score * 2.3)              scored[\"score\"] = score             scored[\"LastInteract\"] = LastInteract             if (score > maxScore and LastInteract &lt; 10):                 maxScore = score                 scored[\"processing\"] = \"bestchosen\"                 bestQuestion = scored              # scored[\"processing\"] =\"pending\"             ScoredQuestions.append(scored)         else:             print('DELETE QUESTION reason=filterScore or msg=\"\"', ctx_chat[i])              question[\"delete\"] = True             chats_replace(ctx_chat, processing_timestamp=question[\"processing_timestamp\"],                           new_chat_entry=question,                           this_array=questions)             # return {\"delete\":True,\"deleteIndex\":i}     if len(ScoredQuestions) > 0:         # print('DEBUG ScoredQuestions ',ScoredQuestions)         timeMult = 1         while bestQuestion is None:             timeMult *= 2             # print('DEBUG \u0432\u0441\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u043e\u043b\u0434\u043e\u0432\u044b\u0435. \u0412\u044b\u0431\u0440\u0430\u043d \u0431\u0443\u0434\u0435\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 \u0441\u0440\u0435\u0434\u0438 \u043d\u0438\u0445')             maxScore = -99999             for question in ScoredQuestions:                 score = question[\"score\"]                 if (score > maxScore and question[\"LastInteract\"] &lt; 10 * timeMult):                     maxScore = score                     bestQuestion = question             if timeMult > 300:  # \u0431\u044b\u043b\u043e 10000                 # print(\"FILTER CHOOSER \u0412\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043e\", calcTime(startTime))                 # return {\"delete\":True}                 return None     # print(\"FILTER CHOOSER \u0412\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043e\", calcTime(startTime))     return bestQuestion      # for question in ScoredQuestions:   ### DEBUG CHOOSER ### def ChooseQuestionTest():     # filt.CheckModel()     questionMassive = [         {\"user\": \"unknown\", \"msg\": \"\u041f\u0440\u0438\u0432\u0435\u0442! \u041a\u0430\u043a \u0434\u0435\u043b\u0430?\", \"date\": \"2023-06-17 22:21:10\"},  # %Y-%m-%d %H:%M:%S         {\"user\": \"unknown\", \"msg\": \"\u043d\u0443 \u0437\u0434\u0430\u0440\u043e\u0432\u0430 \u0447\u0435\", \"date\": \"2023-06-17 22:21:10\"},         {\"user\": \"unknown\", \"msg\": \"\u041d\u0443 \u0437\u0434\u0430\u0440\u043e\u0432\u0430 \u0447\u0435\", \"date\": \"2023-06-17 22:21:10\"},         {\"user\": \"unknown\", \"msg\": \"\u043f\u0440\u0438\u0432\u0435\u0442 \u0442\u044f\u043d\u043a\u0430\", \"date\": \"2023-06-17 22:21:08\"},         {\"user\": \"4odedy\", \"msg\": \"\u043f\u0440\u0438\u0432\u0435\u0442 \u0442\u044f\u043d\u043a\u0430\", \"date\": \"2023-06-17 22:21:08\"},     ]     print('DEBUG CHOOSER >>', ChooseQuestion(questionMassive))   # ChooseQuestionTest() ### DEBUG CHOOSER END ###  donationQueue = manager.list()  ctx_chat = manager.list()   def ctx_chat_replace(ctx_chat, processing_timestamp: int, new_chat_entry: dict) -> bool:     start_ctx_chat_len = len(ctx_chat)     for idx, chat_entry in enumerate(ctx_chat):         if chat_entry.get(\"processing_timestamp\", -1) == processing_timestamp:             if start_ctx_chat_len != len(ctx_chat):                 print(                     f\"[CTX CHAT WARNING ERR] \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415!!! \u041a\u041e\u041b\u0418\u0427\u0415\u0421\u0422\u0412\u041e \u0427\u0410\u0422\u0410 \u0418\u0417\u041c\u0415\u041d\u0418\u041b\u041e\u0421\u042c \u0412 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0415: {str(start_ctx_chat_len)} -> {str(len(ctx_chat))}! \u042f\u0447\u0435\u0439\u043a\u0430:\",                     chat_entry)             ctx_chat[idx] = new_chat_entry             return True      return False   def inner_chat_replace(processing_timestamp: int, new_chat_entry: dict, this_array: list = None) -> bool:     start_ctx_chat_len = len(this_array)     for idx, chat_entry in enumerate(this_array):         if chat_entry.get(\"processing_timestamp\", -1) == processing_timestamp:             if start_ctx_chat_len != len(this_array):                 print(                     f\"[INNER CHAT WARNING ERR] \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415!!! \u041a\u041e\u041b\u0418\u0427\u0415\u0421\u0422\u0412\u041e \u0427\u0410\u0422\u0410 \u0418\u0417\u041c\u0415\u041d\u0418\u041b\u041e\u0421\u042c \u0412 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0415: {str(start_ctx_chat_len)} -> {str(len(this_array))}! \u042f\u0447\u0435\u0439\u043a\u0430:\",                     chat_entry)             this_array[idx] = new_chat_entry             return True     return False   # processing_timestamp=question[\"processing_timestamp\"],this_chat_entry=question,this_array=questions) def collect_all_chat_user_msgs(ctx_chat, processing_timestamp: int, this_chat_entry: dict,                                this_array: list = None) -> dict:     if this_array is None:         this_array = ctx_chat     if this_chat_entry.get(\"delete\", False):         return this_chat_entry     start_ctx_chat_len = len(this_array)     result_msg = \"\"     this_date = this_chat_entry.get(\"date\", \"\")     if isinstance(this_date, str):         if this_date != \"\":             this_date = tm(this_date)         else:             this_date = datetime.now()     changed = False     for idx, chat_entry in enumerate(this_array):         if chat_entry.get(\"delete\", False) == True:             print('[debug chat ctx] delete tag, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c')             continue         own_msg = False         if chat_entry.get(\"processing_timestamp\",                           -1) == processing_timestamp:  # \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438 \u0442\u043e \u0436\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435  \u0447\u0442\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c             # upd: ***** \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u043d\u0430\u0434\u043e. \u041f\u0443\u0441\u0442\u044c \u043e\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442             own_msg = True             if start_ctx_chat_len != len(this_array):                 print(                     f\"[INNER CHAT WARNING ERR] \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415!!! \u041a\u041e\u041b\u0418\u0427\u0415\u0421\u0422\u0412\u041e \u0427\u0410\u0422\u0410 \u0418\u0417\u041c\u0415\u041d\u0418\u041b\u041e\u0421\u042c \u0412 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0415: {str(start_ctx_chat_len)} -> {str(len(this_array))}! \u042f\u0447\u0435\u0439\u043a\u0430:\",                     chat_entry)             # continue         if chat_entry.get(\"user\", \"\") == this_chat_entry.get(\"user\", \"\"):             if changed:                 result_msg += \"\\n\"             result_msg += chat_entry.get(\"msg\", \"\").strip()             if not own_msg:                 chat_entry[\"delete\"] = True                 this_array[idx] = chat_entry                 chats_replace(ctx_chat=ctx_chat, processing_timestamp=chat_entry[\"processing_timestamp\"],                               new_chat_entry=chat_entry, this_array=this_array)             oldest_date = this_chat_entry.get(\"date\", \"\")             oldest_date_time = None             if isinstance(oldest_date, str):                 if oldest_date != \"\":                     oldest_date_time = tm(oldest_date)                 else:                     oldest_date_time = datetime.now()             if this_date is not None and oldest_date_time is not None:                 if oldest_date_time > this_date:                     this_chat_entry[\"date\"] = oldest_date_time             changed = True             print('[DEBUG CTX CHAT] MERGING MSGS', result_msg, 'from user', chat_entry.get(\"user\", \"\"))     if changed:         this_chat_entry[\"msg\"] = result_msg         chats_replace(ctx_chat=ctx_chat, processing_timestamp=processing_timestamp,                       new_chat_entry=this_chat_entry, this_array=this_array)     return this_chat_entry   def chats_replace(ctx_chat, processing_timestamp: int, new_chat_entry: dict, this_array: list = None) -> bool:     return inner_chat_replace(processing_timestamp, new_chat_entry, this_array) \\         and ctx_chat_replace(ctx_chat, processing_timestamp, new_chat_entry)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 main.py\/CentralDecisionMaker<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from FredT5 import CutSpaces   def SplitTextToParts(text: str, max_length: int = 150, prefix: str = \"\") -> list:     result = \"\"     resultmas = []     k = 0     for i, char in enumerate(text):         # print(i,'suka') \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044f \u0441 0         if k == 0:             k += len(prefix)          k += 1         result += char          if (k >= max_length * 0.85):             if char in \" .!?\":                 k = max_length          if (k >= max_length):             # print('4o ',k,max_length,resultmas)             resultmas.append(prefix + result.strip())             result = \"\"             k = 0         elif (i == len(text) - 1):             resultmas.append(prefix + result)     return resultmas   def CutMaxNumbers(inp):     out = \"\"     i = 0     for char in inp:         if char.isdigit():             i += 1             if i &lt;= 5:                 out += char         else:             out += char     if len(out.strip()) == 0:         out = out + \"\u044d\u043c\"     return out   def PrepareForChatPrint(inp):     restrictedChars = \"\"\"\\n\\r|!'=#\".,-\/\\\\&amp;^%$#@{}[]()*\"\"\"     for char in restrictedChars:         inp = inp.replace(char, \" \")     inp = translit(CutSpaces(inp))     if len(inp) &lt; 2:         inp = inp + \"\u043b\u043e\u043b\"     return inp   def ChatOwnRepeatDetect(inp, val=75):     for msg in ctx_chatOwn:         if isSimilar(msg[\"msg\"], inp, val):             return True     return False     # isSimilarMas(chatprint, ctx_chatOwn, 75)      # tracker.print_diff()   # warnings.filterwarnings(\"ignore\", message=\"torch.distributed.reduce_op is deprecated\") def TimeEventsCheck(timeEvent: str, sec=15):      timeEventTime = ctx.timeEvents.get(timeEvent, None)     if timeEventTime is None:         timeEventTime = datetime.now() - timedelta(seconds=500.0)     else:         timeEventTime = tm(timeEventTime)     return (datetime.now() - timeEventTime).total_seconds() > sec   ############################## ### CENTRAL DECISION MAKER ### ############################## ctx.stream_started = False from string_utils import NonRepeatRandom from string_utils import NonRepeatRandom   def CentralDecisionMaker():     \"\"\"\u0413\u041b\u0410\u0412\u041d\u041e\u0415 \u0421\u0420\u0415\u0414\u0421\u0422\u0412\u041e \u0423\u041f\u0420\u0410\u0412\u041b\u0415\u041d\u0418\u042f\"\"\"      def BroadcastProcesser():         nrr = NonRepeatRandom(repeating_dict)         bc_type = nrr.r(\"stream_ad,status_report\", key=\"decision_broadcast\")         answer = FredT5Chatbot(\"\u043f\u0443\u0441\u0442\u043e\u0442\u0430\", authorisedUser=\"default\",                                environment_data={\"env\": \"broadcast\", \"broadcast_type\": bc_type,                                                  \"i_mood\": ctx.mood,                                                  \"ingame_info\": dict(ctx.ingame_info), })         sendToMCChat(answer[\"reply\"], \"default\", type=\"stream_ad\", doVoice=True)         return True      def DonateProcesser():         donation_answer_performed = False         # print(donationQueue)         if len(donationQueue) > 0:             donat = donationQueue[0]             name = donat.get(\"username\", \"\").strip()             msg = donat.get(\"message\", \"\").strip()             try:                 summ = float(donat.get(\"amount\", 0))                  if summ > 0:                     if name == \"\":                         name = \"\u0430\u043d\u043e\u043d\u0438\u0441\u0442\"                         data_to_db = {\"env\": \"donation\", \"summ\": summ, \"date\": eztime()}                     else:                         # \u0414\u041e\u0411\u0410\u0412\u0418\u0422\u042c \u0412 \u0411\u0410\u0417\u0423 \u0414\u0410\u041d\u041d\u042b\u0425! \u042d\u0422\u041e \u041f\u0410\u041c\u042f\u0422\u042c!                         data_to_db = {\"user\": name, \"somm\": summ, \"env\": \"donation\", \"msg\": msg,                                       \"date\": eztime()}                     if msg == \"\":                         msg = \"\u043f\u0443\u0441\u0442\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\"                     print(' \u0414\u041e\u041d\u0410\u0422 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0415\u0420 \u0410\u041a\u0422\u0418\u0412\u0418\u0420\u041e\u0412\u0410\u041d ! \u0412\u042b\u0412\u041e\u0414\u0418\u041c \u0414\u041e\u041d\u0410\u0422', donat)                     answer = FredT5Chatbot(msg, authorisedUser=name, environment_data=data_to_db)                     textToSpeech(\"... \" + name + \".. \" + answer[\"reply\"], \"medium\", \"medium\",                                  seeChat=False)                  else:                     textToSpeech(f\"\u041e\u0439 \u0441\u043f\u0430\u0441\u0438\u0431\u043e.. \u0414\u043e\u0440\u043e\u0433\u043e\u0439 {name}, \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u043e\u0447\u043a\u0443! \u041d\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\u044f\",                                  \"medium\", \"medium\", # \"\u043d\u044f\u044f\" \u0434\u043b\u044f \u0440\u043e\u0444\u043b\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0442\u044f\u0436\u043d\u043e\u0433\u043e \u0437\u0432\u0443\u043a\u0430                                  seeChat=False)                 donation_answer_performed = True             except BaseException as err:                 print('\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                 print('\u041e\u0428\u0418\u0411\u041a\u0410 \u0412 \u0414\u041e\u041d\u0410\u0422\u0418\u041e\u041d \u0410\u041b\u0415\u0420\u0422\u0421!', err)                 donation_answer_performed = False             donationQueue.pop(0)          return donation_answer_performed      def EventProcesser():         event_answer_performed = False         if ctx.ingame:             if len(ctx.eventlist) > 0:                 # lastevent = ctx.eventlist[-1]                 for i, event in enumerate(ctx.eventlist):                     name = event.get(\"user\", \"\")                     type = event.get(\"type\", \"\")                     LastInteract = (datetime.now() - tm(event.get(\"date\"))).total_seconds()                     if (LastInteract &lt; 14 and len(ctx_chat) > 0) or (LastInteract &lt; 25 and len(ctx_chat) &lt;= 0):                         msg = \"\u0430\u0445\u0430\u0445\u0430\u0445\"                         eventToAdd = dict(event)                         eventToAdd[\"env\"] = \"minecraft_event\"                         answer = FredT5Chatbot(msg, authorisedUser=name, environment_data=eventToAdd)                         sendToMCChat(answer[\"reply\"], usr=name,                                      type=\"minechat_answer\",                                      doVoice=True)                 ctx.eventlist[:] = []         if event_answer_performed:             ctx.timeEvents[\"last_mineevent_answer\"] = eztime()         return event_answer_performed      def sendToMCChat(inp: str, usr=None, doVoice=True, type=\"minechat_answer\") -> bool:         chat_answer_performed = False         chatprint = PrepareForChatPrint(inp)         voiceprefix = \"\"         if type == \"minechat_answer\":             usrTrans = translit(usr) + \" \"              voiceprefix = random.choice(                 [usrTrans + \". \"])             if not chatprint.find(usrTrans) != -1:                 chatprint = usrTrans + chatprint         chatPrintMas = []         maxAllowedServerMsg = 140         serv = ctx.GameInfo.get(\"server\", \"\")  # server, serverMode, chatType         mode = ctx.GameInfo.get(\"serverMode\", \"\")         prefix = \"\"         print('serv,mod =', serv, mode)         if serv == \"mc.vimemc.net\" and mode == \"thepit\":             maxAllowedServerMsg = 100             print('limit changed')         elif serv == \"funnymc.ru\" and mode == \"skywars\":             maxAllowedServerMsg = 95             print('limit changed FMC Pref \/g')             prefix = \"\/g \"         elif mode == \"survival\":             prefix = \"!\"          chatPrintMas = SplitTextToParts(chatprint, maxAllowedServerMsg, prefix=prefix)          # chatprint=chatprint[0:147]         print('\u0447\u0430\u0442 \u043f\u0430\u0440\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d \u043d\u0430 \u0447\u0430\u0441\u0442\u0438: ', chatPrintMas)         repeating = False         for i, chatPart in enumerate(chatPrintMas):             if (len(chatPrintMas) > 0):                 chatPrintMas[i] = CutMaxNumbers(chatPart)             if ChatOwnRepeatDetect(chatPart):                 repeating = True         chat_answer_performed = False         if not repeating:             ctx.BridgeChatQueue.extend(chatPrintMas)             chat_answer_performed = True              ###ctx.BridgeChatQueue = ctx.BridgeChatQueue + list(chatPrintMas)             if doVoice:                 textToSpeech(voiceprefix + inp, \"medium\", \"medium\", seeChat=False)         else:             print('MC REPEAT DETECT!')         if chat_answer_performed:             ctx.timeEvents[\"last_\" + type] = eztime()         return chat_answer_performed      def CentralChatProcesser(priority=\"minecraft\"):         central_chat_answer_performed = False         q = None          def clear_deleted_from_ctx_chat():             for lol in ctx_chat:                 if lol.get(\"delete\", False) == True:                     ii = ctx_chat.index(lol)                     print('DELETE QUESTION IN PROC!!! index =', ii, '; q =', lol)                     if (ii >= 0 and ii &lt; len(ctx_chat)):                         ctx_chat.pop(ii)          if True:             if (len(ctx_chat) > 0):                 # tracker = SummaryTracker()                  ### PREPARING CHAT ###                 for chat_entry in ctx_chat:                     collect_all_chat_user_msgs(ctx_chat=ctx_chat,                                                processing_timestamp=chat_entry[\"processing_timestamp\"],                                                this_chat_entry=chat_entry)                 clear_deleted_from_ctx_chat()                  q = ChooseQuestion(ctx_chat, priority=priority)                  ### CLEARING CHAT ###                 clear_deleted_from_ctx_chat()                  if q is not None:                     print('len chat do:', len(ctx_chat))                     idx = -100                     for lol in ctx_chat:                         if lol.get(\"processing_timestamp\", -1) == q.get(\"processing_timestamp\", -1):                             idx = ctx_chat.index(lol)                     if q.get(\"env\", \"\") == \"minecraft\":                         if not ctx.ingame:                             q = None                     if idx >= 0:                         ctx_chat.pop(idx)                     print('len chat posle:', len(ctx_chat))                 if q is not None and q != {} and q != [] and q[\"msg\"].strip() != \"\":                     central_chat_answer_performed = True                     if ctx.ingame and q.get(\"env\", \"\") == \"minecraft\":                         # \u0412\u042b\u041f\u0418\u041b\u0418\u0422\u042c \u041e\u0422\u0412\u0415\u0427\u0415\u041d\u041d\u042b\u0419 \u042d\u041b\u0415\u041c\u0415\u041d\u0422 \u0418\u0417 \u041c\u0410\u0421\u0421\u0418\u0412\u0410                         # params = {\"max_length\":70}                         print('\u041f\u0415\u0420\u0415\u0414 \u0417\u0410\u041f\u0423\u0421\u041a\u041e\u041c \u0410\u041d\u0421\u0412\u0415\u0420\u0410 \u0412 \u0414\u0415\u0421\u0418\u0416\u041d \u041c\u0410\u041a\u0415\u0420\u0415 q.get(\"filter_allowed\", None) =',                               q.get(\"filter_allowed\", None))                         answer = FredT5Chatbot(q[\"msg\"], authorisedUser=q[\"user\"], environment_data=q)                         # if(ctx.BridgeChatQueue != []):                         print(' !!! \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415 !!!  >>>  \u0417\u0410\u041f\u0423\u0421\u041a \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u041e\u0413\u041e \u041e\u0422\u0412\u0415\u0422\u0410 \u0418\u0413\u0420\u041e\u041a\u0423')                         # \u0437\u0434\u0435\u0441\u044c time events \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0442\u0430\u0439\u043c \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 sendToMCChat                         central_chat_answer_performed = sendToMCChat(answer[\"reply\"], usr=q[\"user\"],                                                                      type=\"minechat_answer\",                                                                      doVoice=True)  # inp, usr=None, prefixMas=[''], doVoice=False)                      elif q.get(\"env\", \"\") == \"youtube\":                         print(' !!! \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415 !!!  >>>  \u0417\u0410\u041f\u0423\u0421\u041a \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u041e\u0413\u041e \u041e\u0422\u0412\u0415\u0422\u0410 \u0412 \u042e\u0422\u0423\u0411\u0415')                         answer = FredT5Chatbot(q[\"msg\"], authorisedUser=q[\"user\"], environment_data=q)                         ctx.timeEvents[\"last_youtube_answer\"] = eztime()                         ban = \"\"                         if answer.get(\"command\", \"\") == \"\u0431\u0430\u043d\":                             user_channel_id = q.get(\"youtube_user_channel_id\", None)                             if user_channel_id:                                 ban = \"[\u0437\u0430\u0431\u0430\u043d\u0438\u0442\u044c] \"                                 print(f'\u0417\u0430\u0431\u0430\u043d\u0438\u0442\u044c {q[\"user\"]} \u043d\u0430 10s, \u0417\u0410\u0411\u0410\u041d\u0418\u0422\u042c =', ban)                                 ctx.YoutubeActionsQueue.append({\"action\": \"ban\", \"ytname\": q[\"user\"],                                                                 \"youtube_user_channel_id\": user_channel_id,                                                                 \"bantime\": 10})                          ctx.YoutubeActionsQueue.append(                             {\"action\": \"reply\", \"msg\": f\"\"\"{ban}{q[\"user\"]}. {answer[\"reply\"]}\"\"\"})                         textToSpeech(\"\u044e\u0442\u0438\u043a \" + q[\"user\"] + \". \" + answer[\"reply\"], \"medium\",                                      \"medium\", seeChat=False)                     elif q.get(\"env\", \"\") == \"twitch\":                         print(' !!! \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415 !!!  >>>  \u0417\u0410\u041f\u0423\u0421\u041a \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u041e\u0413\u041e \u041e\u0422\u0412\u0415\u0422\u0410 \u0412 TWITCH')                         answer = FredT5Chatbot(q[\"msg\"], authorisedUser=q[\"user\"], environment_data=q)                         twitch_actions_queue.put(                             {\"action\": \"reply\", \"msg\": f\"\"\"{q[\"user\"]}. {answer[\"reply\"]}\"\"\"})                         textToSpeech(\"\u0442\u0432\u0438\u0447 \" + q[\"user\"] + \". \" + answer[\"reply\"], \"medium\",                                      \"medium\", seeChat=False)                     elif q.get(\"env\", \"\") == \"trovo\":                         print(' !!! \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415 !!!  >>>  \u0417\u0410\u041f\u0423\u0421\u041a \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u041e\u0413\u041e \u041e\u0422\u0412\u0415\u0422\u0410 \u0412 TROVO')                         answer = FredT5Chatbot(q[\"msg\"], authorisedUser=q[\"user\"], environment_data=q)                         trovo_actions_queue.put(                             {\"action\": \"reply\", \"msg\": f\"\"\"{q[\"user\"]}. {answer[\"reply\"]}\"\"\"})                         textToSpeech(\"\u0442\u0440\u043e\u0432\u043e \" + q[\"user\"] + \". \" + answer[\"reply\"], \"medium\",                                      \"medium\", seeChat=False)                     elif q.get(\"env\", \"\") == \"discord\":                         print(' !!! \u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415 !!!  >>>  \u0417\u0410\u041f\u0423\u0421\u041a \u0410\u0412\u0422\u041e\u041c\u0410\u0422\u0418\u0427\u0415\u0421\u041a\u041e\u0413\u041e \u041e\u0422\u0412\u0415\u0422\u0410 \u0412 DISCORD!!!')                          answer = FredT5Chatbot(q[\"msg\"], authorisedUser=q[\"user\"], environment_data=q)                         if not q.get(\"manual_instruct\", True):                             discord_mention_name = q[\"user\"]                             if \"discord_id\" in q:                                 discord_mention_name = \"&lt;@\" + q[\"discord_id\"] + \">\"                             DiscordTestMsgSend(                                 \"[AI] \u043e\u0442\u0432\u0435\u0442 \u0434\u043b\u044f \" + discord_mention_name + \" \\n\" + answer[\"reply\"])                             prefix_ans = \"\u0434\u0438\u0441 \" + q[\"user\"] + \". \"                             textToSpeech(prefix_ans + answer[\"reply\"], \"medium\",                                          \"medium\", seeChat=False)                         else:                             sendToMCChat(answer[\"reply\"], usr=q[\"user\"],                                          type=\"stream_ad\",                                          doVoice=True)  # inp, usr=None, prefixMas=[''], doVoice=False)                      else:                         print('\u041d\u0443 \u0447\u0435 \u043d\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438 \u043f\u0430\u043b\u0443\u0447\u0430\u0435\u0446\u0430')                         central_chat_answer_performed = False         return central_chat_answer_performed<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u0410 \u0432\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u043e\u0447\u043d\u043e\u00a0\u2014 \u0432\u0443\u0430\u043b\u044f! \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0430 \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u0442\u044f\u043d \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f! \u041f\u0440\u0430\u0432\u0434\u0430, \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u00ab\u0442\u043e\u0440\u043c\u043e\u0437\u043e\u0432\u00bb \u0443\u00a0\u043d\u0435\u0451 \u0431\u044b\u043b\u043e, \u043a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f: <span class=\"habrahidden\">(\u0430 \u0435\u0449\u0451 \u0442\u0430\u043c \u0432\u043c\u0435\u0441\u0442\u043e \u0411\u0414 \u043d\u0430 sqlite \u0431\u044b\u043b \u043f\u0440\u043e\u0441\u0442\u043e json)<\/span><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u0441\u043e\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 (\u043d\u0435 \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435 \u0437\u0440\u0435\u043b\u0438\u0449\u0435)<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"RudeChatDemo\" id=\"RudeChatDemo\"><\/a><\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a\u00a0\u043d\u0430\u00a0\u044d\u0442\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0443\u00a0\u043d\u0430\u0441 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0442 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438, \u0432\u00a0\u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430\u0448\u0435\u0439 \u043f\u043e\u0434\u043e\u043f\u044b\u0442\u043d\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0443\u043a\u043b\u043e\u043d \u0432 \u00ab\u043c\u043e\u0447\u0435\u043f\u043e\u043b\u043e\u0432\u044b\u0435\u00bb \u0442\u0435\u043c\u044b, \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u044b\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0441\u0430\u043c\u0438\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432 \u0432 \u0447\u0430\u0442\u0435 (\u043d\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/38d\/eab\/836\/38deab83630fa0a254c4710c964d5193.png\" alt=\"\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0435\u0442\u0441\u043a\u0438\u0439 \u044e\u043c\u043e\u0440, \u043d\u043e \u0441\u043e\u0439\u0434\u0451\u0442\" title=\"\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0435\u0442\u0441\u043a\u0438\u0439 \u044e\u043c\u043e\u0440, \u043d\u043e \u0441\u043e\u0439\u0434\u0451\u0442\" width=\"660\" height=\"246\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/38d\/eab\/836\/38deab83630fa0a254c4710c964d5193.png\"\/><\/p>\n<div><figcaption>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0435\u0442\u0441\u043a\u0438\u0439 \u044e\u043c\u043e\u0440, \u043d\u043e \u0441\u043e\u0439\u0434\u0451\u0442<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3a1\/9d5\/3d7\/3a19d53d71975237dfaf7b7808d7065c.png\" alt=\"\u0414\u0430, \u044d\u0442\u043e \u0436\u0435\u0441\u0442\u043a\u043e...\" title=\"\u0414\u0430, \u044d\u0442\u043e \u0436\u0435\u0441\u0442\u043a\u043e...\" width=\"648\" height=\"267\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3a1\/9d5\/3d7\/3a19d53d71975237dfaf7b7808d7065c.png\"\/><\/p>\n<div><figcaption>\u0414\u0430, \u044d\u0442\u043e \u0436\u0435\u0441\u0442\u043a\u043e&#8230;<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5d9\/dd6\/f06\/5d9dd6f06b6556c70e673399c5c4129b.png\" alt=\"\u041e\u043f\u044f\u0442\u044c \u043f\u0440\u043e \u044f\u0439\u0446\u0430? \u0414\u0430 \u0447\u0442\u043e \u0436 \u0442\u0430\u043a\u043e\u0435, \u0441\u0434\u0435\u043b\u0430\u0439 \u0443\u0436\u0435 \u0441\u0435\u0431\u0435 \u044f\u0438\u0447\u043d\u0438\u0446\u0443, \u0432 \u043a\u043e\u043d\u0446\u0435-\u0442\u043e \u043a\u043e\u043d\u0446\u043e\u0432\" title=\"\u041e\u043f\u044f\u0442\u044c \u043f\u0440\u043e \u044f\u0439\u0446\u0430? \u0414\u0430 \u0447\u0442\u043e \u0436 \u0442\u0430\u043a\u043e\u0435, \u0441\u0434\u0435\u043b\u0430\u0439 \u0443\u0436\u0435 \u0441\u0435\u0431\u0435 \u044f\u0438\u0447\u043d\u0438\u0446\u0443, \u0432 \u043a\u043e\u043d\u0446\u0435-\u0442\u043e \u043a\u043e\u043d\u0446\u043e\u0432\" width=\"609\" height=\"193\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5d9\/dd6\/f06\/5d9dd6f06b6556c70e673399c5c4129b.png\"\/><\/p>\n<div><figcaption>\u041e\u043f\u044f\u0442\u044c \u043f\u0440\u043e \u044f\u0439\u0446\u0430? \u0414\u0430 \u0447\u0442\u043e \u0436 \u0442\u0430\u043a\u043e\u0435, \u0441\u0434\u0435\u043b\u0430\u0439 \u0443\u0436\u0435 \u0441\u0435\u0431\u0435 \u044f\u0438\u0447\u043d\u0438\u0446\u0443, \u0432 \u043a\u043e\u043d\u0446\u0435-\u0442\u043e \u043a\u043e\u043d\u0446\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/321\/04c\/206\/32104c206ab14597348e32ac45e8fca9.png\" alt=\"\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &quot;\u0445\u0430\u0445\u0430\u0445\u0430\u0445\u0430\u0445&quot;?\" title=\"\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 &quot;\u0445\u0430\u0445\u0430\u0445\u0430\u0445\u0430\u0445&quot;?\" width=\"606\" height=\"181\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/321\/04c\/206\/32104c206ab14597348e32ac45e8fca9.png\"\/><\/p>\n<div><figcaption>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u00ab\u0445\u0430\u0445\u0430\u0445\u0430\u0445\u0430\u0445\u00bb?<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dbc\/36e\/019\/dbc36e019a730938e650651a054f1505.png\" alt=\"\u00ab\u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438 \u0447\u0442\u043e\u00a0\u044f \u043f\u043e\u043d\u044f\u043b\u0430 \u0447\u0442\u043e\u00a0\u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438?\u00bb (\u0441) \u0418\u0418\" title=\"\u00ab\u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438 \u0447\u0442\u043e\u00a0\u044f \u043f\u043e\u043d\u044f\u043b\u0430 \u0447\u0442\u043e\u00a0\u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438?\u00bb (\u0441) \u0418\u0418\" width=\"611\" height=\"359\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dbc\/36e\/019\/dbc36e019a730938e650651a054f1505.png\"\/><\/p>\n<div><figcaption>\u00ab\u041a\u0430\u043a \u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438 \u0447\u0442\u043e\u00a0\u044f \u043f\u043e\u043d\u044f\u043b\u0430 \u0447\u0442\u043e\u00a0\u0432\u044b \u043f\u043e\u043d\u044f\u043b\u0438?\u00bb \u00a9 \u0418\u0418<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3ef\/7c4\/ab0\/3ef7c4ab0f9740e063fa69ca3564c708.png\" alt=\"\u0410 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e?\" title=\"\u0410 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e?\" width=\"596\" height=\"274\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3ef\/7c4\/ab0\/3ef7c4ab0f9740e063fa69ca3564c708.png\"\/><\/p>\n<div><figcaption>\u0410 \u0432\u044b \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e?<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/936\/d5b\/a00\/936d5ba003798650341d4e5bd7405a21.png\" alt=\"\u041b\u0443\u0447\u0448\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u044f \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435\u0440\u043e\u0432 \u043e\u0442 \u0418\u0418\" title=\"\u041b\u0443\u0447\u0448\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u044f \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435\u0440\u043e\u0432 \u043e\u0442 \u0418\u0418\" width=\"543\" height=\"180\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/936\/d5b\/a00\/936d5ba003798650341d4e5bd7405a21.png\"\/><\/p>\n<div><figcaption>\u041b\u0443\u0447\u0448\u0435\u0435 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u044f \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435\u0440\u043e\u0432 \u043e\u0442 \u0418\u0418<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6c3\/9bc\/374\/6c39bc37462e2a5370641c3a597fb262.png\" alt=\"\u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0442 &quot;\u0431\u0440\u0435\u0434\u043e\u0432\u044b\u0435&quot; \u0432\u0435\u0449\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0430\u0441\u0442\u043e...\" title=\"\u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0442 &quot;\u0431\u0440\u0435\u0434\u043e\u0432\u044b\u0435&quot; \u0432\u0435\u0449\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0430\u0441\u0442\u043e...\" width=\"602\" height=\"300\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6c3\/9bc\/374\/6c39bc37462e2a5370641c3a597fb262.png\"\/><\/p>\n<div><figcaption>\u0412\u043e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0432\u043e\u0442 \u00ab\u0431\u0440\u0435\u0434\u043e\u0432\u044b\u0435\u00bb \u0432\u0435\u0449\u0438 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0430\u0441\u0442\u043e&#8230;<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8b5\/2f9\/2f7\/8b52f92f7f026375820cfee41c35917a.png\" alt=\"\u0421 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0437\u0430 \u0441\u043b\u043e\u0432\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u043e (\u0432\u043d\u0438\u0437\u0443)\" title=\"\u0421 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0437\u0430 \u0441\u043b\u043e\u0432\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u043e (\u0432\u043d\u0438\u0437\u0443)\" width=\"591\" height=\"151\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8b5\/2f9\/2f7\/8b52f92f7f026375820cfee41c35917a.png\"\/><\/p>\n<div><figcaption>\u0421 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0443\u0433\u0430\u0434\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e \u0437\u0430 \u0441\u043b\u043e\u0432\u043e \u0442\u0430\u043c \u0431\u044b\u043b\u043e (\u0432\u043d\u0438\u0437\u0443)<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0443\u0433\u0430\u0441\u0448\u0435\u0439 \u043b\u044e\u0431\u0432\u0438&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/2df\/0ee\/8ba\/2df0ee8ba4b94a8bfb73e3a84b8f64a4.png\" alt=\"\u041e\u043d \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0431\u0435\u0437 \u043e\u0442\u0432\u0435\u0442\u0430((\" title=\"\u041e\u043d \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0431\u0435\u0437 \u043e\u0442\u0432\u0435\u0442\u0430((\" width=\"607\" height=\"111\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/2df\/0ee\/8ba\/2df0ee8ba4b94a8bfb73e3a84b8f64a4.png\"\/><\/p>\n<div><figcaption>\u041e\u043d \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0431\u0435\u0437 \u043e\u0442\u0432\u0435\u0442\u0430((<\/figcaption><\/div>\n<\/figure>\n<p>\u0412\u0438\u0434\u0438\u043c\u043e, \u043d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u00ab\u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u0447\u0443\u0432\u0441\u0442\u0432\u0430\u00bb \u0438 \u043e\u043d\u0430 \u0432\u044b\u0440\u0443\u0431\u0438\u043b\u0430\u0441\u044c. \u0421\u0435\u0440\u044c\u0451\u0437\u043d\u043e. Python-\u0447\u0430\u0441\u0442\u044c (\u0441 \u0424\u0440\u0435\u0434\u043e\u043c) \u0442\u043e\u0433\u0434\u0430 \u043a\u0440\u0430\u0448\u043d\u0443\u043b\u0430\u0441\u044c, \u0438  \u044d\u0442\u043e\u0442 \u043f\u0430\u0440\u043d\u0451\u043a \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0431\u0435\u0437 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0435\u0437 \u043e\u0442\u0432\u0435\u0442\u0430&#8230;<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"ChatBugs\" id=\"ChatBugs\"><\/a><\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0447\u0430\u0441\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043a\u0430\u0437\u0443\u0441\u044b&#8230; \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0432\u0445\u043e\u0434\u0438\u043b\u0430 \u0432 \u0446\u0438\u043a\u043b \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u044f, \u043d\u043e \u0435\u0449\u0451 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u043b\u0438 \u0441\u043b\u0443\u0447\u0430\u0438, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u043c\u043e\u0433\u043b\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0437\u0430 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>\u0411\u0430\u0433\u0438 (\u0442\u043e\u0436\u0435 \u0432\u0435\u0441\u0435\u043b\u043e)<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e64\/9d5\/598\/e649d55981632fced592f6db57283c62.png\" alt=\"\u041f\u0438\u0448\u0435\u0442 \u0432\u0435\u0441\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0438\u0437 \u043f\u0440\u043e\u043c\u043f\u0442\u0430 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e\" title=\"\u041f\u0438\u0448\u0435\u0442 \u0432\u0435\u0441\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0438\u0437 \u043f\u0440\u043e\u043c\u043f\u0442\u0430 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e\" width=\"590\" height=\"118\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e64\/9d5\/598\/e649d55981632fced592f6db57283c62.png\"\/><\/p>\n<div><figcaption>\u041f\u0438\u0448\u0435\u0442 \u0432\u0435\u0441\u044c \u0434\u0438\u0430\u043b\u043e\u0433 \u0438\u0437 \u043f\u0440\u043e\u043c\u043f\u0442\u0430 \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7a8\/02d\/0e7\/7a802d0e74320aa59072e305b9614fd6.png\" alt=\"\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u0432 \u0440\u043e\u043b\u0438 \u0434\u043e\u043a\u0442\u043e\u0440\u0430 (\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043a\u043b\u0438\u043d\u0438\u043a\u0438)?\" title=\"\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u0432 \u0440\u043e\u043b\u0438 \u0434\u043e\u043a\u0442\u043e\u0440\u0430 (\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043a\u043b\u0438\u043d\u0438\u043a\u0438)?\" width=\"596\" height=\"170\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7a8\/02d\/0e7\/7a802d0e74320aa59072e305b9614fd6.png\"\/><\/p>\n<div><figcaption>\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043f\u0440\u043e\u0431\u0443\u0435\u0442 \u0441\u0435\u0431\u044f \u0432 \u0440\u043e\u043b\u0438 \u0434\u043e\u043a\u0442\u043e\u0440\u0430 (\u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043a\u043b\u0438\u043d\u0438\u043a\u0438)?<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/473\/ca4\/72f\/473ca472f7357d785247ad3a7881cd59.png\" alt=\"\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0431\u0443\u043a\u0432\u044b \u0432 \u043a\u043e\u043d\u0446\u0435... \u0412\u0438\u0434\u0438\u043c\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0432\u044b\u0434\u0430\u043b\u0430 \u0447\u0442\u043e-\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043b\u043e\u0432\u0430 \u00ab\u0447\u043e\u00bb\" title=\"\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0431\u0443\u043a\u0432\u044b \u0432 \u043a\u043e\u043d\u0446\u0435... \u0412\u0438\u0434\u0438\u043c\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0432\u044b\u0434\u0430\u043b\u0430 \u0447\u0442\u043e-\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043b\u043e\u0432\u0430 \u00ab\u0447\u043e\u00bb\" width=\"588\" height=\"108\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/473\/ca4\/72f\/473ca472f7357d785247ad3a7881cd59.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0431\u0443\u043a\u0432\u044b \u0432 \u043a\u043e\u043d\u0446\u0435&#8230; \u0412\u0438\u0434\u0438\u043c\u043e \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0432\u044b\u0434\u0430\u043b\u0430 \u0447\u0442\u043e-\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u043e\u043d\u043e\u043c\u0435\u0440\u043d\u043e\u0435 \u043f\u043e\u0441\u043b\u0435 \u0441\u043b\u043e\u0432\u0430 \u00ab\u0447\u043e\u00bb<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u043c \u043e\u0442\u0434\u044b\u0445\u0430\u0442\u044c \u043e\u0442\u00a0\u043a\u043e\u0434\u0430: \u0432\u043e\u0442, \u0434\u0435\u0440\u0436\u0438\u0442\u0435 \u0435\u0449\u0451 \u043f\u0430\u0440\u0443 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u0435\u043f\u0435\u0440\u044c \u0443\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0448\u0430 \u0442\u044f\u043d\u043a\u0430 \u0441\u0442\u0430\u043b\u0430 \u00ab\u043f\u043e\u0443\u0432\u0435\u0440\u0435\u043d\u043d\u0435\u0435\u00bb \u0432 \u043f\u043b\u0430\u043d\u0435 \u0430\u0432\u0442\u043e\u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<details class=\"spoiler\">\n<summary>\u0422\u043e\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043d\u043e\u0441 \u0447\u0430\u0442\u0430<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"ChatDemo\" id=\"ChatDemo\"><\/a><\/p>\n<p>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 NetTyan. \u0417\u0434\u0435\u0441\u044c \u0443\u0436\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u00ab\u043f\u043e\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u044b\u0432\u0430\u0442\u044c\u00bb \u0441\u0432\u043e\u0439 \u00ab\u043d\u0435\u0439\u0440\u043e\u043d\u044b\u0439 \u044f\u0437\u044b\u043a\u00bb&#8230;<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/519\/d8f\/7d4\/519d8f7d4a667b1660212804b899fced.png\" alt=\"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a\u043e\u0439 \u043c\u0438\u043b\u044b\u0439 \u043c\u0430\u043b\u044c\u0447\u0438\u043a...\" title=\"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a\u043e\u0439 \u043c\u0438\u043b\u044b\u0439 \u043c\u0430\u043b\u044c\u0447\u0438\u043a...\" width=\"645\" height=\"71\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/519\/d8f\/7d4\/519d8f7d4a667b1660212804b899fced.png\"\/><\/p>\n<div><figcaption>\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u043a\u0430\u043a\u043e\u0439 \u043c\u0438\u043b\u044b\u0439 \u043c\u0430\u043b\u044c\u0447\u0438\u043a&#8230;<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u041e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/78c\/70e\/8f7\/78c70e8f72d4b37709de75ed820b0d21.png\" alt=\"\u00ab\u042f \u043d\u0435 ***, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u043c\u043d\u0430\u044f \u0438 \u044d\u0440\u0443\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430\u00bb \u00a9 \u0418\u0418\" title=\"\u00ab\u042f \u043d\u0435 ***, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u043c\u043d\u0430\u044f \u0438 \u044d\u0440\u0443\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430\u00bb \u00a9 \u0418\u0418\" width=\"513\" height=\"127\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/78c\/70e\/8f7\/78c70e8f72d4b37709de75ed820b0d21.png\"\/><\/p>\n<div><figcaption>\u00ab\u042f \u043d\u0435 ***, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u043c\u043d\u0430\u044f \u0438 \u044d\u0440\u0443\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u0435\u0432\u0443\u0448\u043a\u0430\u00bb \u00a9 \u0418\u0418<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8f2\/b7a\/261\/8f2b7a261abf1010d5c1f9035b8e457f.png\" alt=\"&quot;\u0411\u0435\u043b\u043e\u0441\u043d\u0435\u0436\u043a\u0430 \u0438 7 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435\u0440\u043e\u0432&quot;\" title=\"&quot;\u0411\u0435\u043b\u043e\u0441\u043d\u0435\u0436\u043a\u0430 \u0438 7 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435\u0440\u043e\u0432&quot;\" width=\"587\" height=\"323\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8f2\/b7a\/261\/8f2b7a261abf1010d5c1f9035b8e457f.png\"\/><\/p>\n<div><figcaption>\u00ab\u0411\u0435\u043b\u043e\u0441\u043d\u0435\u0436\u043a\u0430 \u0438 7\u00a0\u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0435\u0440\u043e\u0432\u00bb<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/214\/e66\/e02\/214e66e02b2dc1cec7db72a265086b0a.png\" alt=\"\u00ab\u0415\u0441\u043b\u0438\u00a0\u0436\u0435 \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b, \u0442\u043e \u044f \u0431\u0443\u0434\u0443 \u0431\u0438\u0442\u044c \u0432\u0430\u0441 \u0441\u00a0\u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u2665\u00bb \u00a9 \u0418\u0418\" title=\"\u00ab\u0415\u0441\u043b\u0438\u00a0\u0436\u0435 \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b, \u0442\u043e \u044f \u0431\u0443\u0434\u0443 \u0431\u0438\u0442\u044c \u0432\u0430\u0441 \u0441\u00a0\u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u2665\u00bb \u00a9 \u0418\u0418\" width=\"596\" height=\"143\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/214\/e66\/e02\/214e66e02b2dc1cec7db72a265086b0a.png\"\/><\/p>\n<div><figcaption>\u00ab\u0415\u0441\u043b\u0438\u00a0\u0436\u0435 \u0432\u044b \u0433\u043e\u0442\u043e\u0432\u044b, \u0442\u043e \u044f \u0431\u0443\u0434\u0443 \u0431\u0438\u0442\u044c \u0432\u0430\u0441 \u0441\u00a0\u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c <strong>\u2665<\/strong>\u00bb \u00a9 \u0418\u0418<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b72\/778\/110\/b72778110aed3c706d3c50ee8e2c6b92.png\" alt=\"\u041e\u0448\u0438\u0431\u043b\u0438\u0441\u044c, \u043d\u0435 \u043c\u0438\u043b\u044b\u0439 \u043f\u0451\u0441\u0438\u043a, \u0431\u044b\u0432\u0430\u0435\u0442\" title=\"\u041e\u0448\u0438\u0431\u043b\u0438\u0441\u044c, \u043d\u0435 \u043c\u0438\u043b\u044b\u0439 \u043f\u0451\u0441\u0438\u043a, \u0431\u044b\u0432\u0430\u0435\u0442\" width=\"577\" height=\"297\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b72\/778\/110\/b72778110aed3c706d3c50ee8e2c6b92.png\"\/><\/p>\n<div><figcaption>\u041e\u0448\u0438\u0431\u043b\u0438\u0441\u044c, \u043d\u0435 <em>\u043c\u0438\u043b\u044b\u0439<\/em> \u043f\u0451\u0441\u0438\u043a, \u0431\u044b\u0432\u0430\u0435\u0442<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1d9\/9ef\/9cf\/1d99ef9cf1e816dadef651c926033ca0.png\" alt=\"&quot;\u0410 \u0432\u044b \u043d\u0435 \u0431\u043e\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043c\u0438\u0440 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0441?&quot;\" title=\"&quot;\u0410 \u0432\u044b \u043d\u0435 \u0431\u043e\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043c\u0438\u0440 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0441?&quot;\" width=\"696\" height=\"130\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d9\/9ef\/9cf\/1d99ef9cf1e816dadef651c926033ca0.png\"\/><\/p>\n<div><figcaption>\u00ab\u0410 \u0432\u044b \u043d\u0435\u00a0\u0431\u043e\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e\u00a0\u043c\u0438\u0440 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0441?\u00bb<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"AnotherCode\" id=\"AnotherCode\"><\/a><\/p>\n<h3>\u0414\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0438 (TTS, Google API&#8230;)<\/h3>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0435 \u044f \u0443\u0436\u0435 \u043f\u0440\u044f\u043c \u043f\u043e\u0434\u0443\u0441\u0442\u0430\u043b \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0447\u0442\u043e \u0432\u0441\u0451 \u0441\u0430\u043c\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0438 \u0432\u0435\u0441\u0451\u043b\u043e\u0435 \u2014 \u043f\u043e\u0437\u0430\u0434\u0438, \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0443\u0445\u043e\u0439 \u0441\u0443\u0440\u043e\u0432\u044b\u0439 \u043a\u043e\u0434&#8230;<\/p>\n<details class=\"spoiler\">\n<summary>TTS<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u043e\u0437\u0434\u0430\u0451\u043c TTS \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u043d\u0430\u0448\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0441\u0442\u0438\u043b\u0435, \u0441 \u00ab\u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 main.py\/TTS_PROCESS<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def TTS_PROCESS(ctx):     import torch     # from torch import package     print('[TTS INIT] Started load TTS model...')     device = torch.device(\"cpu\")  # 'cpu')  # cuda     torch.set_num_threads(4)     t = datetime.now()     local_file = thisfolder + '\/AI_Models\/TTS\/variants\/Silero\/silero_tts.pt'     if not os.path.isfile(local_file):         torch.hub.download_url_to_file('https:\/\/models.silero.ai\/models\/tts\/ru\/v3_1_ru.pt',                                        local_file)     VoiceModel = torch.package.PackageImporter(local_file).load_pickle(\"tts_models\", \"model\")     # VoiceModel, exampleText = torch.hub.load(repo_or_dir='snakers4\/silero-models', model='silero_tts', language='ru',     #                                         speaker='v3_1_ru', trust_repo=True, cache_dir=)  # v3_1_ru \u0438\u043b\u0438 ru_v3      VoiceModel.to(device)  # gpu or cpu     print('[TTS INIT] \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 VOICE TTS \u043d\u0430', device, '=', calcTime(t))     # VoiceModel.eval() \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442     print('[TTS INIT 2 NEW] Started load ACCENTUATOR model...')     # from ruaccent import RUAccent     #     # accentizer = RUAccent()     # custom_words_accent_dict = {\"\u0431\u043e\u0432\u0434\u0443\u0440\":\"\u0431+\u043e\u0432\u0434\u0443\u0440\",\"\u0431\u043e\u0432\u0434\u0443\u0440\u0443\u0441\":\"\u0431+\u043e\u0432\u0434\u0443\u0440\u0443\u0441\"}     # accentizer.load(omograph_model_size='big', use_dictionary=True, custom_dict=custom_words_accent_dict)     # https:\/\/huggingface.co\/TeraTTS\/accentuator     print('[TTS INIT 2 NEW] ENDED! load ACCENTUATOR model! time =', calcTime(t))      ctx.loading_flag.set()      while True:         try:             text = ctx.Queue.get()             print('[VOICE QUEUE] \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c', text)             # text = accentizer.process_all(text)             # print('[VOICE QUEUE DEBUG NEW] \u0422\u0415\u041a\u0421\u0422 \u0421 \u0423\u0414\u0410\u0420\u0415\u041d\u0418\u042f\u041c\u0418 >>', text)             # VoiceModel, exampleText = torch.hub.load(repo_or_dir='snakers4\/silero-models', model='silero_tts',             #                                         language='ru',             #                                         speaker='v3_1_ru', trust_repo=True)  # v3_1_ru \u0438\u043b\u0438 ru_v3             VoiceModel = torch.package.PackageImporter(local_file).load_pickle(\"tts_models\", \"model\")             VoiceModel.to(device)  # gpu or cpu             try:                 audiowave = VoiceModel.apply_tts(ssml_text=text, speaker='baya', sample_rate=48000, put_accent=True,                                                  put_yo=True)             except BaseException as err:                 print(\"=== \u041f\u0420\u041e\u0418\u0417\u041e\u0428\u041b\u0410 \u041e\u0428\u0418\u0411\u041a\u0410\", err, \"\u0412 \u0413\u0415\u041d\u0415\u0420\u0410\u0426\u0418\u0418 \u0421\u0418\u041d\u0422\u0415\u0417\u0410 \u0420\u0415\u0427\u0418! ====\\n\")                 print(\"=== \u0422\u0415\u041a\u0421\u0422>>\" + text + \"&lt;&lt; ====\\n\")                 print('\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                 print(\"\\n=== \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")                 audiowave = VoiceModel.apply_tts(text=text, speaker='baya', sample_rate=48000, put_accent=True,                                                  put_yo=True)             ctx.QueueOutput.put(audiowave)         except BaseException as err:             print('[TTS ERR] \u041e\u0428\u0418\u0411\u041a\u0410 \u041f\u0420\u041e\u0426\u0415\u0421\u0421\u0410 \u0412 TTS: ', err)             print('[TTS ERR] \u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())             print(\"\\n[TTS ERR] === \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")             time.sleep(1)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0432\u0443\u043a. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u043c\u043e\u0433\u043b\u0430 \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043f\u0440\u044f\u043c\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0432\u0435\u0442\u044b \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438 \u0438 \u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u044b\u043c\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c.<\/p>\n<p>\u041e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u0432 \u0440\u0430\u0431\u043e\u0442\u0443 \u0442\u0435\u043a\u0441\u0442 \u0441 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u0430\u043c\u0438. \u0415\u0433\u043e \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0437\u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 obs (\u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043e\u0439), \u0447\u0442\u043e\u0431\u044b \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u043f\u043e\u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0440\u0435\u0447\u044c\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 main.py\/textToSpeech<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">def emotions_to_str(text: str) -> str:     emotions_str_map = {\"&lt;3\": \"\u0441\u0435\u0440\u0434\u0435\u0448\u043a\u043e\",                         \"^_^\": \"\u043d\u044f\u0430\u0430\u0430\u0430\u0430\",                         \"^^\": \"\u043d\u044f\u0430\",                         \":)\": \"\u0443\u043b\u044b\u0431\u043a\u0430\",                         \":')\": \"\u043f\u043b\u0430\u043a\",                         \":-)\": \"\u0443\u043b\u044b\u0431\u043a\u0430\",                         \":(\": \"\u0433\u0440\u0443\u0441\u0442\u044c\",                         \":'(\": \"\u043f\u043b\u0430\u043a\",                         \":-(\": \"\u043f\u0435\u0447\u0430\u043b\u044c\u043a\u0430\",                         \"(\": \"\u0442\u043e \u0435\u0441\u0442\u044c\",                         }     for emo in emotions_str_map:         text = text.replace(emo, emotions_str_map[emo])     return text  translitLatin = lambda x: cyrtranslit.to_latin(x, \"ru\") from num2words import num2words  def NumbersToSpeech(inp):     numbers = re.findall(r'\\b\\d+\\b', inp)     result = inp     for numb in numbers:         print(numb, num2words(numb, lang='ru'))         result = result.replace(numb, num2words(numb, lang='ru'))     return result  def PrepareToSpeech(ninp, subtitles=False):     inp = ninp     result = \"\"     # print('.', end='')     if subtitles:         result = inp      else:         result = NumbersToSpeech(translit(inp))  # \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434. \u0441\u043c\u0430\u0439\u043b\u043e\u0432;         result = emotions_to_str(result)     if len(ninp) > 900:         inp = ninp[0:899]     return result import pygame from pygame import mixer  # Playing sound import pygame._sdl2.audio as sdl2_audio  init_by_me = not pygame.mixer.get_init() if init_by_me:     pygame.mixer.init() devices = tuple(sdl2_audio.get_audio_device_names()) if init_by_me:     pygame.mixer.quit() # print(str(devices)) pygame.mixer.pre_init() pygame.mixer.init(frequency=48000, size=-16, channels=2, buffer=7168,                   devicename='CABLE-A Input (VB-Audio Cable A)')  # Initialize it with the correct device # sound_effect.play() # pip install sounddevice import sounddevice as sd  sd.default.samplerate = 48000 sd.default.channels = 2 sd.default.device = 'CABLE-A Input (VB-Audio Cable A), Windows DirectSound' def SoundToMicro(file='test.wav', audio=None, sleep=False, smart_wait=False, change_emotes=False):     ####pygame.init()     # pygame.mixer.init(devicename='CABLE Input (VB-Audio Virtual Cable)') #Initialize it with the correct device     # sound_effect = pygame.mixer.Sound('test.wav')     if sleep and smart_wait:         speech_available_event.clear()     if change_emotes:         ctx.SeparateEyes = False         ctx.state = \"idle\"      if audio is not None:         sd.play(audio, 48000 * 1.05)         if sleep:             time.sleep((len(audio) \/ 48000) + 0.5)             sd.stop()     else:         sound_effect = pygame.mixer.Sound(file)         sound_effect.play()      if change_emotes:         ctx.isVoiceBusy = False         ctx.SeparateEyes = False         ctx.state = \"gaming\"     if sleep and smart_wait:         speech_available_event.set() def textToSpeech(text, rate=\"fast\", pitch=\"medium\", seeChat=False):     \"\"\"\u0412 \u0432\u0435\u0440\u0441\u0438\u0438 0.0.4 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u043e\u0441\u043e\u0431\u044b\u0439 \u0431\u043b\u043e\u043a: \u0436\u0434\u0435\u043c, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0430\u044f \u0440\u0435\u0447\u044c\"\"\"     print('\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043c\u043e\u0434\u0435\u043b\u044c...')     startTime = datetime.now()      text = PrepareToSpeech(text)     subtitles = PrepareToSpeech(text, subtitles=True)     text = OformText(text, rate, pitch)     ctx.isVoiceBusy = True     if seeChat:         ctx.AnimEventInfo = {\"name\": \"SawChat.exp3.json\", \"type\": \"expression\", \"time\": 0.01}         ctx.AnimEvent.set()      print(\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0444\u0430\u0439\u043b\u0430 wav... \u0432\u0440\u0435\u043c\u044f \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0433\u0430:\", calcTime(startTime))  # +text)     audio = TTS_QUEUE(text)     print(\"\u0418\u0433\u0440\u0430\u0435\u043c \u0437\u0432\u0443\u043a wav...\", calcTime(startTime))      if seeChat:         ctx.AnimEvent.clear()      speech_available_event.wait()      TextDisplaySpeed.value = rate     textSubtitlesHttp.value = subtitles     # Thread     threading.Thread(target=SoundToMicro,                      kwargs={\"audio\": audio, \"sleep\": True, \"smart_wait\": True, \"change_emotes\": True},                      daemon=True).start()     # SoundToMicro(audio=audio, sleep=True)      # print_subtitles(subtitles,rate)     print(\"\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0432\u044b\u0432\u043e\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d! \u0417\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0432\u0441\u0451 \u043f\u0440\u043e \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f =\",           calcTime(startTime))  # \u0437\u0430\u043a\u043e\u043d\u0447\u0435\u043d! \u0417\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0432\u0441\u0451 \u043f\u0440\u043e \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f      # vtube_ctx.NeedX = -0.5     # vtube_ctx.NeedY = -1     # ctx.AnimEvent.clear()<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>OBS<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0421\u0432\u044f\u0436\u0435\u043c \u043d\u0430\u0448\u0443 TTS-\u0447\u0430\u0441\u0442\u044c \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0432\u044b\u0432\u043e\u0434\u0438\u043b\u0430 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b! \u041d\u0443 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0431\u0430\u0431\u0430\u0445\u0430\u0435\u043c \u0441\u0432\u044f\u0437\u044c \u0447\u0435\u0440\u0435\u0437 obs websocket, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c obs-\u043a\u043e\u0439 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/p>\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u0441\u0434\u0435\u043b\u0430\u043b \u0432\u0432\u0438\u0434\u0443 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e Silero \u043e\u0441\u043e\u0431\u043e \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043b\u0451\u0433\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432, \u0430 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0440\u0435\u0447\u044c, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u0441\u0430\u043c\u0438 \u0438 \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u0443\u0435\u043c, \u044f \u043d\u0435 \u0445\u043e\u0447\u0443. \u0412 \u043e\u0431\u0449\u0435\u043c, \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432: \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d\u0430, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0442\u0430\u043a \u0441\u0435\u0431\u0435, \u043d\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f&#8230;<\/p>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u044f\u0442\u044c \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0441 OBS \u0431\u0443\u0434\u0435\u043c \u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u043e\u043c Flask web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0435\u0442\u0438. \u0422\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441 \u043b\u0451\u0433\u043a\u043e\u0441\u0442\u044c \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0441\u043a\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0447\u0435\u0433\u043e (\u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0432\u0435\u0431-\u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435). \u041a\u0440\u043e\u043c\u0435 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432, \u043a\u0441\u0442\u0430\u0442\u0438, \u0437\u0430\u043e\u0434\u043d\u043e, \u0431\u0443\u0434\u0435\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u00ab\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f\u00bb \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 subtitles_web.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import random  def clamp(n, smallest, largest): return max(smallest, min(n, largest)) def print_subtitles(inp,speed=\"fast\",calculateTime=False):     import time     if not calculateTime:         print(\"== \u0412\u042b\u0412\u041e\u0414\u0418\u041c \u0421\u0423\u0411\u0422\u0418\u0422\u0420\u042b ==\")         print(\"\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b>> \",end='', flush=True) # rate x-slow slow medium fast x-fastt     punktEnd = \"!?.\"     if speed == \"fast\":         mult = 1     elif speed == \"x-fast\":         mult = 0.7     elif speed == \"medium\":         mult = 1.3     elif speed == \"slow\":         mult = 1.7     elif speed == \"x-slow\":         mult = 2.0     resulttime = 0     if inp:         for symbol in inp:                          waittime = 0.04*mult             if symbol == \" \":                 waittime = 0.06*mult             elif symbol == \",\":                 waittime = 0.2*mult             elif punktEnd.find(symbol) != -1:                 waittime = 0.4*mult             if(not calculateTime):                 print(symbol,end='', flush=True)                 time.sleep(waittime)             else:                 resulttime+=waittime     if (not calculateTime):         print(\"\\n==\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u044b!==\")     else:         #print('\u0412\u0440\u0435\u043c\u044f \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 >>> '+str(resulttime))         return resulttime def HttpAppRun(ctx,SubtText,TextDisplaySpeed,RefreshInterval,screenPrintMas):     import multiprocessing     from multiprocessing import Process, Manager     import threading     from flask import Flask, render_template     import flask     import subprocess     import time     import logging     log = logging.getLogger('werkzeug')     log.disabled = True     sitestring = [\"\u0447\u043e \u0434\u0435\u0434\u0443 \u0447\u043e \u0431\u0430\u0431\u043a\u0435\"]     app = Flask(__name__)      text_to_display = \"\"     newtext = \"vzz\"     ####def update_text():     ####    global text_to_display     ####    global newtext     ####    threading.Timer(0.01, update_text).start()     ####    #print(newtext)     ####    text_to_display = newtext     ####     ##### Start updating the text     ####update_text()     oldval=\"\"     def SplitTextToParts(text, max_length=150):         result = \"\"         resultmas = []         k = 0         for i, char in enumerate(text):             k += 1             result += char              if (k >= max_length * 0.85):                 if char in \" .!?\":                     k = max_length              if (k >= max_length):                 # print('4o ',k,max_length,resultmas)                 resultmas.append(result.strip())                 result = \"\"                 k = 0             elif (i == len(text) - 1):                 resultmas.append(result)         return resultmas     def generate_text_shawdow(outline_color = '#000000',glow_color = '#ff5cef'):#outline_color = '#000000',glow_color = '#ff5cef'         return f\"\"\"&lt;style type=\"text\/css\"> .OutlineText {{     text-shadow:     \/* Outline 1 \u0447\u0435\u0440\u043d\u044b\u0439 *\/     -1px -1px 0 {outline_color},     1px -1px 0 {outline_color},     -1px 1px 0 {outline_color},     1px 1px 0 {outline_color},       -2px 0 0 {outline_color},     2px 0 0 {outline_color},     0 2px 0 {outline_color},     0 -2px 0 {outline_color},      \/* Outline 2 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 #ff0000 \u0440\u043e\u0437\u043e\u0432\u044b\u0439 #ff5cef *\/     -2px -2px 0 {glow_color},     2px -2px 0 {glow_color},     -2px 2px 0 {glow_color},     2px 2px 0 {glow_color},       -3px 0 0 {glow_color},     3px 0 0 {glow_color},     0 3px 0 {glow_color},     0 -3px 0 {glow_color}; }} &lt;\/style>\"\"\"     mood_list = [0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0]     import GPUtil      @app.route('\/info\/')     def systeminfo():         def inner():             mood = round(ctx.mood,2)             if(mood_list[9] != mood and mood_list[10]==0):                 old_mood = mood_list[9]                 mood_list[9] = mood                 mood_subtract = mood - old_mood                 mood_part = mood_subtract\/10                 #print('web debug',old_mood,mood,mood_subtract,mood_part,'\\n',mood_list)                 for i in range(0,9):                     mood_list[i]=old_mood+(i*mood_part)                 mood_list[10]=0             mood = round(mood_list[mood_list[10]],2)             if mood_list[10]>=9:                 mood_list[10] = 0                 refresh_time = 1             else:                 refresh_time = 0.1                 mood_list[10] = mood_list[10] + 1             red,green,blue = 255,255,255             emoji = \"?\"             if mood>=0.25:                 lol = int(clamp(25+(mood \/\/ 0.039),0,255)) #green                 red-=lol                 blue-=lol                 emoji = \"?\"             elif mood&lt;=-0.25:                 lol = int(clamp(25+((-mood) \/\/ 0.039), 0, 255)) #red                 green-=lol                 blue-=lol                 emoji = \"?\"             #print('rgb',red,green,blue)             GPUs = GPUtil.getGPUs()             #gpu_load = \"0%\"             #if len(GPUs) > 0:             #    gpu = GPUs[0]             #    #print(gpu,gpu.load,gpu.name,gpu.memoryUtil)             #    gpu_load = \"{:.0%}\".format(gpu.load)             yield f\"\"\"&lt;head> &lt;title>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0435&lt;\/title> {generate_text_shawdow(glow_color=\"rgba(\"+str(red)+\",\"+str(green)+\",\"+str(blue)+\",100)\")} &lt;\/head> &lt;body style=\"font-size:25pt; color:rgba(255,255,255,100); text-align:left; vertical-align:up\"; align=\"center\"> &lt;font face=\"Minecraft Rus\">  &lt;div class=\"OutlineText\"> &lt;p>{emoji+\" \"+str(mood)}&lt;\/p> &lt;\/div> &lt;\/body> \"\"\"             #?             #green 255 10 0 0 0.039             #red 255 -10 0 0             yield f\"\"\"&lt;meta http-equiv=\"refresh\" content=\"{str(refresh_time)}\">\"\"\"         return flask.Response(inner(), mimetype='text\/html')  # text\/html is required for most browsers to show th$      @app.route('\/')     @app.route('\/subtitles\/')     def index():         def inner():             if(SubtText.value!=\"\" or len(screenPrintMas)!=0):                 speed = TextDisplaySpeed.value                 inp = SubtText.value                        #color:rgba(255,6,132,100); \u0441\u0438\u0440\u0435\u043d\u0435\u0432\u044b\u0439                 #yield \"\"\"&lt;head> &lt;link rel=\"stylesheet\" href='\/templates\/static\/main.css' \/> &lt;\/head> &lt;body style=\"font-size:33pt; color:rgba(255,255,255,100); text-align:center; vertical-align:bottom\"; align=\"center\"> &lt;font face=\"Impact\">\"\"\" #align=\"center\"                 yield \"\"\" &lt;head> &lt;meta http-equiv=\"Content-Type\" content=\"text\/html; charset=utf-8\" \/> &lt;title>\u0421\u0443\u0431\u0442\u0438\u0442\u0440\u044b&lt;\/title>\"\"\"                 yield generate_text_shawdow()#align=\"center\"                 yield \"\"\"&lt;\/head> &lt;body style=\"font-size:33pt; color:rgba(255,255,255,100); text-align:center; vertical-align:bottom\"; align=\"center\"> &lt;font face=\"Impact\"> &lt;div class=\"OutlineText\">\"\"\"                 if inp and len(screenPrintMas)==0:                     screenPrintMas.extend(SplitTextToParts(inp, 80))                  if len(screenPrintMas)>0: #if inp \u044d\u0442\u043e \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u0447\u0442\u043e inp!=\"\"                     inp = screenPrintMas.pop(0)                     punktEnd = \"!?.\"                     if speed == \"fast\":                         mult = 1                     elif speed == \"x-fast\":                         mult = 0.7                     elif speed == \"medium\":                         mult = 1.3                     elif speed == \"slow\":                         mult = 1.7                     elif speed == \"x-slow\":                         mult = 2.0                      for i,symbol in enumerate(inp):                         waittime = 0.04*mult                         if symbol == \" \":                             waittime = 0.06*mult                         elif symbol == \",\":                             waittime = 0.2*mult                         elif punktEnd.find(symbol) != -1:                             waittime = 0.4*mult                         #print(symbol,end='', flush=True)                         yield symbol#+'&lt;br\/>\\n'                         if not (i >= (len(inp)-1)): #\u043d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435                             time.sleep(waittime)                 yield \"\"\"&lt;\/div> &lt;\/body>\"\"\"                 if len(screenPrintMas)!=0:                     refreshtime=0.1                 else:                     refreshtime=1.4                 yield f\"\"\"&lt;meta http-equiv=\"refresh\" content=\"{str(refreshtime)}\">\"\"\" #print_subtitles(SubtText.value,TextDisplaySpeed.value,True)\/10                 SubtText.value = \"\"             else:                 yield f\"\"\"&lt;meta http-equiv=\"refresh\" content=\"0.1\">\"\"\"             #if(SubtText.value)!=oldval:             #    yield SubtText.value+'&lt;br\/>\\n'             #    oldval = SubtText.value             #else:             #    yield SubtText.value+'&lt;br\/>\\n'             #for line in iter(proc.stdout.readline,''):             #for line in SubtText.value:             #    time.sleep(0.03)                           # Don't need this just shows the text streaming             #    yield line#.rstrip() + '&lt;br\/>\\n'              return flask.Response(inner(), mimetype='text\/html')  # text\/html is required for most browsers to show th$     app.run()<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043d\u0435\u0441\u0451\u043c \u044d\u0442\u043e \u0432 \u0441\u0446\u0435\u043d\u0443 \u0441\u0430\u043c\u043e\u0433\u043e obs \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<figure class=\"float\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/41a\/5ac\/5b6\/41a5ac5b619fb9ac55f324f2d6148668.png\" alt=\"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432\" title=\"\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432\" width=\"512\" height=\"512\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/41a\/5ac\/5b6\/41a5ac5b619fb9ac55f324f2d6148668.png\"\/><\/p>\n<div><figcaption>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<p><strong>\u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u044b.<\/strong> <em>\u0412\u0430\u0436\u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c, \u0447\u0442\u043e Flask-\u0447\u0430\u0441\u0442\u044c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u043b\u0438\u0431\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043d\u043e \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u043c \u0434\u043b\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435.<\/em><\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u043b\u044f \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0432 OBS<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041e\u043a\u043d\u043e \u0441 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u0430\u043c\u0438:<code>http:\/\/localhost:5000\/subtitles\/<\/code><\/p>\n<p>\u041e\u043a\u043d\u043e \u0441 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430\u043c\u0438:<code>http:\/\/localhost:5000\/info\/<\/code><\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 OBS \u0438\u0437 Python-\u0441\u043a\u0440\u0438\u043f\u0442\u0430:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 OBS_WS.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">from obswebsocket import obsws, events, requests  class OBS_Websocket():     host = \"localhost\"     port = 4455     password = \"\u041f\u0410\u0420\u041e\u041b\u042c \u0412 WEBSOCKET OBS, \u0412\u041a\u041b\u042e\u0427\u0418\u0422\u0415 \u0415\u0413\u041e \u0422\u0410\u041c \u0414\u041b\u042f \u041d\u0410\u0427\u0410\u041b\u0410\"     connected = False     ws = None      def check_connection(self):         if not self.connected:             try:                 self.ws = obsws(self.host, self.port, self.password)                 self.ws.connect()                 self.connected = True                 return True             except BaseException as err:                 print('[OBS WS CONNECT ERR]',err)                 self.connected = False                 return False         else:             return True      def call_get(self, request):         try:             result = self.ws.call(request)             return dict(result.datain)         except BaseException as err:             print('[OBS WS REQ GET ERR]', err)             self.connected = False             return None      def call(self, request):         try:             self.ws.call(request)             return True         except BaseException as err:             print('[OBS WS REQ SIMPLE ERR]', err)             self.connected = False             return False      def get_stream_status(self) -> dict:         if self.check_connection():             stream_status = self.call_get(requests.GetStreamStatus())             if stream_status is not None:                 return stream_status         return {\"outputActive\": False}     #https:\/\/github.com\/obsproject\/obs-websocket\/blob\/master\/docs\/generated\/protocol.md#getstreamstatus     # outputActive outputReconnecting outputTimecode outputDuration outputCongestion outputBytes outputSkippedFrames outputTotalFrames      def set_scene(self, scene_name:str) -> bool: #NetTyanChat NetTyan NetTyan NetTyanDisclaimer         if self.check_connection():             return self.call(requests.SetCurrentProgramScene(sceneName=scene_name))      def set_record(self, enable:bool) -> bool:         if self.check_connection():             if enable:                 return self.call(requests.StartRecord())             else:                 return self.call(requests.StopRecord())      def set_stream(self, enable:bool) -> bool:         if self.check_connection():             if enable:                 return self.call(requests.StartStream())             else:                 return self.call(requests.StopStream())<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u043c\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u043c\u0438 Youtube, Twitch&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u0447\u0430\u0442\u043e\u0432 \u043f\u0440\u044f\u043c\u044b\u0445 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0439 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044e \u043d\u0430 \u043f\u043e\u0440\u0442\u0430\u043b\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u0445 Youtube (\u0442\u0430\u043c \u0440\u0443\u043b\u0438\u0442 <a href=\"https:\/\/console.cloud.google.com\/apis\" rel=\"noopener noreferrer nofollow\">Google Cloud API<\/a>) \u0438 <a href=\"https:\/\/dev.twitch.tv\/console\" rel=\"noopener noreferrer nofollow\">dev.twitch<\/a>. \u0414\u043e \u043a\u0443\u0447\u0438 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u044f \u0440\u0435\u0433\u0430\u043b \u0435\u0449\u0451 \u0438 <a href=\"https:\/\/developer.trovo.live\/\" rel=\"noopener noreferrer nofollow\">Trovo<\/a>, \u043f\u0440\u0430\u0432\u0434\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043e\u0442\u0442\u0443\u0434\u0430 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e \u0441\u043e\u0432\u0441\u0435\u043c, \u0431\u044b\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u0430\u043a \u0438 \u0441\u0435\u0439\u0447\u0430\u0441, \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c-\u0442\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u0430. <span class=\"habrahidden\">\u0425\u043e\u0442\u044f \u043e\u0431\u0438\u0434\u043d\u043e, \u0432\u0435\u0434\u044c \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441 \u043d\u0443\u043b\u044f \u0446\u0435\u043b\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0435\u0439, \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f, \u0447\u0442\u043e \u043d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435 \u0431\u044b\u043b\u043e \u0434\u0430\u0436\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0430\u0442\u043e\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Python&#8230; \u0425\u043c, \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043d\u0430 GitHub, \u0432\u0434\u0440\u0443\u0433 \u043a\u043e\u043c\u0443 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f?<\/span><\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 Social_YT.py<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import requests import json import threading import os # pip install python-dotenv from dotenv import load_dotenv # pip install google-auth-oauthlib # pip install google-api-python-client from google_auth_oauthlib.flow import InstalledAppFlow import random from googleapiclient.discovery import build import traceback  print('imported AI YT0') def eztime():     return datetime.now().strftime('%Y-%m-%d %H:%M:%S')   def tm(x):     return datetime.strptime(x, '%Y-%m-%d %H:%M:%S')   print('imported AI YT01')   def YoutubeChatListener(ctx, twitch_actions_queue, trovo_actions_queue, ctx_chat):     print('0[PRE PRE PRE INIT YT + TWITCH] yt listener start....')     load_dotenv()     print('[PRE PRE PRE INIT YT + TWITCH] yt listener start....')      def CheckApp(youtube):         if youtube is None and ctx.YouTubeAppEnabled:             youtube = AuthorizeApp()         return youtube      def AuthorizeApp():         file = \"zHyperAI_Social\/youtube\/client_secret.json\"         flow = InstalledAppFlow.from_client_secrets_file(file, scopes={             'openid',             'https:\/\/www.googleapis.com\/auth\/userinfo.email',             'https:\/\/www.googleapis.com\/auth\/userinfo.profile',             'https:\/\/www.googleapis.com\/auth\/youtube',             'https:\/\/www.googleapis.com\/auth\/youtube.force-ssl',             'https:\/\/www.googleapis.com\/auth\/youtube.readonly',         })         flow.run_local_server(             host='localhost',             port=5500,             authorization_prompt_message=\"\")         credentials = flow.credentials         # Building the youtube object:         youtube = build('youtube', 'v3', credentials=credentials)          # Settings         _delay = 1          # https:\/\/github.com\/shieldnet\/Youtube-livestream-api-bot\/blob\/master\/youtubechat\/ytchat.py         # delete ban          # https:\/\/github.com\/nategentile\/ban_youtube_bots\/blob\/main\/main.py         return youtube      youtube = None     liveChatId = None      def getLiveChatId(yt_liveChatId, LIVE_STREAM_ID):         nonlocal youtube         \"\"\"         It takes a live stream ID as input, and returns the live chat ID associated with that live stream          LIVE_STREAM_ID: The ID of the live stream         return: The live chat ID of the live stream.         \"\"\"         if yt_liveChatId is None and ctx.YouTubeAppEnabled:             stream = youtube.videos().list(                 part=\"liveStreamingDetails\",                 id=LIVE_STREAM_ID,  # Live stream ID             )              yt_response = stream.execute()             # print(\"\\nLive Stream Details:  \", json.dumps(response, indent=2))              yt_liveChatId = yt_response['items'][0]['liveStreamingDetails']['activeLiveChatId']             print(\"\\nLive Chat ID: \", yt_liveChatId)         return yt_liveChatId      # Access user's channel Name:     def getUserName(userId):         \"\"\"         It takes a userId and returns the userName.          userId: The user's YouTube channel ID         return: User's Channel Name         \"\"\"         channelDetails = youtube.channels().list(             part=\"snippet\",             id=userId,         )         yt_response = channelDetails.execute()         # print(json.dumps(response, indent=2))         userName = yt_response['items'][0]['snippet']['title']         return userName      def yt_execute(yt_snippet):         try:             response = yt_snippet.execute()             return response         except BaseException as err:             print('[YT ERR] err while executing:', err)             return False      def yt_exec(yt_snippet):         response = yt_execute(yt_snippet)         if response is False:             print('[YT ERR EXEC] \u043f\u0440\u043e\u0432\u0430\u043b\u0435\u043d\u0430 1 \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441, \u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043d\u043e\u0432\u0430')             response = yt_execute(yt_snippet)         return response      # print(getUserName(\"UC0YXSy_J8uTDEr7YX_-d-sg\"))     def tempban(yt_liveChatId, channel_id, timee=10):         nonlocal youtube         print('\u0434\u043e \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u0431\u0430\u043d\u0430')         ban = youtube.liveChatBans().insert(             part=\"snippet\",             body={                 \"snippet\": {                     \"liveChatId\": yt_liveChatId,                     \"type\": \"temporary\",                     \"banDurationSeconds\": timee,                     \"bannedUserDetails\": {                         \"channelId\": str(channel_id)                     }                 }             }         )         print(\"[YT LIVECHAT] BAN TO 4ell sent!\", yt_exec(ban))      def sendReplyToLiveChat(yt_liveChatId, message):         nonlocal youtube         \"\"\"         It takes a liveChatId and a message, and sends the message to the live chat.          liveChatId: The ID of the live chat to which the message should be sent         message: The message you want to send to the chat         \"\"\"         if not isinstance(message, str):             message = \"[AI] \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044e [\u042d\u0422\u0410\u041f4].\"         if len(message) >= 200:             print('[YOUTUBE LIVECHAT] \u0414\u041b\u0418\u041d\u0410 \u0421\u041e\u041e\u0411\u0429\u0415\u041d\u0418\u042f \u041f\u0415\u0420\u0412\u042b\u0421\u0418\u041b\u041e \u041c\u0410\u041a\u0421\u0418\u041c\u0423\u041c!', len(message))             message = message[0:150]         reply = youtube.liveChatMessages().insert(             part=\"snippet\",             body={                 \"snippet\": {                     \"liveChatId\": yt_liveChatId,                     \"type\": \"textMessageEvent\",                     \"textMessageDetails\": {                         \"messageText\": message,                     }                 }             }         )         print(\"[YT CHAT BOT] Send message response:\", yt_exec(reply))      def getYoutubeUserId(YOUTUBE_STREAM_API_KEY, YouTubeName):         channel_ids = requests.get(             f'https:\/\/www.googleapis.com\/youtube\/v3\/search?part=id&amp;q={YouTubeName}&amp;type=channel&amp;key={YOUTUBE_STREAM_API_KEY}').json()[             'items']         if len(channel_ids) > 0:             channel_id = channel_ids[0]['id']['channelId']             return channel_id         return None      # import time      # pip install pytchat     # Set API key and YouTube video ID     # \u0434\u043e\u0431\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u0443\u0433\u043b \u043a\u043b\u0430\u0443\u0434\u0435 https:\/\/console.cloud.google.com\/apis\/     from zHyperAI_Social.SocialConfigs import YOUTUBE_STREAM_API_KEY      # Set YouTube channel ID \u041a\u0410\u041d\u0410\u041b \u041e\u0422\u041a\u0423\u0414\u0410 \u0411\u0415\u0420\u0415\u041c \u0421\u0422\u0420\u0418\u041c. ID \u043a\u0430\u043d\u0430\u043b\u0430 \u0443\u0437\u043d\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0434 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0438\u0441\u043a channel id     # [TEST] The Good Life Radio x Sensual Musique https:\/\/www.youtube.com\/channel\/UChs0pSaEoNLV4mevBFGaoKA     from zHyperAI_Social.SocialConfigs import CHANNEL_ID           # Get channel information     # \u0447\u0438\u0441\u0442\u043e url \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u0430\u043d\u0430\u043b\u0430 \u0438 \u0435\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0438\u043a\u043e\u043d\u043a\u0438 \u0438 \u0442 \u0434     # url = f\"https:\/\/www.googleapis.com\/youtube\/v3\/channels?part=snippet%2CcontentDetails%2Cstatistics&amp;id={CHANNEL_ID}&amp;key={API_KEY}\"      # \u044e\u0440\u043b \u0441\u0442\u0440\u0438\u043c\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e      YoutubeStreamURL = f\"https:\/\/www.googleapis.com\/youtube\/v3\/search?part=snippet&amp;channelId={CHANNEL_ID}&amp;eventType=live&amp;type=video&amp;key={YOUTUBE_STREAM_API_KEY}\"       from twitchAPI import Twitch     from twitchAPI.oauth import UserAuthenticator     from twitchAPI.types import AuthScope, ChatEvent     from twitchAPI.chat import Chat, EventData, ChatMessage, ChatSub, ChatCommand     import asyncio      from zHyperAI_Social.SocialConfigs import TWITCH_APP_ID, TWITCH_APP_SECRET, TWITCH_TARGET_CHANNEL      TWITCH_USER_SCOPE = [AuthScope.CHAT_READ, AuthScope.CHAT_EDIT]          twitch_chat = None      async def twitch_chat_reply(ninp: str):         nonlocal twitch_chat         try:             await twitch_chat.send_message(TWITCH_TARGET_CHANNEL, ninp)         except BaseException as err:             print('[TWITCH LIVECHAT ERR] \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435', ninp, '\u0432 twitch chat \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e', err)      async def on_ready(ready_event: EventData):         print('[TWTICH BOT LOAD] Bot is ready for work, joining channels')          await ready_event.chat.join_room(TWITCH_TARGET_CHANNEL)         await twitch_chat_reply(             f\"[AI] [CONNECTED->{datetime.now().strftime('%M:%S')}] \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d twitch! \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 =)\")      async def on_message(msg: ChatMessage):         twitch_username = msg.user.name         # print(f'[TWITCH CHAT {msg.room.name}] {msg.user.name}: {msg.text}')         msg = {\"env\": \"twitch\", \"msg\": msg.text, \"user\": twitch_username,                \"processing_timestamp\": time.time_ns(), \"date\": eztime()}         # pre, rank, user, msg, clan, team, server, serverMode, chat_type, precision         if twitch_username in ctx.botNicknames:             print('[YT] \u0412\u0441\u0442\u0440\u0435\u0447\u0435\u043d\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435', msg[\"user\"], '\u0432\u043d\u043e\u0441\u0438\u043c \u0432 \u0431\u0430\u0437\u0443', msg[\"msg\"])             # ctx_chatOwn.append(msg)             ###ctx_chatOwn = ctx_chatOwn + [msg]             # ctx.LastMineChatInteract = datetime.now()         else:             print(f\"[{datetime.now().strftime('%H:%M:%S')}] [TWITCH CHAT]\", msg[\"user\"], '>',                   msg[\"msg\"])             ctx_chat.append(msg)      # this will be called whenever someone subscribes to a channel \u041f\u041b\u0410\u0422\u041d\u0410\u042f \u041f\u041e\u0414\u041f\u0418\u0421\u041a\u0410     async def on_sub(sub: ChatSub):         print(f'[TWITCH +SUB] New subscription in {sub.room.name}, type: {sub.sub_plan}, msg: {sub.sub_message}')      # this will be called whenever the !reply command is issued     async def test_command(cmd: ChatCommand):         if len(cmd.parameter) == 0:             await cmd.reply('you did not tell me what to reply with')         else:             await cmd.reply(f'{cmd.user.name}: {cmd.parameter}')      async def run_twitch_bot():         nonlocal twitch_chat         twitch = await Twitch(TWITCH_APP_ID, TWITCH_APP_SECRET)         auth = UserAuthenticator(twitch, TWITCH_USER_SCOPE)         token, refresh_token = await auth.authenticate()         await twitch.set_user_authentication(token, TWITCH_USER_SCOPE, refresh_token)         # await twitch.set_user_authentication('vi4veb8whrz6uacio4ilj9pmkrimk3', TWITCH_USER_SCOPE, ) #access token \u043f\u043e\u0441\u043b\u0435 \u0440\u0443\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430         twitch_chat = await Chat(twitch)         twitch_chat.register_event(ChatEvent.READY, on_ready)         twitch_chat.register_event(ChatEvent.MESSAGE, on_message)         twitch_chat.register_event(ChatEvent.SUB, on_sub)         # you can directly register commands and their handlers, this will register the !reply command         twitch_chat.register_command('reply', test_command)         twitch_chat.start()         # \u0417\u0410\u041a\u0420\u042b\u0422\u0418\u0415!         # chat.stop()         # await twitch.close()      # lets run our setup     # asyncio.run(run_twitch_bot())     print('\u041d\u0410\u0427\u0418\u041d\u0410\u0415\u041c \u0427\u0415\u041a\u0410\u0422\u042c \u042e\u0422\u0423\u0411...')      def twitch_actions_executor_func():         while True:             if twitch_chat is not None:                 t_act_inp = twitch_actions_queue.get()                 t_act = t_act_inp.get(\"action\", \"\")                 try:                     if t_act == \"reply\":                         asyncio.run(twitch_chat_reply(\"[AI] \" + t_act_inp.get(\"msg\", \"\u043f\u0443\u0441\u0442\u043e\u0442\u0430\")))                         time.sleep(1)                     # elif t_act == \"ban\":                     #    if channel_id:                     #        print('user', channel_id)                     #        tempban(liveChatId, channel_id=channel_id,                     #                timee=t_act_inp.get(\"bantime\", 20))                     #        time.sleep(1)                     #    else:                     #        print(\"\u0411\u0410\u041d \u041d\u0415 \u0412\u042b\u0414\u0410\u041d \u0422\u0410\u041a \u041a\u0410\u041a \u041d\u0415 \u0421\u041e\u041e\u0411\u0429\u0415\u041d\u041e ID\")                 except BaseException as err:                     print('TWICH action print queue err, q=', t_act)                     print('\u041e\u0428\u0418\u0411\u041a\u0410 \u0412\u042b\u0412\u041e\u0414\u0410 \u0412 \u0427\u0410\u0422 TWITCH! ', err)                     print('\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())             time.sleep(1)      def run_twitch_bot_func():         asyncio.run(run_twitch_bot())         tt = threading.Thread(target=twitch_actions_executor_func, daemon=True)         tt.start()      print('LELL')     t = threading.Thread(target=run_twitch_bot_func, daemon=True)     # loop = asyncio.get_event_loop()     # loop.run_until_complete(run_twitch_bot())      #     twitch_started = False     # \u0432\u044b\u0448\u0435 \u0442\u0430\u043a \u0431\u044b\u043b\u043e     # \u0430 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0442\u0430\u043b\u043e \u0442\u043a \u0442\u0435\u0441\u0442 \u043d\u0430\u0434\u043e \u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c      # t.start()     # twitch_started = True     from zHyperAI_Social.TrovoClient import trovo_client_thread     print('STARTING YT CHECKER! 00')     trovo_started = False     trovo_thread = trovo_client_thread(ctx_chat, trovo_actions_queue)     print('STARTING YT CHECKER! 01')     while ctx.ThreadsActived:         if ctx.YouTubeCommentCheckerEnabled:             print('[PRE INIT YT] \u0432\u043a\u043b\u044e\u0447\u0438\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442 \u0447\u0435\u043a\u0435\u0440? \u0432\u0445\u043e\u0434 \u0432 \u0432\u0435\u0442\u043a\u0443 \u044e\u0442\u0443\u0431\u0430 \u0438 \u0442\u0432\u0438\u0447\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e')             if not trovo_started:                 try:                     trovo_thread.start()                 except BaseException as err:                     print('[TROVO]\u041e\u0428\u0418\u0411\u041a\u0410 \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u042f! TROVO BOT! ', err)                     print('[TROVO]\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                     print(\"\\n[TROVO]=== \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")                 trovo_started = True              if not twitch_started:                 try:                     t.start()                  except BaseException as err:                     print('[TWITCH]\u041e\u0428\u0418\u0411\u041a\u0410 \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u042f! TWITCH BOT! ', err)                     print('[TWITCH]\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                     print(\"\\n[TWITCH]=== \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")                     twitch_error = True                 twitch_started = True             try:                 print('[PRE INIT YT] COMMENT CHECHING ENABLED!!! RUNNING TWITCH BOT...')                  print('[PRE INIT YT] TWITCH INIT ENDED! RUNNING YT BOT...')                 response = requests.get(YoutubeStreamURL)                 print(response)                 streams = json.loads(response.text).get('items', [])                 chat = None                 VIDEO_ID = None                 liveChatId = None                 print('YT>> \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0437\u0430\u043f\u0440\u043e\u0441 \u043a \u043a\u0430\u043d\u0430\u043b\u0443 \u044e\u0442\u0443\u0431...')                 if (len(streams) > 0):                     firstStream = streams[0]                     VIDEO_ID = firstStream['id']['videoId']                     print('YT>>\u0441\u0442\u0440\u0438\u043c \u043d\u0430\u0439\u0434\u0435\u043d \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d. ', firstStream)                     chat = pytchat.LiveChat(video_id=VIDEO_ID)                     StreamActived = True                     youtube = CheckApp(youtube)                     liveChatId = getLiveChatId(liveChatId, VIDEO_ID)                     # https:\/\/github.com\/taizan-hokuto\/pytchat\/wiki\/LiveChat                 else:                     StreamActived = False                     time.sleep(10)                     print('YT>>ERR>> \u043d\u0430 \u043a\u0430\u043d\u0430\u043b\u0435 \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u043d\u0435\u0442 \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442')                 while ctx.YouTubeCommentCheckerEnabled and StreamActived and chat is not None and chat.is_alive():                     answered = False                     try:                         if len(ctx.YoutubeActionsQueue) > 0:                             if ctx.YouTubeAppEnabled:                                 q = ctx.YoutubeActionsQueue[0]                                 youtube = CheckApp(youtube)                                 if liveChatId is not None and VIDEO_ID is not None:                                     liveChatId = getLiveChatId(liveChatId, VIDEO_ID)                                 if youtube is not None and liveChatId is not None:                                     act = q.get(\"action\", \"\")                                     try:                                         if act == \"reply\":                                             sendReplyToLiveChat(liveChatId, \"[AI] \" + q.get(\"msg\", \"\u043f\u0443\u0441\u0442\u043e\u0442\u0430\"))                                             time.sleep(1)                                         elif act == \"ban\":                                             # if q.get(\"ytname\", None) is not None:                                             #   channel_id = getYoutubeUserId(YOUTUBE_STREAM_API_KEY,q.get(\"ytname\"))                                             channel_id = q.get(\"youtube_user_channel_id\", None)                                              if channel_id:                                                 print('ban channel_id', channel_id)                                                 tempban(liveChatId, channel_id=channel_id,                                                         timee=q.get(\"bantime\", 20))                                                 time.sleep(1)                                             else:                                                 print(\"\u0411\u0410\u041d \u041d\u0415 \u0412\u042b\u0414\u0410\u041d \u0422\u0410\u041a \u041a\u0410\u041a \u041d\u0415 \u0421\u041e\u041e\u0411\u0429\u0415\u041d\u041e ID\")                                     except BaseException as err:                                         print('youtube action print queue err, q=', q)                                         print('\u041e\u0428\u0418\u0411\u041a\u0410 \u0412\u042b\u0412\u041e\u0414\u0410 \u0412 \u0427\u0410\u0422 \u042e\u0422\u0423\u0411\u0410! ', err)                                         print('\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                                 time.sleep(0.2)                                 ctx.YoutubeActionsQueue.pop(0)                                 answered = True                     except BaseException as err:                         if not answered and len(ctx.YoutubeActionsQueue) > 0:                             ctx.YoutubeActionsQueue.pop(0)                         print('\u041e\u0428\u0418\u0411\u041a\u0410 \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u042f! \u041f\u041e\u0425\u041e\u0416\u0415 \u0421\u0422\u0420\u0418\u041c \u0417\u0410\u041a\u041e\u041d\u0427\u0418\u041b\u0421\u042f1! ', err)                         print('\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                         print(\"\\n=== \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")                         ctx.IsYTChatConnected = False                         time.sleep(3)                     try:                         data = chat.get()                          items = data.items                         # print(\"lol\", items,chat)                         # \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u0447\u0430\u0442\u0435                         for c in items:                             # getYoutubeUserId(YOUTUBE_STREAM_API_KEY,c.author.name)                             if c.message == \"!hello lol\":                                 ctx.YoutubeActionsQueue.append({\"action\": \"reply\", \"msg\": \"hello\" + c.author.name})                             ytname = c.author.name                             # print(f\"YT>>{c.datetime} [{col(str(thissrank))}|{col(ytname)}] {col(c.message, 'yellow')}\")                             msg = {\"env\": \"youtube\", \"msg\": c.message, \"user\": ytname,                                    \"youtube_user_channel_id\": c.author.channelId,                                    \"youtube_moderator\": c.author.isChatModerator,                                    \"processing_timestamp\": time.time_ns(),                                    \"date\": eztime()}                             # pre, rank, user, msg, clan, team, server, serverMode, chat_type, precision                             if (msg[\"user\"] in ctx.botNicknames):                                 print('[YT] \u0412\u0441\u0442\u0440\u0435\u0447\u0435\u043d\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435', msg[\"user\"], '\u0432\u043d\u043e\u0441\u0438\u043c \u0432 \u0431\u0430\u0437\u0443', msg[\"msg\"])                                 # ctx_chatOwn.append(msg)                                 ###ctx_chatOwn = ctx_chatOwn + [msg]                                 # ctx.LastMineChatInteract = datetime.now()                             else:                                 print(f\"[{datetime.now().strftime('%H:%M:%S')}] [YOUTUBE CHAT]\", msg[\"user\"], '>',                                       msg[\"msg\"])                                 ctx_chat.append(msg)                          ctx.IsYTChatConnected = True                         time.sleep(2)                     except BaseException as err:                         print('2\u041e\u0428\u0418\u0411\u041a\u0410 \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u042f! \u041f\u041e\u0425\u041e\u0416\u0415 \u0421\u0422\u0420\u0418\u041c \u0417\u0410\u041a\u041e\u041d\u0427\u0418\u041b\u0421\u042f2! ', err)                         print('\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                         print(\"\\n=== \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")                         ctx.IsYTChatConnected = False                         time.sleep(10)             except BaseException as err:                 print('1\u041e\u0428\u0418\u0411\u041a\u0410 \u041f\u041e\u0414\u041a\u041b\u042e\u0427\u0415\u041d\u0418\u042f! \u041f\u041e\u0425\u041e\u0416\u0415 \u0421\u0422\u0420\u0418\u041c \u0417\u0410\u041a\u041e\u041d\u0427\u0418\u041b\u0421\u042f111! ', err)                 print('\u0422\u0415\u041a\u0421\u0422 \u041e\u0411***\u0419 \u041e\u0428\u0418\u0411\u041a\u0418', traceback.format_exc())                 print(\"\\n=== \u041a\u041e\u041d\u0415\u0426 \u041e\u0428\u0418\u0411\u041a\u0418 ====\")                 ctx.IsYTChatConnected = False                 time.sleep(10)         time.sleep(0.1)<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u044f \u043c\u0443\u0447\u0438\u043b\u0441\u044f \u0441 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439, \u0442.\u043a. \u0442\u043e\u043b\u044c\u043a\u043e <abbr class=\"habraabbr\" title=\"\u0414\u0432\u0443\u0445\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u043d\u0442\u0435\u0444\u0438\u043a\u0430\u0446\u0438\u044f\" data-title=\"&lt;p>\u0414\u0432\u0443\u0445\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u0430\u044f \u0430\u0443\u043d\u0442\u0435\u0444\u0438\u043a\u0430\u0446\u0438\u044f&lt;\/p>&#187; data-abbr=&#187;2FA&#187;>2FA<\/abbr> \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0447\u0430\u0442 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445&#8230;<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u043e STT (\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 Discord)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0417\u0430\u0439\u043c\u0451\u043c\u0441\u044f \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435\u043c \u0440\u0435\u0447\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 Nvidia NEMO. \u0412\u044b\u0434\u0435\u043b\u0438\u043c \u043c\u0435\u0442\u043e\u0434 \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u044f, \u0433\u0434\u0435 \u043d\u0430 \u0432\u0445\u043e\u0434 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0430\u0442\u044c \u0431\u0430\u0439\u0442\u044b \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0430 \u043d\u0435 \u0444\u0430\u0439\u043b\u044b, \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0435\u0433\u043e \u0432 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u0421\u043a\u0440\u0438\u043f\u0442 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0437 Docker-\u0447\u0430\u0441\u0442\u0438, \u0433\u0434\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u00ab\u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u0442\u0435\u043b\u044e\u00bb \u0443 \u043c\u0435\u043d\u044f \u0431\u044b\u043b\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e <a href=\"#Docker_reciever\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0448\u0435<\/a>.<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043e\u0434\u043e\u043f\u043e\u043c\u043e\u0439\u043a\u0430 NemoSpeechTranscriber (stream_stt_inf.py, Docker-\u0447\u0430\u0441\u0442\u044c)<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">import contextlib import io import json import os import time from argparse import ArgumentParser from dataclasses import dataclass import numpy as np import soundfile import torch from omegaconf import open_dict  from nemo.collections.asr.parts.utils.rnnt_utils import Hypothesis from nemo.collections.asr.parts.utils.streaming_utils import CacheAwareStreamingAudioBuffer from nemo.collections.asr.parts.utils.transcribe_utils import setup_model from nemo.utils import logging   def extract_transcriptions(hyps):     \"\"\"         The transcribed_texts returned by CTC and RNNT models are different.         This method would extract and return the text section of the hypothesis.     \"\"\"     if isinstance(hyps[0], Hypothesis):         transcriptions = []         for hyp in hyps:             transcriptions.append(hyp.text)     else:         transcriptions = hyps     return transcriptions   def calc_drop_extra_pre_encoded(asr_model, step_num, pad_and_drop_preencoded):     # for the first step there is no need to drop any tokens after the downsampling as no caching is being used     if step_num == 0 and not pad_and_drop_preencoded:         return 0     else:         return asr_model.encoder.streaming_cfg.drop_extra_pre_encoded   def perform_streaming(     asr_model, streaming_buffer, compare_vs_offline=False, debug_mode=False, pad_and_drop_preencoded=False, autocast_enabled=True ):     batch_size = len(streaming_buffer.streams_length)     if (autocast_enabled):         logging.info(\"AMP (autocast) enabled!\\n\")         autocast = torch.cuda.amp.autocast     else:         @contextlib.contextmanager         def autocast():             yield     if compare_vs_offline:         # would pass the whole audio at once through the model like offline mode in order to compare the results with the stremaing mode         # the output of the model in the offline and streaming mode should be exactly the same          with torch.inference_mode():             with autocast():                 processed_signal, processed_signal_length = streaming_buffer.get_all_audios()                 with torch.no_grad():                     (                         pred_out_offline,                         transcribed_texts,                         cache_last_channel_next,                         cache_last_time_next,                         cache_last_channel_len,                         best_hyp,                     ) = asr_model.conformer_stream_step(                         processed_signal=processed_signal,                         processed_signal_length=processed_signal_length,                         return_transcription=True,                     )         final_offline_tran = extract_transcriptions(transcribed_texts)         logging.info(f\" Final offline transcriptions:   {final_offline_tran}\")     else:         final_offline_tran = None      cache_last_channel, cache_last_time, cache_last_channel_len = asr_model.encoder.get_initial_cache_state(         batch_size=batch_size     )      previous_hypotheses = None     streaming_buffer_iter = iter(streaming_buffer)     pred_out_stream = None     for step_num, (chunk_audio, chunk_lengths) in enumerate(streaming_buffer_iter):         with torch.inference_mode():             with autocast():                 # keep_all_outputs needs to be True for the last step of streaming when model is trained with att_context_style=regular                 # otherwise the last outputs would get dropped                  with torch.no_grad():                     (                         pred_out_stream,                         transcribed_texts,                         cache_last_channel,                         cache_last_time,                         cache_last_channel_len,                         previous_hypotheses,                     ) = asr_model.conformer_stream_step(                         processed_signal=chunk_audio,                         processed_signal_length=chunk_lengths,                         cache_last_channel=cache_last_channel,                         cache_last_time=cache_last_time,                         cache_last_channel_len=cache_last_channel_len,                         keep_all_outputs=streaming_buffer.is_buffer_empty(),                         previous_hypotheses=previous_hypotheses,                         previous_pred_out=pred_out_stream,                         drop_extra_pre_encoded=calc_drop_extra_pre_encoded(                             asr_model, step_num, pad_and_drop_preencoded                         ),                         return_transcription=True,                     )          if debug_mode:             logging.info(f\"Streaming transcriptions: {extract_transcriptions(transcribed_texts)}\")      final_streaming_tran = extract_transcriptions(transcribed_texts)     logging.info(f\"Final streaming transcriptions: {final_streaming_tran}\")      if compare_vs_offline:         # calculates and report the differences between the predictions of the model in offline mode vs streaming mode         # Normally they should be exactly the same predictions for streaming models         pred_out_stream_cat = torch.cat(pred_out_stream)         pred_out_offline_cat = torch.cat(pred_out_offline)         if pred_out_stream_cat.size() == pred_out_offline_cat.size():             diff_num = torch.sum(pred_out_stream_cat != pred_out_offline_cat).cpu().numpy()             logging.info(                 f\"Found {diff_num} differences in the outputs of the model in streaming mode vs offline mode.\"             )         else:             logging.info(                 f\"The shape of the outputs of the model in streaming mode ({pred_out_stream_cat.size()}) is different from offline mode ({pred_out_offline_cat.size()}).\"             )      return final_streaming_tran, final_offline_tran   from struct import pack, unpack import librosa import soundfile as sf def recover_wav(f):  # \u043d\u0430 \u0412\u0425\u041e\u0414 (Union object io.BytesIO) \u0418\u041b\u0418 (BinaryIO (\u044d\u0442\u043e open(file,'rb+') ) \u0432\u044b\u0434\u0430\u0451\u0442 \u0442\u043e \u0436\u0435 \u0447\u0442\u043e \u0438 \u043d\u0430 \u0412\u0425\u041e\u0414     wav_header = \"4si4s4sihhiihh4si\"     data = list(unpack(wav_header, f.read(44)))     assert data[0] == b'RIFF'     assert data[2] == b'WAVE'     assert data[3] == b'fmt '     assert data[4] == 16     assert data[-2] == b'data'     assert data[1] == data[-1] + 36     f.seek(0, 2)     filesize = f.tell()     datasize = filesize - 44     data[-1] = datasize     data[1] = datasize + 36     f.seek(0)     f.write(pack(wav_header, *data))     return f def prepare_input_audio(f,orig_sr=48000,orig_channels=2):     recover_wav(f)     y, sr = sf.read(f, format='RAW', samplerate=orig_sr, channels=orig_channels, subtype='PCM_16',                     dtype='float32')  # ,subtype='FLOAT' ,dtype='float32',dtype='int16'     f.close()     y = y.transpose()     if orig_channels>1:         y = librosa.core.to_mono(y).T     y = librosa.core.resample(y, orig_sr=sr, target_sr=16000).T     return y def prepare_input_audiofile(audio_file_path,orig_sr=48000,orig_channels=2):     fileOpen = open(audio_file_path, 'rb+')     filee = fileOpen.read()     f = io.BytesIO(filee)     fileOpen.close()     return prepare_input_audio(f,orig_sr=orig_sr,orig_channels=orig_channels)  def save_outstream_to_file(audio,out_audio_path='my_24bit_file.wav'):     sf.write(out_audio_path, audio, 16000) # SAVING FILE #sf.write('my_24bit_file.wav', y, 16000)  voice_recog_model_name = \"stt_ru_fastconformer_hybrid_large_pc\" @dataclass class StreamingRecogArgsConfig:     pad_and_drop_preencoded = False  # would perform the caching for all steps including the first step.     compare_vs_offline = False #You may drop the '--debug_mode' and '--compare_vs_offline' to speedup the streaming evaluation.     # If compare_vs_offline is not used, then significantly larger batch_size can be used.     use_amp = True     device = \"cuda\" #cuda or cpu     chunk_size = 100  # The chunk_size of 100 would be 100*4*10=4000ms for a model with 4x downsampling and 10ms shift in feature extraction.     batch_size = 32     shift_size = -1  # The shift_size to be used for models trained with full context and offline models     left_chunks = 2  # The number of left chunks to be used as left context via caching for offline models     debug_mode = False     autocast_enabled = True           thisfolder = os.path.dirname(os.path.realpath(__file__))           @dataclass class TranscriptionConfig:     model_path = f\"{thisfolder}\/{voice_recog_model_name}\/{voice_recog_model_name}.nemo\"  # Path to a .nemo file     pretrained_name = voice_recog_model_name  # Name of a pretrained model     cuda = -1  def model_init(args,cfg):     logging.info(f\"Using local ASR model from {cfg.model_path}\")     asr_model, model_name = setup_model(cfg, map_location=torch.device(args.device))      #logging.info(asr_model.encoder.streaming_cfg)     if (         args.use_amp         and torch.cuda.is_available()         and hasattr(torch.cuda, 'amp')         and hasattr(torch.cuda.amp, 'autocast')     ):         logging.info(f\"AMP (AUTOCAST) set to {str(args.autocast_enabled)} (in config)!\\n\")     else:         args.autocast_enabled = False     # configure the decoding config     decoding_cfg = asr_model.cfg.decoding     with open_dict(decoding_cfg):         decoding_cfg.strategy = \"greedy\"         decoding_cfg.preserve_alignments = False         if hasattr(asr_model, 'joint'):  # if an RNNT model             decoding_cfg.greedy.max_symbols = 10             decoding_cfg.fused_batch_size = -1         asr_model.change_decoding_strategy(decoding_cfg)      asr_model = asr_model.to(args.device)     asr_model.eval()      # chunk_size is set automatically for models trained for streaming. For models trained for offline mode with full context, we need to pass the chunk_size explicitly.     if args.chunk_size > 0:         if args.shift_size &lt; 0:             shift_size = args.chunk_size         else:             shift_size = args.shift_size         asr_model.encoder.setup_streaming_params(             chunk_size=args.chunk_size, left_chunks=args.left_chunks, shift_size=shift_size         )      streaming_buffer = CacheAwareStreamingAudioBuffer(         model=asr_model,         online_normalization=False,         pad_and_drop_preencoded=args.pad_and_drop_preencoded,     )     return asr_model, streaming_buffer def model_transcribe( asr_model, streaming_buffer,args, audio_samples=None, audio_file=None, audio_settings = None):     start_time = time.time()     logging.info('PERFORMING TRANSCRIBE STREAMING STARTED!')     if audio_settings is None:         audio_settings = {\"sr\":48000,\"channels\":2}     if audio_samples is None and audio_file is None:         print('\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415!!!!! \u0410\u0420\u0413\u0423\u041c\u0415\u041d\u0422\u041e\u0412 \u041d\u0415\u0422!!! \u0417\u0410\u041a\u0420\u042b\u0422\u0418\u0415 \u0422\u0420\u0410\u041d\u0421\u041a\u0420\u0410\u0419\u0411\u0410')         return \"\u0412\u042b \u0414\u0410\u041b\u0418 \u041c\u041d\u0415 \u041f\u0423\u0421\u0422\u041e\u0422\u0423!\"     if audio_file is not None:         audio_samples = prepare_input_audiofile(audio_file, audio_settings[\"sr\"], audio_settings[\"channels\"])     else:         audio_samples = prepare_input_audio(audio_samples, audio_settings[\"sr\"], audio_settings[\"channels\"])     final_streaming_tran = \"\u041d\u0418\u0427\u0415\u0413\u041e \u041d\u0415 \u0420\u0410\u0421\u041f\u041e\u0417\u041d\u0410\u041d\u041e\"     if audio_samples is not None:         streaming_buffer.reset_buffer()         processed_signal, processed_signal_length, stream_id = streaming_buffer.append_audio(audio_samples,                                                                                              stream_id=-1)         final_streaming_tran_mas, _ = perform_streaming(             asr_model=asr_model,             streaming_buffer=streaming_buffer,             compare_vs_offline=args.compare_vs_offline,             pad_and_drop_preencoded=args.pad_and_drop_preencoded,         )         if len(final_streaming_tran_mas)>0:             final_streaming_tran = \"\".join(final_streaming_tran_mas)      end_time = time.time()     logging.info(f\"The whole streaming process took: {round(end_time - start_time, 2)}s\")     return final_streaming_tran  class NemoSpeechTranscriber():     \"\"\"TRANSCRIBER MAIN CLASS\"\"\"      def __init__(self):         self.args = StreamingRecogArgsConfig()         self.cfg = TranscriptionConfig()         self.asr_model = None         self.streaming_buffer = None         self.initialized = False      def check_initialization(self):         if not self.initialized:             logging.info('TRANSCRIBER init...')             start_time = time.time()             self.asr_model, self.streaming_buffer = model_init(self.args, self.cfg)             logging.info(f'TRANSCRIBER init ENDED! Time:{round(time.time() - start_time, 2)}s')             self.initialized = True         return self.initialized      def audio_transcribe(self,audio_samples=None,audio_file=None,audio_settings=None):          result = model_transcribe(audio_samples=audio_samples, audio_file=audio_file, audio_settings=audio_settings,                                   asr_model=self.asr_model, streaming_buffer=self.streaming_buffer, args=self.args)         return result def main_debug():     args = StreamingRecogArgsConfig()     cfg = TranscriptionConfig()      asr_model, streaming_buffer = model_init(args, cfg)     start_time = time.time()     def debugTestAudiofiles():         audiofile_list = [\"test.wav\"]         settings_dict = {\"sr\": 48000, \"channels\": 1}         #audiofile_list = [\"test.wav\",\"test1.wav\",\"test2vloger.wav\",\"test3.wav\",\"test4old.wav\"]         for audiofile in audiofile_list:              result = model_transcribe(audio_samples=None, audio_file=audiofile, audio_settings=settings_dict,                                       asr_model=asr_model, streaming_buffer=streaming_buffer, args=args)             print('\u0420\u0415\u0417\u0423\u041b\u042c\u0422\u0410\u0422 1 \u041e\u041a\u041e\u041d\u0427\u0415\u041d! \u0422\u0420\u0410\u041d\u0421\u041a\u0420\u0418\u041f\u0426\u0418\u042f:',result)      debugTestAudiofiles()     end_time = time.time()     print('\u0412\u0421\u0401 \u0417\u0410\u0412\u0415\u0420\u0428\u0415\u041d\u041e! \u0420\u0415\u0417\u0423\u041b\u042c\u0422\u0410\u0422:',{round(end_time - start_time, 2)},'s')  def file_to_bytes_io(filename):     fileOpen = open(filename, 'rb+')     filee = fileOpen.read()     samples_file = io.BytesIO(filee)     fileOpen.close()     return samples_file if __name__ == '__main__':     transcriber = NemoSpeechTranscriber()     transcriber.check_initialization()<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<\/div>\n<\/details>\n<h3>\u042d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e-\u043b\u0438? \u041c\u044b \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438?<\/h3>\n<p>\u0412\u044b\u0445\u043e\u0434\u0438\u0442, \u0447\u0442\u043e \u0442\u0430\u043a. \u041f\u043e \u0447\u0430\u0441\u0442\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0432\u0441\u0451! \u0421\u0430\u043c \u043d\u0435 \u043c\u043e\u0433\u0443 \u0432 \u044d\u0442\u043e \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u044c&#8230;<\/p>\n<p><a class=\"anchor\" name=\"Summary\" id=\"Summary\"><\/a><\/p>\n<h2>\u041f\u043e\u0434\u0432\u043e\u0434\u0438\u043c \u0438\u0442\u043e\u0433\u0438<\/h2>\n<p>\u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>\u0411\u043e\u043b\u0435\u0435 <em>10 000<\/em> \u0441\u0442\u0440\u043e\u043a <em>\u0431\u0440\u0435\u0434\u043e<\/em>\u043a\u043e\u0434\u0430 (\u0441\u0443\u043c\u043c\u0430 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0443 \u043c\u0435\u043d\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u043a\u043e\u0433\u0434\u0430 \u0441\u0443\u043c\u043c\u0430 \u043f\u0435\u0440\u0435\u0432\u0430\u043b\u0438\u043b\u0430 \u0437\u0430 10-\u043a\u0443)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0437\u0443\u0447\u0435\u043d\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e <em>\u0434\u043e\u0444\u0438\u0433\u0438\u0449\u0430<\/em> \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 ML (NLP, CV, TTS&#8230;)<\/p>\n<\/li>\n<li>\n<p>\u0421 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 (17.02.2023) \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u0433\u043e\u0434\u0430 \u0438 \u0434\u0432\u0443\u0445 \u043c\u0435\u0441\u044f\u0446\u0435\u0432<\/p>\n<\/li>\n<\/ul>\n<p>\u0427\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438:<\/p>\n<ul>\n<li>\n<p>\u0411\u043e\u043b\u0435\u0435 10 \u0431\u0430\u043d\u043e\u0432 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 Minecraft<\/p>\n<\/li>\n<li>\n<p>\u041e\u0444\u0438\u0433\u0435\u043d\u043d\u044b\u0435 \u044d\u043c\u043e\u0446\u0438\u0438 \u0438 \u043a\u0443\u0447\u0443 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u043d\u0438\u0439 \u0438 \u043d\u0430\u0432\u044b\u043a\u043e\u0432<\/p>\n<ul>\n<li>\n<p><span class=\"habrahidden\">\u0415\u0441\u043b\u0438 \u0431\u044b \u044f \u0432\u0435\u0440\u043d\u0443\u043b\u0441\u044f \u0432 \u043f\u0440\u043e\u0448\u043b\u043e\u0435 \u043d\u0430 17.02.23 \u0438 \u043c\u0435\u043d\u044f \u0431\u044b \u0441\u043f\u0440\u043e\u0441\u0438\u043b\u0438, \u0437\u0430\u043d\u044f\u043b\u0441\u044f \u0431\u044b \u0442\u044b \u044d\u0442\u0438\u043c \u0441\u043d\u043e\u0432\u0430, \u044f \u0431\u044b \u0442\u0432\u0451\u0440\u0434\u043e \u043e\u0442\u0432\u0435\u0442\u0438\u043b \u2014 \u0434\u0430! \u041e\u043d\u043e \u0442\u043e\u0433\u043e \u0441\u0442\u043e\u0438\u043b\u043e!<\/span><\/p>\n<\/li>\n<li>\n<p>\u042d\u043c\u043e\u0446\u0438\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0432 \u0441\u0435\u0431\u044f \u0442\u043e\u043d\u043d\u044b \u043f\u043e\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u044b\u0445 <strong>\u043d\u0435\u0440\u0432\u043e\u0432<\/strong> \u0430\u0432\u0442\u043e\u0440\u0430<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430 habr!<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u043b\u0438 \u0442\u0435\u043e\u0440\u0438\u044e \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0438\u0437 \u0433* \u0438 \u043f\u0430\u043b\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043e\u0440\u0443\u0434\u0438\u0442\u044c \u0432\u0441\u0451, \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e!<\/p>\n<\/li>\n<\/ul>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u2014 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u00ab\u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c\u00bb<\/summary>\n<div class=\"spoiler__content\">\n<ul>\n<li>\n<p>\u0421\u044b\u0440\u043e\u0432\u0430\u0442\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0441 \u0431\u0430\u0433\u0430\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u0431\u043e\u044f\u043c\u0438<\/p>\n<\/li>\n<li>\n<p>\u0422\u043e\u043b\u044c\u043a\u043e 1 \u0431\u043e\u043b\u0435\u0435-\u043c\u0435\u043d\u0435\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u0436\u0438\u043c \u0438\u0433\u0440\u044b<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u0441\u0438\u043b\u0438\u0439 \u043a \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u044b\u0445\u043b\u043e\u043f\u0443<\/p>\n<\/li>\n<li>\n<p>93 \u043f\u043e\u0434\u043f\u0438\u0441\u0447\u0438\u043a\u0430 \u043d\u0430 YouTube \u0437\u0430 15 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u043e\u0432 (3-6 \u0447\u0430\u0441\u043e\u0432) \u0438\u0433\u0440\u044b \u0432 SkyWars<\/p>\n<ul>\n<li>\n<p>? \u042f \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b \u0447\u0442\u043e-\u0442\u043e \u0442\u0430\u043a\u043e\u0435, \u043d\u043e \u043d\u0435 \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0434\u0443\u043c\u0430\u043b \u043b\u044e\u0434\u0435\u0439 \u0447\u0443\u0442\u044c \u043f\u043e\u0441\u0438\u043b\u044c\u043d\u0435\u0435 \u0443\u0434\u0438\u0432\u0438\u0442 \u043d\u0435\u0439\u0440\u043e\u043d\u043a\u0430-\u0441\u0442\u0440\u043c\u0438\u0435\u0440)) \u0421 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u044d\u0442\u043e \u0431\u044b\u043b \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u0433\u0430\u043b. \u0418\u0433\u0440\u0430 \u043e\u0434\u043d\u043e\u0442\u0438\u043f\u043d\u0430\u044f, \u0440\u0435\u0436\u0438\u043c \u043e\u0434\u0438\u043d. \u041c\u0430\u043b\u043e. \u0421\u043a\u0443\u0447\u043d\u043e\u0432\u0430\u0442\u043e. \u0422\u0430\u043a \u0447\u0442\u043e, \u0435\u0441\u043b\u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0411\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0438\u043c\u044b \u0441 \u043a\u0440\u0443\u043f\u043d\u044b\u043c\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\u043c\u0438, \u0433\u0434\u0435 NetTyan \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0443\u043c\u043d\u0435\u043b\u0430, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u044b\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 (+ \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0438 <s>\u043f\u043e\u0447\u0442\u0438<\/s> \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438).<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"Now\" id=\"Now\"><\/a><\/p>\n<h2>\u0427\u0442\u043e \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441\u0435\u0439\u0447\u0430\u0441?<\/h2>\n<p>\u0422\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432\u043e\u0442 \u0443\u0436\u0435 \u043a\u0430\u043a \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0430\u0432\u0442\u043e\u0440 (\u0434\u0430-\u0434\u0430, \u044f) \u043d\u0435 \u043e\u0441\u043e\u0431\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u043b\u0441\u044f \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c (\u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u0442\u0435 \u0441\u0430\u043c\u044b\u0435 \u0441\u0442\u0440\u0438\u043c\u044b). \u0423 \u044d\u0442\u043e\u0433\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f&#8230;<\/p>\n<details class=\"spoiler\">\n<summary>\u0423\u0433\u0430\u0440\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f. \u041d\u043e \u043d\u0435 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0430&#8230;<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u0430\u043a-\u0442\u043e \u0440\u0430\u0437 \u0430\u0432\u0442\u043e\u0440 \u0443\u0431\u0440\u0430\u043b\u0441\u044f \u0432 \u043a\u0432\u0430\u0440\u0442\u0438\u0440\u0435, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 (\u043d\u0435\u0439\u0440\u043e\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0443). \u041f\u0440\u0438\u0447\u0451\u043c \u0438\u043c\u0435\u043d\u043d\u043e Python-\u0447\u0430\u0441\u0442\u044c. \u0418 \u0411\u0410\u0426:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aa5\/835\/d4d\/aa5835d4d4850831dc04c5f0f6cee766.png\" alt=\"\u042d\u043a\u0440\u0430\u043d \u0432\u0437\u0440\u044b\u0432\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430\" title=\"\u042d\u043a\u0440\u0430\u043d \u0432\u0437\u0440\u044b\u0432\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430\" width=\"1200\" height=\"800\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aa5\/835\/d4d\/aa5835d4d4850831dc04c5f0f6cee766.png\"\/><\/p>\n<div><figcaption>\u042d\u043a\u0440\u0430\u043d \u0432\u0437\u0440\u044b\u0432\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0430\u0432\u0442\u043e\u0440 \u043d\u0435 \u043f\u0440\u0438\u0434\u0430\u043b \u044d\u0442\u043e\u043c\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u0431\u044b\u043b \u043f\u0440\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 \u043d\u0435\u0434\u0435\u043b\u044c\u043a\u0443. \u041f\u043e\u0442\u043e\u043c \u0441\u043d\u043e\u0432\u0430 \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u044e, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e \u2014 \u0438 \u0431\u0430\u0446, \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435! \u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e\u0431\u0435\u0436\u0430\u043b \u0430\u0432\u0442\u043e\u0440 \u0445\u043d\u044b\u043a\u0430\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0439 \u043d\u0438\u043a\u0447\u0435\u043c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043f\u0435\u0440\u0435\u043b\u043e\u043f\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0443\u043a \u0432 \u043d\u0451\u043c. \u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u044d\u0442\u043e\u0433\u043e, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0430\u0445\u043b\u043e \u0436\u0430\u0440\u0435\u043d\u044b\u043c (\u043d\u0435 \u043e\u0442 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430, \u0430, \u0441\u043a\u043e\u0440\u0435\u0435, \u043e\u0442 \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430\u043f\u0440\u044f\u0436\u0435\u043d\u0438\u044f \u043f\u0443\u043a\u0430\u043d\u0430 \u0430\u0432\u0442\u043e\u0440\u0430).<\/p>\n<p>\u041d\u0435 \u0431\u0443\u0434\u0443 \u0442\u043e\u043c\u0438\u0442\u044c \u0432\u0430\u0441 \u0434\u043e\u043b\u0433\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u043e\u043c. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0443\u0433\u0430\u0434\u0430\u0442\u044c \u043f\u0440\u0438\u0447\u0438\u043d\u0443 \u043f\u043e\u043b\u043e\u043c\u043a\u0438. \u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0432\u044b \u043d\u0435 \u0443\u0433\u0430\u0434\u0430\u0435\u0442\u0435 =)<\/p>\n<details class=\"spoiler\">\n<summary>\u043e\u0442\u0433\u0430\u0434\u043a\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412\u043e\u0442 \u043d\u0435 \u043f\u043e\u0432\u0435\u0440\u0438\u0442\u0435. \u041c\u0418-\u041a\u0420\u041e-\u0424\u041e\u041d! \u0414\u0430. \u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043b \u0435\u0433\u043e, \u0438 \u0432\u0441\u0451 \u0437\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e. \u041f\u0440\u0438\u0447\u0451\u043c, \u0434\u0435\u043b\u043e \u0431\u044b\u043b\u043e \u043d\u0435 \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0430, \u0430 \u0432 \u0441\u0430\u043c\u043e\u043c \u043c\u0438\u043a\u0440\u043e\u0444\u043e\u043d\u0435! \u041e\u043d \u0431\u044b\u043b \u043e\u0447\u0435\u043d\u044c \u0441\u0442\u0430\u0440\u044b\u0439, \u043d\u043e \u043a\u0442\u043e \u0431\u044b \u043c\u043e\u0433 \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c?! \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c Python \u0432\u0441\u0451 \u0432\u044b\u043b\u0435\u0442\u0430\u043b\u043e \u043a \u0447\u0435\u0440\u0442\u044f\u043c. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0441 \u043d\u0438\u043c \u0431\u044b\u043b\u043e \u043f\u0430\u0440\u043e\u0447\u043a\u0443 \u0431\u043b\u0443\u0441\u043a\u0440\u0438\u043d\u043e\u0432 \u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445, \u043d\u043e \u044f \u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u043e\u0431\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u043f\u0440\u0438\u0434\u0430\u0432\u0430\u043b.<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u0430\u043a-\u0442\u043e \u0442\u0430\u043a \u0431\u044b\u0432\u0430\u0435\u0442 \u0432 \u0436\u0438\u0437\u043d\u0438!<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u0441\u0451 \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u043b, \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438&#8230; \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0441\u0442\u0440\u0438\u043c, \u043d\u043e \u043c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0443\u0436\u0435 \u043f\u043e\u0434\u0443\u0433\u0430\u0441\u043b\u0430, \u0434\u0430 \u0438 \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439 \u0443\u0436\u0435 \u0431\u044b\u043b\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e&#8230; \u0412 \u043e\u0431\u0449\u0435\u043c, \u043a\u0430\u043a-\u0442\u043e \u0441\u043b\u0435\u0433\u043a\u0430 \u043f\u0440\u0438\u0443\u043d\u044b\u043b. \u0418 \u0437\u0430\u0431\u0440\u043e\u0441\u0438\u043b \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0435\u0449\u0451 \u043d\u0430 \u043c\u0435\u0441\u044f\u0446\u043e\u043a-\u0434\u0440\u0443\u0433\u043e\u0439&#8230;<\/p>\n<p>\u0410 \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u0435\u0441\u044f\u0446-\u0442\u0430\u043a\u0438 \u0443 \u0430\u0432\u0442\u043e\u0440\u0430 \u0445\u0432\u0430\u0442\u0438\u043b\u043e \u0441\u0438\u043b \u043d\u0430\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043c\u043e\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u0432\u044b\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442, \u0432\u0435\u0434\u044c \u0443\u043c\u043e\u043c \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e \u0432\u0441\u0451 \u044d\u0442\u043e \u0434\u0435\u043b\u043e \u0431\u044b\u043b\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043e \u0441\u0438\u043b, \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0438 \u0434\u0443\u0448\u0438! \u0414\u0430, \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0435 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0434, \u043d\u043e \u0438\u043d\u0430\u0447\u0435 \u2014 \u044d\u0442\u043e \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u044b \u0438\u0441\u0447\u0435\u0437\u043b\u043e \u0431\u0435\u0437 \u0441\u043b\u0435\u0434\u0430. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u0435\u043c \u043d\u0435 \u043b\u0451\u0433\u043a\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0430&#8230;<\/p>\n<p><strong>\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d \u043a\u0430\u0436\u0434\u043e\u043c\u0443, \u043a\u0442\u043e \u0434\u043e\u0448\u0451\u043b \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430!<\/strong> \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0440\u0443\u043f\u043d\u043e\u0439. \u0423\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043a\u0442\u043e-\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u043c\u043e\u0433 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0434\u043e\u0439\u0442\u0438! \u0427\u0442\u043e \u0432\u044b \u0434\u0443\u043c\u0430\u0435\u0442\u0435 \u043f\u043e \u043f\u043e\u0432\u043e\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438? \u0421\u0442\u043e\u0438\u0442 \u043b\u0438 \u043c\u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c, \u0438\u043b\u0438 \u043b\u0443\u0447\u0448\u0435 \u0437\u0430\u0434\u0443\u043c\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442? <strong>\u0411\u0443\u0434\u0443 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d, \u0435\u0441\u043b\u0438 \u0442\u044b\u043a\u043d\u0438\u0442\u0435 \u0432 \u043e\u043f\u0440\u043e\u0441\u0435 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438.<\/strong> \u0421\u0435\u0439\u0447\u0430\u0441 \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c, \u0438\u0434\u0451\u043c \u043b\u0438 \u043c\u044b \u0441 \u044d\u0442\u0438\u043c \u0434\u0430\u043b\u044c\u0448\u0435, \u0438 \u043c\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043b\u0438 \u044d\u0442\u043e \u043b\u044e\u0434\u044f\u043c \u0442\u0430\u043a\u0436\u0435, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u043c\u043d\u0435, \u0438 \u0435\u0441\u043b\u0438 \u0434\u0430 \u2014 \u0442\u043e \u044f, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u044e\u0441\u044c \u043d\u0430 \u043d\u0430\u0447\u0430\u0442\u043e\u043c))<\/p>\n<details class=\"spoiler\">\n<summary>\u0414\u043b\u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445<\/summary>\n<div class=\"spoiler__content\"><a class=\"anchor\" name=\"Sponsors\" id=\"Sponsors\"><\/a><\/p>\n<p>\u041b\u044e\u0431\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432\u0441\u0451, \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e \u2014 \u043d\u0435 \u0441\u0442\u0435\u0441\u043d\u044f\u0439\u0442\u0435\u0441\u044c \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0445\u0430\u0431\u0440, \u0432 \u0434\u0438\u0441\u043a\u043e\u0440\u0434, \u0432 \u0442\u0435\u043b\u0435\u0433\u0435 (\u0432\u0441\u0451 \u0432 <a href=\"#Links\" rel=\"noopener noreferrer nofollow\">\u0441\u0441\u044b\u043b\u043a\u0430\u0445 <\/a>\u0441\u043d\u0438\u0437\u0443)<\/p>\n<p>\u041d\u0430\u0448\u043b\u0438 \u043a\u043b\u0430\u0441\u0441\u043d\u0443\u044e TTS \u0441 \u0433\u043e\u043b\u043e\u0441\u043e\u043c \u0442\u044f\u043d\u043a\u0438 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043b\u0443\u0447\u0448\u0435, \u0447\u0435\u043c \u0435\u0441\u0442\u044c \u0441\u0435\u0439\u0447\u0430\u0441 \u2014 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e, \u0441\u043a\u0438\u043d\u044c\u0442\u0435 \u043c\u043d\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430)<\/p>\n<p>\u0425\u043e\u0442\u0438\u0442\u0435 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441\u043e \u043c\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u2014 \u043f\u0438\u0448\u0438\u0442\u0435, \u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430! \u041c\u043d\u0435 \u0431\u044b \u043f\u043e\u043c\u043e\u0449\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u044b \u043d\u0435 \u043f\u043e\u043c\u0435\u0448\u0430\u043b\u0430, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u0430\u0441\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u044f\u0434\u0440\u0430! \u0410 \u0435\u0449\u0451 \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0444\u043e\u0440\u043a\u0430\u0442\u044c \u043c\u043e\u0439 \u0444\u043e\u0440\u043a \u0430\u043b\u044c\u0442\u043e\u043a\u043b\u0435\u0444\u0430 \u2014 \u043e\u043d \u0435\u0441\u0442\u044c \u043d\u0430 <a href=\"https:\/\/github.com\/3ndetz\/autoclef\" rel=\"noopener noreferrer nofollow\">\u0433\u0438\u0442\u0445\u0430\u0431\u0435<\/a>, \u043f\u043e\u0437\u0430\u043f\u0438\u0445\u0438\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u043e\u0432, \u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0443\u0447\u043d\u043e, \u043f\u043e\u0444\u0438\u043a\u0441\u0438\u0442\u044c <abbr class=\"habraabbr\" title=\"\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438\u043a\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b Issues \u043d\u0430 \u0433\u0445\" data-title=\"&lt;p>\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0435 \u043a\u043e\u0441\u0442\u044b\u043b\u0438\u043a\u0438 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b Issues \u043d\u0430 \u0433\u0445&lt;\/p>&#187; data-abbr=&#187;\u043a\u043e\u0441\u0442\u044b\u043b\u0438\u043a\u0438&#187;>\u043a\u043e\u0441\u0442\u044b\u043b\u0438\u043a\u0438<\/abbr>))<\/p>\n<p>\u0415\u0441\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043a\u0430\u043c\u0438 \u0438\u043b\u0438 \u0447\u0435\u043c-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 MineRL \u2014 \u043e\u043e\u043e, \u044d\u0442\u043e \u043a\u0440\u0443\u0442\u043e! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u043c \u0443\u0441\u0438\u043b\u0438\u044f!<\/p>\n<details class=\"spoiler\">\n<summary>\u0412\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u043f\u0440\u043e\u0435\u043a\u0442?<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0435\u043d\u044c\u0433\u0438 \u0438\u043b\u0438 \u043d\u0435\u043d\u0443\u0436\u043d\u0430\u044f \u0432\u0438\u0434\u044e\u0445\u0430 >16G \u2014 \u0431\u0443\u0434\u0443 \u043e\u0447\u0435\u043d\u044c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u0435\u043d \u043c\u043e\u0449\u043d\u043e\u0439 \u0432\u0438\u0434\u044e\u0445\u0435 \u043a\u0430\u043a \u0432 \u043e\u0431\u043b\u0430\u043a\u0435, \u043a\u0430\u043a \u0438 \u0432 \u0440\u0435\u0430\u043b\u0435) \u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043c\u0435\u043d\u044f \u0431\/\u0443 3090, \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0438\u0442 \u0441 \u043b\u043b\u0430\u043c\u043e\u0439 (2 \u043c\u0438\u043d\u0443\u0442\u044b \u043d\u0430 100 \u0442\u043e\u043a\u0435\u043d\u043e\u0432, \u0443\u0436\u0430\u0441), \u043f\u043e\u0442\u043e\u043c\u0443-\u0442\u043e \u044f \u043e\u0441\u043e\u0431\u043e \u0438 \u043d\u0435 \u043c\u043e\u0433\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u043d\u0443\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u0444\u0440\u0435\u0434\u043e\u0432, \u0430 \u0443\u0436 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043b\u043b\u0430\u043c&#8230;<\/p>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0410 \u0435\u0449\u0451 \u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044e \u0431\u0430\u043a\u0430\u043b\u0430\u0432\u0440\u0430 (\u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0435\u0434\u0438\u0430), \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u0437\u043d\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0435 \u043c\u0430\u0433\u0438, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441 \u0418\u0418 \u0438 NLP \u0432 \u0447\u0430\u0441\u0442\u043d\u043e\u0441\u0442\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0442\u044c, \u0442\u043e\u0436\u0435 \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430)<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438\u043b\u0438 \u0441\u0442\u0430\u0440\u0442\u0430\u043f \u043f\u043e \u0441\u043c\u0435\u0436\u043d\u043e\u0439 \u0442\u0435\u043c\u0435 \u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0447\u0435\u043b\u043e\u0432\u0435\u043a \u2014 \u0442\u0430\u043a\u0436\u0435 \u043f\u0438\u0448\u0438\u0442\u0435)<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u043f\u043e \u043b\u044e\u0431\u044b\u043c \u0432\u0430\u0436\u043d\u044b\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u043c \u043c\u0438\u043b\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0448\u0443 \u0432 tg @HyperVlad<\/p>\n<\/div>\n<\/details>\n<p><a class=\"anchor\" name=\"Future\" id=\"Future\"><\/a><\/p>\n<h2>\u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u043b\u0430\u043d\u044b<\/h2>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u043c\u043e\u0439 \u043d\u0435\u0443\u0433\u043e\u043c\u043e\u043d\u043d\u044b\u0439 \u043c\u043e\u0437\u0433 \u043c\u0435\u0448\u0430\u043b \u043c\u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u0432\u0441\u0435\u0433\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0435\u043a\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0434\u043e\u0432\u0435\u0441\u0442\u0438 \u0434\u043e \u0443\u043c\u0430 <strong>\u0438 \u0431\u0435\u0437 \u0441\u0443\u0431\u0442\u0438\u0442\u0440\u043e\u0432 \u0438 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0448\u043b\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/strong>. \u0418 \u0434\u0430\u0436\u0435 \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0433\u043e, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u0430\u044f <strong>\u043a\u0443\u0447\u0430<\/strong> \u043d\u0435\u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u0439!<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0434\u0435\u0438 \u0438 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0434 \u043a\u043e\u043d\u0435\u0446 \u0440\u0430\u0431\u043e\u0442\u044b \u044f \u043d\u0430\u0447\u0430\u043b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u0434\u0435\u0438 \u043d\u0430\u0434\u043e \u0433\u0434\u0435-\u0442\u043e \u0441\u043a\u043b\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u043e\u0439 \u043c\u043e\u0437\u0433 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0442\u043e\u0439 \u0435\u0449\u0451 \u043f\u043e\u043c\u043e\u0439\u043a\u043e\u0439 (\u0430\u0433\u0430, \u043a\u0430\u043a \u0438 \u044d\u0442\u0430 \u043e\u0433\u0440\u043e\u043c\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430 \u0432 \u043d\u0435\u0439, \u043a\u0430\u043a \u0438 \u043c\u043e\u0439 \u0433\u0438\u0442 \u0445\u0430\u0431, \u043a\u0430\u043a \u0438 <s>\u043c\u043e\u044f \u0436\u0438\u0437\u043d\u044c<\/s> <span class=\"habrahidden\">\u043d\u0435\u0442, \u044f \u043d\u0435 \u0434\u0435\u0434-\u0438\u043d\u0441\u0430\u0439\u0434, \u0434\u0430\u043c\u044b \u0438 \u0433\u043e\u0441\u043f\u043e\u0434\u0430, \u044d\u0442\u043e \u044f \u0442\u0430\u043a \u0448\u0443\u0442\u0438\u0442\u044c \u043f\u044b\u0442\u0430\u043b\u0441\u044f<\/span>). \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0445\u0430\u043b \u0432\u0441\u044e \u043a\u0443\u0447\u0443 \u0438\u0434\u0435\u0439 \u0432 \u0433\u0443\u0433\u043b \u0434\u043e\u043a, \u043d\u043e \u043f\u043e\u0442\u043e\u043c \u0434\u043e \u043c\u0435\u043d\u044f \u0434\u043e\u0448\u043b\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u0443\u0434\u043e\u0431\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043f\u043e \u0442\u0438\u043f\u0443 YouGile.<\/p>\n<p>\u0412 \u043e\u0431\u0449\u0435\u043c, \u0437\u0430\u0444\u0438\u0433\u0430\u0447\u0438\u043b <a href=\"https:\/\/ru.yougile.com\/board\/rp1rgphbzrw3\" rel=\"noopener noreferrer nofollow\">\u0434\u043e\u0441\u043a\u0443 \u0441 \u0438\u0434\u0435\u044f\u043c\u0438<\/a>, \u0438 \u0441 \u0442\u0435\u0445 \u043f\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u0430 \u0448\u043b\u0430 \u0447\u0443\u0442\u044c \u043f\u0440\u043e\u0449\u0435, \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0440\u0430\u0437\u043c\u044b\u0448\u043b\u0435\u043d\u0438\u044e \u043d\u0430\u0434 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\u043c\u0438.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/44b\/2a7\/113\/44b2a7113a953bb4f7d2465fdc3bf2be.png\" alt=\"\u0414\u043e\u0441\u043a\u0430 \u0441 \u0438\u0434\u0435\u044f\u043c\u0438\" title=\"\u0414\u043e\u0441\u043a\u0430 \u0441 \u0438\u0434\u0435\u044f\u043c\u0438\" width=\"1560\" height=\"773\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/44b\/2a7\/113\/44b2a7113a953bb4f7d2465fdc3bf2be.png\"\/><\/p>\n<div><figcaption>\u0414\u043e\u0441\u043a\u0430 \u0441 \u0438\u0434\u0435\u044f\u043c\u0438<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u2014 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044b \u0441\u0435\u0439\u0447\u0430\u0441 (\u0441\u043c. <a href=\"#Now\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u0437\u0434\u0435\u043b \u0432\u044b\u0448\u0435<\/a>).<\/p>\n<h3>P. S.<\/h3>\n<p><span class=\"habrahidden\">\u0427\u0435\u0441\u0442\u043d\u043e \u0441\u043a\u0430\u0436\u0443, \u0435\u0441\u043b\u0438 \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442, \u0447\u0442\u043e\u00a0\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e \u043a\u0430\u043a\u043e\u0439\u2011\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0434\u043b\u044f\u00a0\u0441\u0435\u0431\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043d\u0430\u00a0\u0434\u0435\u043b\u0435, \u043d\u0430\u00a0\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445, \u043a\u043e\u0433\u0434\u0430 \u044f \u0432\u0441\u0451 \u044d\u0442\u043e \u0438\u0437\u0443\u0447\u0430\u043b, \u044f \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e\u00a0\u043c\u043e\u044f \u0446\u0435\u043b\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0438\u0436\u0438\u043c\u0430, \u0430\u00a0\u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u00a0\u0443\u0447\u0435\u0442\u043e\u043c \u043c\u043e\u0438\u0445 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439\u00a0\u2014 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u00a0\u043f\u0440\u0438\u043a\u043e\u043b\u0443, \u043a\u0430\u043a\u00a0\u0441\u043b\u0435\u043f\u043e\u0439 \u043a\u043e\u0442\u0451\u043d\u043e\u043a, \u0434\u043e\u043b\u0431\u0438\u043b\u0441\u044f \u043e\u00a0\u0441\u0430\u043c\u044b\u0435 \u0437\u0430\u0431\u044b\u0442\u044b\u0435 \u043a\u0440\u0430\u044f \u0433\u0443\u0433\u043b\u0430, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0432\u00a0\u043e\u0431\u0449\u0435\u043c\u2011\u0442\u043e \u0434\u0430\u0436\u0435 \u043d\u0435\u00a0\u0431\u044b\u043b \u0443\u0432\u0435\u0440\u0435\u043d, \u0447\u0442\u043e\u00a0\u0442\u0430\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u00a0\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u0434\u043b\u044f\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0438 \u0431\u0435\u0437\u00a0\u043a\u0443\u0447\u0438 \u0437\u0435\u043b\u0435\u043d\u044b\u0445. \u041d\u043e, \u043f\u0443\u0442\u0451\u043c \u043d\u0435\u0437\u0430\u0443\u0440\u044f\u0434\u043d\u043e\u0433\u043e \u0443\u043f\u043e\u0440\u0441\u0442\u0432\u0430 \u0438 \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e\u0439 \u0434\u043e\u043b\u0431\u0451\u0436\u043a\u0438 \u043e\u00a0\u0441\u0442\u0435\u043d\u0443 \u044f \u043f\u043e\u0442\u0438\u0445\u043e\u043d\u044c\u043a\u0443 \u043d\u0430\u0447\u0430\u043b \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0432\u00a0\u0440\u0430\u0431\u043e\u0442\u0443&#8230; \u0412\u0435\u0434\u044c \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u00a0\u043c\u043e\u0438\u043c \u043d\u0435 \u0441\u0430\u043c\u044b\u043c \u0448\u0438\u0440\u043e\u043a\u0438\u043c, \u0441\u043a\u0430\u0436\u0435\u043c \u0442\u0430\u043a, \u0431\u044d\u043a\u0433\u0440\u0430\u0443\u043d\u0434\u043e\u043c, \u044f \u0434\u0430\u0436\u0435 \u0438 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0435\u00a0\u043c\u043e\u0433, \u0447\u0442\u043e\u00a0\u0441\u043c\u043e\u0433\u0443 \u043a\u043e\u0433\u0434\u0430\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0434\u043b\u044f\u00a0\u043a\u043e\u0433\u043e\u2011\u0442\u043e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0441\u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u0442\u044c \u043c\u043e\u0442\u0438\u0432\u0430\u0442\u043e\u0440\u043e\u043c, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0432\u00a0\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u0434\u043b\u044f\u00a0\u0442\u0430\u043a\u043e\u0433\u043e \u00ab\u043b\u043e\u043c\u0430\u00bb, \u043a\u0430\u043a\u00a0\u0443\u043f\u043e\u0440\u0441\u0442\u0432\u043e, \u0432\u00a0\u044d\u0442\u043e\u0439 \u0436\u0438\u0437\u043d\u0438 \u043d\u0435\u0442 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e! \u041a\u0430\u043a\u00a0\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u043f\u0440\u043e\u0442\u0438\u0432 \u043b\u043e\u043c\u0430 \u043d\u0435\u0442 \u043f\u0440\u0438\u0451\u043c\u0430, \u044d\u0442\u043e\u00a0\u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0441\u0442\u043e (\u043d\u0435\u0442), \u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c =)<\/span><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/263\/393\/44a\/26339344ae3505b593fca5974e06f448.jpg\" alt=\"\u0421\u0435\u0440\u044c\u0451\u0437\u043d\u043e? \u0427\u0442\u043e-\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043d\u0430 \u0440\u0435\u0434\u0441\u0442\u043e\u0443\u043d\u0435 \u0438\u0437 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0430?\" title=\"\u0421\u0435\u0440\u044c\u0451\u0437\u043d\u043e? \u0427\u0442\u043e-\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043d\u0430 \u0440\u0435\u0434\u0441\u0442\u043e\u0443\u043d\u0435 \u0438\u0437 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0430?\" width=\"1920\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/263\/393\/44a\/26339344ae3505b593fca5974e06f448.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0421\u0435\u0440\u044c\u0451\u0437\u043d\u043e? \u0427\u0442\u043e-\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u043c\u0438\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043d\u0430 \u0440\u0435\u0434\u0441\u0442\u043e\u0443\u043d\u0435 \u0438\u0437 \u043c\u0430\u0439\u043d\u043a\u0440\u0430\u0444\u0442\u0430?<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u0420\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043e\u0442\u0441\u044b\u043b\u043a\u0438 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0438 \u0438\u0445 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0435<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u00ab\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0441\u0432\u043e\u044e \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u2011\u0442\u044f\u043d <strong>\u0438\u0437 <u>\u0437\u0435\u0444\u0438\u0440\u0430<\/u> \u0438 \u043f\u0430\u043b\u043e\u043a<\/strong>\u00bb\u00a0\u2014 \u043e\u0442\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u00a0\u043d\u0430\u0440\u043e\u0434\u0435 \u0444\u0440\u0430\u0437\u0435\u043e\u043b\u043e\u0433\u0438\u0437\u043c \u00ab\u0438\u0437 \u0433\u2011\u043d\u0430 \u0438 \u043f\u0430\u043b\u043e\u043a\u00bb, \u043e\u0437\u043d\u0430\u0447\u0430\u044e\u0449\u0438\u0439 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0447\u0435\u0433\u043e\u2011\u0442\u043e \u0438\u0437\u00a0\u043f\u043e\u0434\u0440\u0443\u0447\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u0441\u0442\u0432, \u0438 \u043f\u0435\u0441\u043d\u044e\u2011\u043c\u0435\u043c \u00ab\u041f\u0440\u0438\u043d\u0446\u0435\u0441\u0441\u044b \u043d\u0435\u00a0\u043a\u0430\u043a\u0430\u044e\u0442, \u0430\u00a0\u0435\u0441\u043b\u0438 \u043a\u0430\u043a\u0430\u044e\u0442 \u0442\u043e <u>\u0437\u0435\u0444\u0438\u0440\u043e\u043c<\/u>\u00bb.<\/p>\n<p>\u0420\u0430\u0437\u0434\u0435\u043b \u00abJust Python\u00bb\u00a0\u2014 \u043e\u0442\u0441\u044b\u043b\u043a\u0430 \u043d\u0430\u00a0\u043c\u0435\u043c \u00abJust Monika\u00bb \u043f\u0440\u043e\u00a0\u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430 \u041c\u043e\u043d\u0438\u043a\u0443 \u0438\u0437\u00a0\u043f\u0441\u0438\u0445\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0445\u043e\u0440\u0440\u043e\u0440\u0430 Doki Doki Literature Club.<\/p>\n<\/div>\n<\/details>\n<hr\/>\n<p><a class=\"anchor\" name=\"Links\" id=\"Links\"><\/a><\/p>\n<ul>\n<li>\n<p><strong>\u041a\u0430\u043d\u0430\u043b \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/strong>: <a href=\"https:\/\/www.youtube.com\/@NetTyan\" rel=\"noopener noreferrer nofollow\">https:\/\/www.youtube.com\/@NetTyan<\/a> <\/p>\n<ul>\n<li>\n<p>\u0412 \u0448\u043e\u0440\u0442\u0441\u0430\u0445 \u0437\u0430\u043b\u0438\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e \u0441\u0442\u0440\u0438\u043c\u043e\u0432<\/p>\n<ul>\n<li>\n<p><em>(\u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e, \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0441\u0442\u043e \u0431\u044b\u0442\u044c \u043c\u0430\u0442 \u0438\u043b\u0438 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f)<\/em><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041a\u0430\u043d\u0430\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 Discord<\/strong>: <a href=\"https:\/\/discord.com\/invite\/BQfbpV7j4k\" rel=\"noopener noreferrer nofollow\">https:\/\/discord.com\/invite\/BQfbpV7j4k<\/a><\/p>\n<ul>\n<li>\n<p>\u0421\u0442\u0430\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0431\u0430\u0437\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e \u0441\u0443\u0442\u0438. \u0422\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u041a\u0430\u043d\u0430\u043b \u0432 \u0442\u0435\u043b\u0435\u0433\u0435,<\/strong> \u0433\u0434\u0435 \u044f \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u044e \u0432\u0441\u044f\u043a\u0438\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0448\u0442\u0443\u043a\u043e\u0432\u0438\u043d\u044b:\u00a0<a href=\"https:\/\/t.me\/neuroxren\" rel=\"noopener noreferrer nofollow\">https:\/\/t.me\/neuroxren<\/a><\/p>\n<\/li>\n<li>\n<p>GitHub \u0430\u0432\u0442\u043e\u0440\u0430 (\u043c\u0435\u043d\u044f): <a href=\"https:\/\/github.com\/3ndetz\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/3ndetz<\/a> <\/p>\n<ul>\n<li>\n<p><em>(\u0437\u0434\u0435\u0441\u044c \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u043e\u0442 Python-\u043f\u0440\u043e\u0435\u043a\u0442, \u0430 Java-\u0447\u0430\u0441\u0442\u044c \u0443\u0436\u0435 \u0437\u0430\u043b\u0438\u0442\u0430)<\/em><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>HuggingFace: <a href=\"https:\/\/huggingface.co\/3ndetz\" rel=\"noopener noreferrer nofollow\">https:\/\/huggingface.co\/3ndetz<\/a><\/p>\n<ul>\n<li>\n<p><em>(\u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <\/em><a href=\"https:\/\/huggingface.co\/spaces\/3ndetz\/mc_map_resolver\" rel=\"noopener noreferrer nofollow\"><em>\u0440\u0435\u0448\u0430\u0442\u043e\u0440 mc-\u043a\u0430\u043f\u0447\u0438<\/em><\/a><em>)<\/em><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0415\u0449\u0451 \u043e\u0434\u043d\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0430\u0432\u0442\u043e\u0440\u0430: <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">https:\/\/habr.com\/ru\/articles\/733958\/<\/a><\/p>\n<ul>\n<li>\n<p>\u041c\u043e\u044f \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430 \u0445\u0430\u0431\u0440\u0435 \u043f\u0440\u043e \u00ab\u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0438\u043a\u043e\u0432\u00bb \u043d\u0430 FRED-T5<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"End\" id=\"End\"><\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><\/p>\n<div class=\"tm-article-poll-container\"><!--[--><\/p>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/812387\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u0438\u043b\u0438\u043b\u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u0432 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u0434\u0440\u044f\u0434 \u0431\u0435\u0437 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u0432?)<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">36.92% <\/span><span class=\"tm-article-poll__answer-label\">0<\/span><span class=\"tm-article-poll__answer-votes\">24<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 36.92%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">15.38% <\/span><span class=\"tm-article-poll__answer-label\">1<\/span><span class=\"tm-article-poll__answer-votes\">10<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 15.38%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">47.69% <\/span><span class=\"tm-article-poll__answer-label\">\u0411\u043e\u043b\u044c\u0448\u0435 (\u0441\u0432\u0435\u0440\u0445\u0447\u0435\u043b\u043e\u0432\u0435\u043a!)<\/span><span class=\"tm-article-poll__answer-votes\">31<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 47.69%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 65 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 11 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/812387\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u041d\u0443\u0436\u043d\u0430 \u043b\u0438 \u043f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u043f\u0430 \u0432\u0441\u0435\u0433\u043e \u0430\u0434\u0430 (\u043f\u0440\u043e\u0435\u043a\u0442\u0430) \u043d\u0430 \u0433\u0438\u0442\u0445\u0430\u0431\u0435?<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">50.7% <\/span><span class=\"tm-article-poll__answer-label\">\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e \u0434\u0430<\/span><span class=\"tm-article-poll__answer-votes\">36<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 50.7%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">43.66% <\/span><span class=\"tm-article-poll__answer-label\">\u0445\u043c, \u043d\u0443 \u043b\u0438\u0448\u043d\u0438\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442<\/span><span class=\"tm-article-poll__answer-votes\">31<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 43.66%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">5.63% <\/span><span class=\"tm-article-poll__answer-label\">\u043d\u0435\u0442, \u043f\u0444\u0444, \u043a\u043e\u043c\u0443 \u044d\u0442\u043e \u043d\u0430\u0434\u043e<\/span><span class=\"tm-article-poll__answer-votes\">4<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 5.63%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b 71 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 13 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll tm-article-poll_variant-bordered\">\n<div class=\"tm-notice tm-notice_positive tm-article-poll__notice\"><!----><\/p>\n<div class=\"tm-notice__inner\"><!----><\/p>\n<div class=\"tm-notice__content\" data-test-id=\"notice-content\"><!--[--><span>\u0422\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043e\u043f\u0440\u043e\u0441\u0435. <a rel=\"nofollow\" href=\"\/kek\/v1\/auth\/habrahabr\/?back=\/ru\/articles\/812387\/&#038;hl=ru\">\u0412\u043e\u0439\u0434\u0438\u0442\u0435<\/a>, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430.<\/span><!--]--><\/div>\n<\/div>\n<\/div>\n<p><!--[--><\/p>\n<div class=\"tm-article-poll__header\">\u0414\u043e\u0441\u0442\u043e\u0438\u043d \u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f? \u041f\u043e\u043c\u043e\u0433\u0438\u0442\u0435 \u0440\u0430\u0441\u0441\u0443\u0434\u0438\u0442\u044c \ud83d\ude42<\/div>\n<div class=\"tm-article-poll__answers\"><!--[--><\/p>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent tm-article-poll__answer-percent_winning\">55.26% <\/span><span class=\"tm-article-poll__answer-label\">\u041e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e!<\/span><span class=\"tm-article-poll__answer-votes\">42<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress tm-article-poll__answer-progress_winning\" style=\"width: 55.26%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">38.16% <\/span><span class=\"tm-article-poll__answer-label\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u0438 \u043d\u0435\u0442?<\/span><span class=\"tm-article-poll__answer-votes\">29<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 38.16%\"><\/div>\n<\/div>\n<\/div>\n<div class=\"tm-article-poll__answer\">\n<div class=\"tm-article-poll__answer-data\"><span class=\"tm-article-poll__answer-percent\">6.58% <\/span><span class=\"tm-article-poll__answer-label\">\u041d\u0435\u0442, \u0432\u0441\u0451 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u043b\u043e\u0445\u043e<\/span><span class=\"tm-article-poll__answer-votes\">5<\/span><\/div>\n<div class=\"tm-article-poll__answer-bar\">\n<div class=\"tm-article-poll__answer-progress\" style=\"width: 6.58%\"><\/div>\n<\/div>\n<\/div>\n<p><!--]--><\/div>\n<div class=\"tm-article-poll__stats\"> \u041f\u0440\u043e\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u0430\u043b\u0438 76 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.   \u0412\u043e\u0437\u0434\u0435\u0440\u0436\u0430\u043b\u0438\u0441\u044c 10 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. <\/div>\n<p><!--]--><\/div>\n<p><!--]--><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/812387\/\"> https:\/\/habr.com\/ru\/articles\/812387\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u043f\u043e\u0437\u0434\u0430\u043b \u0441 \u0442\u0440\u0435\u043d\u0434\u043e\u043c, \u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0436\u0435 \u0434\u043e\u0431\u0440\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a. \u041c\u043e\u0436\u0435\u0442, \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f <span class=\"habrahidden\">(\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u0435\u044f\u0442\u044c\u0441\u044f \u0438\u043b\u0438 \u043a\u0440\u0438\u043d\u0436\u0430\u043d\u0443\u0442\u044c \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u043e\u0434 \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u043b \u043d\u0430 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e).<\/span><\/p>\n<p>\u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u044b \u0441\u043b\u044b\u0448\u0430\u043b\u0438 \u043e <a href=\"https:\/\/dtf.ru\/life\/1566723-twitch-vremenno-zablokiroval-ii-strimershu-za-razzhiganie-nenavisti-ranee-ona-otricala-holokost\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u0448\u0443\u043c\u0435\u0432\u0448\u0435\u0439<\/a> \u0432\u00a0\u0441\u0432\u043e\u0451 \u0432\u0440\u0435\u043c\u044f \u0418\u0418 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0435 <a href=\"https:\/\/www.youtube.com\/channel\/UCLHmLrj4pHHg3-iBJn_CqxA\" rel=\"noopener noreferrer nofollow\">NeuroSama<\/a>. \u041c\u0435\u043d\u044f \u0442\u043e\u0433\u0434\u0430 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430 \u044d\u0442\u0430 \u0442\u0435\u043c\u0430, \u0438 \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u043e\u00a0\u0447\u0442\u043e\u00a0\u0431\u044b \u0442\u043e \u043d\u0438 \u0441\u0442\u0430\u043b\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u0434\u0443\u043c\u043a\u0443 \u0430\u0432\u0442\u043e\u0440\u0430, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u0438 \u0443\u00a0\u043c\u0435\u043d\u044f \u043a\u043e\u0435\u2011\u043a\u0430\u043a\u0438\u0435 <abbr class=\"habraabbr\" title=\"\u041d\u0430\u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0442\u0440\u0438\u043c\u0435 \u0431\u044b\u043b\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0443\u0442 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043a\u043b\u0438\u043a \u0431\u0435\u0439\u0442 \u0434\u043b\u044f \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u0430\u043a \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0417\u0434\u0435\u0441\u044c \u0445\u043e\u0447\u0443 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043d\u0435 \u043e\u0431 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0432 \u0447\u0430\u0442\u0435 (\u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e), \u0430 \u043e \u0431\u0443\u0434\u0442\u043e \u0431\u044b &quot;\u0441\u0432\u044f\u0437\u0438&quot; \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430.\" data-title=\"&lt;p>\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0417\u0434\u0435\u0441\u044c \u0445\u043e\u0447\u0443 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043d\u0435 \u043e\u0431 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0432 \u0447\u0430\u0442\u0435 (\u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e), \u0430 \u043e \u0431\u0443\u0434\u0442\u043e \u0431\u044b&quot;\u0441\u0432\u044f\u0437\u0438&quot; \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430.&#187; data-title=&#187;&lt;p>\u041d\u0430\u0441\u0447\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u043d\u0430 \u0441\u0442\u0440\u0438\u043c\u0435 \u0431\u044b\u043b\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u0438 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u0443\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0443\u0442 \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u043a\u043b\u0438\u043a \u0431\u0435\u0439\u0442 \u0434\u043b\u044f \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u0430\u043a \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u043e\u0432\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445. \u0417\u0434\u0435\u0441\u044c \u0445\u043e\u0447\u0443 \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u0438\u0434\u0451\u0442 \u043d\u0435 \u043e\u0431 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0432 \u0447\u0430\u0442\u0435 (\u0445\u043e\u0442\u044f \u0438 \u0442\u0430\u043c \u044d\u0442\u043e \u0442\u043e\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e), &lt;strong>\u0430 \u043e \u0431\u0443\u0434\u0442\u043e \u0431\u044b &quot;\u0441\u0432\u044f\u0437\u0438&quot; \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0447\u0430\u0442-\u0431\u043e\u0442\u0430 \u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430.&lt;\/strong>&lt;\/p>&#187; data-abbr=&#187;\u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f&#187;>\u0441\u043e\u043c\u043d\u0435\u043d\u0438\u044f<\/abbr>.<\/p>\n<p>\u041c\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0432\u043b\u0435\u043a\u043b\u043e \u043d\u0435\u00a0\u0441\u0430\u043c\u043e \u0448\u043e\u0443 \u0438 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043d\u0430\u0448\u0443\u043c\u0435\u0432\u0448\u0438\u0435 \u0441\u0430\u043c\u044b\u0435 \u00ab\u043a\u0440\u0443\u0442\u0435\u0439\u0448\u0438\u0435\u00bb \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0438\u043c\u043e\u0432, \u0430\u00a0\u0441\u0430\u043c \u0444\u0430\u043a\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e <strong>\u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u0438 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e \u0432\u0435\u0441\u0442\u0438 \u0441\u0442\u0440\u0438\u043c<\/strong>, \u0443\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439!<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"left\">\u0412\u00a0\u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u00a0\u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c <strong>\u0441\u0432\u043e\u044e<\/strong> \u043d\u0435\u0439\u0440\u043e\u2011\u0442\u044f\u043d \u0434\u043b\u044f\u00a0\u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043c\u043e\u0436\u0435\u0442 <strong>\u0430\u0432\u0442\u043e\u043d\u043e\u043c\u043d\u043e \u0438 \u0431\u0435\u0437\u00a0\u043f\u0435\u0440\u0435\u0440\u044b\u0432\u043e\u0432 \u0438\u0433\u0440\u0430\u0442\u044c \u0438 \u0432\u0435\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438<\/strong> \u043d\u0430\u00a0\u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0442\u0440\u0438\u043c\u0438\u043d\u0433\u2011\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445 \u0438 <s>\u0431\u0443\u043b\u043b\u0438\u0442\u044c \u043a\u043e\u0436\u0430\u043d\u044b\u0445 \u043c\u0435\u0448\u043a\u043e\u0432<\/s> \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0437\u0440\u0438\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0433\u0440\u043e\u043a\u043e\u0432, <abbr class=\"habraabbr\" title=\"\u0418\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u0445 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u043e\" data-title=\"&lt;p>\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u043e&#187; data-title=&lt;p>\u0418\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b, \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435, \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0438\u0445 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u043e&lt;\/p>&#187; data-abbr=&#187;\u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0431\u0430\u043d\u044b&#187;>\u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0431\u0430\u043d\u044b<\/abbr>!<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0431\u0435\u0437\u00a0\u043f\u0440\u0435\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u044f <strong>\u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439<\/strong> \u0438\u0437\u2011\u0437\u0430 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e <strong>\u0422\u0423\u0427\u0418<\/strong> \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0433\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u00a0\u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u043f\u0430\u0441\u0430\u0439\u0442\u0435\u0441\u044c \u0431\u043e\u0447\u043a\u043e\u0439 <strong>\u043a\u0432\u0430\u0441\u0430<\/strong> \u0438 \u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u043f\u043a\u0440\u043e\u043d\u0430, \u043a\u0430\u043a\u00a0\u0438 \u0432 <a href=\"https:\/\/habr.com\/ru\/articles\/733958\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u043e\u0448\u043b\u044b\u0439<\/a> \u0440\u0430\u0437, \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0435\u0449\u0430\u0435\u0442\u00a0\u0431\u044b\u0442\u044c \u0436\u0430\u0440\u043a\u0438\u043c, \u043d\u043e\u00a0\u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u00a0\u0441\u043a\u043e\u0440\u043e \u043b\u0435\u0442\u043e, \u0430\u00a0\u0435\u0449\u0451 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u00a0\u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0441\u043d\u0430 (<em>\u0438 \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0432\u0435\u0441\u0435\u043d\u043d\u0435\u0435 \u043e\u0431\u043e\u0441\u0442\u0440\u0435\u043d\u0438\u0435<\/em>), \u0432\u0435\u0434\u044c \u043c\u044b \u0441\u00a0\u0432\u0430\u043c\u0438 \u0431\u0443\u0434\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0443\u044e (\u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e) \u0434\u0435\u0432\u0443\u0448\u043a\u0443\u2011\u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0430!<\/p>\n<p>\u0421\u043f\u043e\u0439\u043b\u0435\u0440: \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0435\u043b\u043e, \u0438\u043d\u043e\u0433\u0434\u0430 \u0441\u043b\u043e\u0436\u043d\u043e \u0438 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043a\u0430\u043a\u00a0\u043e\u043f\u044b\u0442\u043d\u043e\u043c\u0443 \u0431\u043e\u0439\u0446\u0443, \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u043e\u0431\u044b\u0432\u0430\u0442\u0435\u043b\u044e!<\/p>\n<p><em>\u0415\u0441\u043b\u0438 \u043d\u0435\u00a0\u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0451\u00a0\u2014\u00a0\u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c \u00ab\u043f\u043e\u0440\u0442\u0430\u043b\u00bb.<\/em><\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0440\u0442\u0430\u043b (\u0432 \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u042d\u0442\u043e\u0442 \u0440\u0430\u0437\u0434\u0435\u043b \u2014 \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f, \u043d\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c, \u043d\u0435\u0442 \u0447\u0435\u0442\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041e\u0442\u0441\u044e\u0434\u0430 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u043c \u0441\u0442\u0430\u0442\u044c\u0438! \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u043c\u0430\u043a\u0430\u0435\u043c \u043d\u0430\u00a0\u043f\u043e\u0434\u0441\u0432\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 (\u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0434\u0451\u0442 \u043c\u0430\u0433\u0438\u044f: \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a\u00a0\u044f\u043a\u043e\u0440\u044e\u00a0\u2014 \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u0434\u0435\u043b\u0443)!<\/p>\n<figure class=\"full-width\"><\/figure>\n<p><a class=\"anchor\" name=\"Portal\" id=\"Portal\"><\/a><\/p>\n<p>\u26a0\ufe0f\u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435\u0441\u044c \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u043b\u0438 \u043a\u0430\u043a\u0443\u044e-\u0442\u043e \u0435\u0451 \u0447\u0430\u0441\u0442\u044c, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u044c\u0442\u0435\u0441\u044c \u0441 <strong>\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440\u0430\u043c\u0438<\/strong>!<\/p>\n<p><em>\u042d\u0442\u043e \u2014 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435. \u042d\u0442\u043e \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b.<\/em><\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u0449\u0435\u0435 \u043e\u0431\u043c\u043e\u0437\u0433\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435<\/p>\n<ul>\n<li>\n<p><a href=\"#Game\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0431\u043e\u0440 \u0438\u0433\u0440\u044b<\/a> (\u0443\u0433\u0430\u0434\u0430\u0439\u0442\u0435 \u0441 1 \u043f\u043e\u043f\u044b\u0442\u043a\u0438)<\/p>\n<\/li>\n<li>\n<p><a href=\"#GptCry\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0447\u0435\u043c\u0443 \u0424\u0440\u0435\u0434<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#MainProject\" rel=\"noopener noreferrer nofollow\">\u0421\u0445\u0435\u043c\u0430 \u0432\u0441\u0435\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/a> (\u043f\u0438\u043a\u0447\u0430, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434 (Java-\u0447\u0430\u0441\u0442\u044c)<\/p>\n<ul>\n<li>\n<p><strong>\u26a0\ufe0f<\/strong><a href=\"#CodeDisclaimer\" rel=\"noopener noreferrer nofollow\"><strong><em>CodeDisclaimer<\/em><\/strong><\/a> (\u0435\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u0442\u0435 \u0447\u0438\u0442\u0430\u0442\u044c \u043a\u043e\u0434 \u0434\u0430\u043b\u044c\u0448\u0435, <strong>\u0432\u0430\u0436\u043d\u043e<\/strong>)<\/p>\n<\/li>\n<li>\n<p><a href=\"#JavaBot\" rel=\"noopener noreferrer nofollow\">\u041f\u0438\u0448\u0435\u043c \u043a\u043e\u0434 Java-\u0447\u0430\u0441\u0442\u0438 \u0431\u043e\u0442\u0430<\/a> (\u043a\u043e\u0434 Java, \u043c\u043d\u043e\u0433\u043e)<\/p>\n<\/li>\n<li>\n<p><a href=\"#MCChatParser\" rel=\"noopener noreferrer nofollow\">\u0410\u0414 \u0438\u043b\u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0447\u0430\u0442\u0430<\/a> \u0438\u0437 <em>\u044d\u0442\u043e\u0439<\/em> \u0438\u0433\u0440\u044b (\u043a\u043e\u0434 Java, regex, \u043f\u0438\u043a\u0447\u0438)<\/p>\n<\/li>\n<li>\n<p><strong>?<\/strong><a href=\"#SkyWarsBot\" rel=\"noopener noreferrer nofollow\"><strong>\u041a\u0438\u0431\u043e\u0440\u0433-\u0443\u0431\u0438\u0439\u0446\u0430 \u0432 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0438<\/strong><\/a> (<strong>\u0433\u0438\u0444\u043a\u0438, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/strong>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u0441 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u0430\u0432\u0430\u0442\u0430\u0440\u043e\u043c<\/p>\n<ul>\n<li>\n<p><a href=\"#MCMapCaptchaSolver\" rel=\"noopener noreferrer nofollow\">InGameCaptchaSolver.useless<\/a> (\u043f\u0438\u043a\u0447\u0438, \u043a\u043e\u0434 Java, Python, Tensorflow OCR)<\/p>\n<\/li>\n<li>\n<p><a href=\"#MineBridge.py\" rel=\"noopener noreferrer nofollow\">MineBridge.py<\/a> (\u043a\u043e\u0434 Python, Py4j. \u041d\u0435 \u043e\u0441\u043e\u0431\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043d\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f..)<\/p>\n<\/li>\n<li>\n<p><strong>?<\/strong><a href=\"#MineEyeBridge\" rel=\"noopener noreferrer nofollow\"><strong>\u0425\u0432\u043e\u0441\u0442\u0430\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u0438\u0442 \u0433\u043b\u0430\u0437\u043a\u0438<\/strong><\/a> (<strong>\u0433\u0438\u0444\u043a\u0438, \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044f<\/strong>)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#TyanGptStart\" rel=\"noopener noreferrer nofollow\">\u0412\u0430\u0440\u0438\u043c \u043a\u0438\u0441\u0435\u043b\u044c TyanGpt<\/a> (\u043c\u043d\u043e\u0433\u043e code)<\/p>\n<ul>\n<li>\n<p><strong>\u26a0\ufe0f<\/strong><a href=\"#Disclaimer\" rel=\"noopener noreferrer nofollow\"><strong><em>Disclaimer<\/em><\/strong><\/a> (<strong>\u0432\u0430\u0436\u043d\u043e, <\/strong>\u0435\u0441\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0434\u0430\u043b\u0435\u0435)<\/p>\n<\/li>\n<li>\n<p><a href=\"#NameBrainstorm\" rel=\"noopener noreferrer nofollow\">\u041f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0435\u043c \u0445\u0432\u043e\u0441\u0442\u0430\u0442\u043e\u0439 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435<\/a> (\u0442\u0435\u043a\u0441\u0442, \u043d\u043e <em>\u0432\u0435\u0441\u0435\u043b\u043e<\/em>)<\/p>\n<\/li>\n<li>\n<p><strong>?\ufe0f<\/strong><a href=\"#NickAnalyzer\" rel=\"noopener noreferrer nofollow\"><strong>\u0410\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0438\u043a\u043e\u0432 \u0434\u0430\u0451\u0442 \u0436\u0430\u0440\u0443<\/strong><\/a> (\u0432\u044b\u0440\u0435\u0437\u043a\u0438 \u0447\u0430\u0442\u0430, \u0432\u0435\u0441\u0435\u043b\u043e)<\/p>\n<\/li>\n<li>\n<p><a href=\"#ChatSystem\" rel=\"noopener noreferrer nofollow\">\u0414\u0443\u043c\u0430\u0435\u043c \u043d\u0430\u0434 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439<\/a> (\u0442\u0435\u043a\u0441\u0442, \u0432\u0432\u043e\u0434\u043d\u044b\u0435)<\/p>\n<ul>\n<li>\n<p>\u043c\u043d\u043e\u0433\u043e \u0432\u0430\u0436\u043d\u044b\u0445 \u0432\u0432\u043e\u0434\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"#%D0%A0%D0%B0%D0%BD%D0%B3%D0%B8%D0%AD%D0%BC%D0%BE%D1%86%D0%B8%D0%B8\" rel=\"noopener noreferrer nofollow\">\u0440\u0430\u043d\u0433\u0438 \u0438 \u044d\u043c\u043e\u0446\u0438\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"noopener noreferrer nofollow\">\u0430\u0431\u0437\u0430\u0446<\/a> \u043f\u0440\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#%D0%94%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2%D0%B0%D1%8F%D0%A1%D1%85%D0%B5%D0%BC%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0421\u0445\u0435\u043c\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/a> (\u043f\u0438\u043a\u0447\u0430, \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f)<\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%A4%D0%B8%D0%BB%D1%8C%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F%D0%94%D0%B5%D0%BC%D0%BE\" rel=\"noopener noreferrer nofollow\">\u0421\u0438\u0441\u0442\u0435\u043c\u0430 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438<\/a> (\u043f\u0438\u043a\u0447\u0430, \u0430 \u0432\u044b\u0448\u0435 \u043a\u043e\u0434 Python)<\/p>\n<\/li>\n<li>\n<p><a href=\"#%D0%91%D0%94\" rel=\"noopener noreferrer nofollow\">\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/a> (\u043f\u0438\u043a\u0447\u0430 \u0438 \u043d\u0438\u0436\u0435 \u043a\u043e\u0434 Python &amp; sql)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>\u0412\u0435\u0441\u0435\u043b\u0438\u043c\u0441\u044f! <em>(\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0447\u0438\u0442\u0430\u0439\u0442\u0435 <\/em><a href=\"#Disclaimer\" rel=\"noopener noreferrer nofollow\"><strong><em>Disclaimer<\/em><\/strong><\/a><em>)<\/em><\/p>\n<ul>\n<li>\n<p><strong>?\ufe0f<\/strong><a href=\"#RudeChatDemo\" rel=\"noopener noreferrer nofollow\"><strong>\u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438 \u0432 \u00ab\u0441\u043e\u0446\u0438\u0443\u043c\u0435\u00bb<\/strong><\/a><strong> <\/strong>(\u0432\u044b\u0440\u0435\u0437\u043a\u0438 \u0447\u0430\u0442\u0430)<\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0434\u0443\u0448\u0435\u0432\u043d\u044b\u0435 \u0431\u0435\u0441\u0435\u0434\u044b (ref: \u0434\u0436\u0435\u043d\u0442\u043b\u044c\u043c\u0435\u043d\u044b \u0443 \u043f\u043e\u0434\u044a\u0435\u0437\u0434\u0430 \u043d\u0430 \u043b\u0430\u0432\u043e\u0447\u043a\u0430\u0445)<\/p>\n<\/li>\n<li>\n<p>\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u0443\u0433\u0430\u0441\u0448\u0435\u0439 \u043b\u044e\u0431\u0432\u0438&#8230;<\/p>\n<\/li>\n<li>\n<p><a href=\"#ChatBugs\" rel=\"noopener noreferrer nofollow\"><strong>\u0411\u0430\u0433\u0438<\/strong><\/a> (\u0442\u043e\u0436\u0435 \u0432\u0435\u0441\u0435\u043b\u043e)<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>?\ufe0f<\/strong><a href=\"#ChatDemo\" rel=\"noopener noreferrer nofollow\"><strong>\u0412\u0437\u0440\u043e\u0441\u043b\u0435\u043d\u0438\u0435<\/strong><\/a> (\u0432\u0435\u0441\u0451\u043b\u044b\u0435 \u0432\u044b\u0440\u0435\u0437\u043a\u0438 \u0447\u0430\u0442\u0430)<\/p>\n<ul>\n<li>\n<p>\u041e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0442\u043e\u043a\u0441\u0438\u0447\u043d\u044b\u0445 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u0431\u0430\u0432\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#AnotherCode\" rel=\"noopener noreferrer nofollow\">\u0414\u043e\u0431\u0438\u0432\u0430\u0435\u043c \u043e\u0441\u0442\u0430\u0442\u043a\u0438<\/a> (TTS \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435, \u043a\u043e\u0434)<\/p>\n<\/li>\n<li>\n<p><a href=\"#Summary\" rel=\"noopener noreferrer nofollow\">\u041f\u043e\u0434\u0432\u043e\u0434\u0438\u043c \u0438\u0442\u043e\u0433\u0438<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"#Now\" rel=\"noopener noreferrer nofollow\"><strong>\u0427\u0442\u043e \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c \u0441\u0435\u0439\u0447\u0430\u0441?<\/strong><\/a><\/p>\n<ul>\n<li>\n<p>\u0421\u0442\u0430\u0442\u0443\u0441<\/p>\n<\/li>\n<li>\n<p><a href=\"#Sponsors\" rel=\"noopener noreferrer nofollow\">\u0414\u043b\u044f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445<\/a><\/p>\n<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><a href=\"#Future\" rel=\"noopener noreferrer nofollow\">\u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u044b \u0438 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u043b\u0430\u043d\u044b<\/a> <\/p>\n<\/li>\n<li>\n<p><a href=\"#Links\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0438<\/a> (\u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c, \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f, \u043a\u0430\u043d\u0430\u043b \u0438 \u0442.\u043f.)<\/p>\n<\/li>\n<li>\n<p>\u0422\u044b\u043a\u043d\u0438\u0442\u0435, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043e\u043f\u0440\u043e\u0441 <a href=\"#End\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0441\u043b\u0435 <\/a>\u0441\u0442\u0430\u0442\u044c\u0438)<\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041a\u0430\u043a\u0438\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f (\u0441\u043f\u043e\u0439\u043b\u0435\u0440\u044b)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0438: NLP (\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u0430\u044f LLM, \u043a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b), TTS, STT, \u0447\u0443\u0442\u043e\u043a CV<\/p>\n<p><em>(\u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440 \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u043d\u044b \u0434\u0430\u043b\u0435\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435)<\/em><\/p>\n<p>\u042f\u0437\u044b\u043a\u0438:<code>Python, \u043d\u0435\u043c\u043d\u043e\u0433\u043e Java<\/code><\/p>\n<p>\u041f\u0430\u043a\u0435\u0442\u044b Python:<code>pytorch, multiprocessing &amp; multithreading, flask, websocket, asyncio, pysimplegui, py4j, sqlite, a bit tensorflow<\/code><\/p>\n<p>\u041f\u041e: IDE JetBrains PyCharm Community \u0438 Intellij Idea, OBS, VTube Studio, Docker Desktop (WSL)<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043f\u0440\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0432\u00a0\u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u0430\u043a\u00a0\u0443\u00a0\u043c\u0435\u043d\u044f, \u0441\u0442\u0430\u0442\u044c\u044e \u0434\u0435\u043b\u044f\u0442 \u043d\u0430\u00a0\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u0435\u0439, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u00ab\u043a\u043b\u0430\u0441\u0441\u043e\u0432\u00bb \u0438 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u0433\u0434\u0430\u2011\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430\u00a0\u043f\u043e\u0442\u043e\u043c. \u041d\u043e\u00a0\u044f \u043d\u0435\u00a0\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044c \u0442\u044f\u043d\u0443\u0442\u044c\u00a0\u0431\u044b\u043a\u0430 \u0437\u0430\u00a0\u044f\u0439\u0446\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0439\u0442\u0435\u0441\u044c \u043f\u043e\u043b\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0441\u0440\u0430\u0437\u0443! <span class=\"habrahidden\">\u0410\u00a0\u0435\u0449\u0451 \u043c\u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u0435\u043d\u044c \u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430\u00a0\u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438, \u043f\u0440\u0438\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f\u00a0\u043d\u0438\u0445, \u0441\u043d\u043e\u0432\u0430 \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0442\u0435\u0433\u0438 \u0438\u00a0\u0442.\u00a0\u0434. =)<\/span><\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0449\u0451 \u043f\u0440\u043e \u0444\u043e\u0440\u043c\u0430\u0442<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041a\u0430\u0441\u0430\u0435\u043c\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u043b \u0441\u0442\u0430\u0442\u0435\u0439\u043a\u0443 \u043a\u0430\u043a\u00a0\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b, \u043d\u043e\u00a0\u043f\u043e\u00a0\u0444\u0430\u043a\u0442\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 <strong>\u043e\u0447\u0435\u043d\u044c<\/strong> \u0442\u0440\u0443\u0434\u043d\u043e, \u0438 \u0443\u0436 \u0442\u043e\u0447\u043d\u043e \u0432\u0440\u044f\u0434\u00a0\u043b\u0438 \u043a\u0442\u043e\u2011\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043c\u0435\u0441\u044f\u0446\u044b \u0441\u0432\u043e\u0435\u0439 \u0436\u0438\u0437\u043d\u0438 \u043d\u0430\u00a0\u043f\u043e\u043b\u043d\u043e\u0435 \u00ab\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u00bb \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0443. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u044f <strong>\u043d\u0435<\/strong> \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043b <strong>\u0432\u0435\u0441\u044c<\/strong> \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u00a0GitHub (\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0447\u0430\u0441\u0442\u0438) \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0437\u0434\u0435\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043a\u043e\u0434\u0430 \u0434\u043b\u044f <strong>\u0441\u0430\u043c\u044b\u0445 \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0445 (<\/strong><a href=\"#CodeDisclaimer\" rel=\"noopener noreferrer nofollow\"><strong>\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435<\/strong><\/a><strong>)<\/strong>. \u041f\u043e\u00a0\u044d\u0442\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u044f \u0443\u0431\u0440\u0430\u043b \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u043e\u043c\u0435\u0442\u043a\u0443 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0442\u043e, \u0447\u0442\u043e\u00a0\u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043b\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u0442\u0438\u0441\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u043a\u0430\u043a\u00a0\u0432\u00a0\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435, \u0432\u00a0\u0444\u043e\u0440\u043c\u0430\u0442\u0435, \u043f\u043e\u0445\u043e\u0436\u0435\u043c \u043d\u0430\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0447\u0435\u0433\u043e\u2011\u043b\u0438\u0431\u043e.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u00a0\u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e. \u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f <span class=\"habrahidden\">(\u043d\u043e \u043d\u0435\u00a0\u0432\u0435\u0437\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c)<\/span> \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e \u0442\u0430\u043a,\u00a0\u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0434\u043b\u044f\u00a0\u043d\u043e\u0432\u0438\u0447\u043a\u0430 \u0438 \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b\u043e \u043d\u0435\u0441\u043a\u0443\u0447\u043d\u044b\u043c \u0447\u0442\u0438\u0432\u043e\u043c \u043a\u0440\u0443\u0442\u043e\u043c\u0443 \u0441\u043f\u0435\u0446\u0443.<\/p>\n<p>\u041d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c \u044d\u0442\u043e\u0442 \u043e\u043f\u044b\u0442 \u043c\u043e\u0436\u0435\u0442 \u0433\u0434\u0435\u2011\u0442\u043e \u043f\u043e\u043c\u043e\u0447\u044c \u0432\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f, \u043f\u0440\u0430\u0432\u0434\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u00a0\u043a\u0443\u0447\u0443 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439&#8230; \u041a\u0440\u0443\u0442\u044b\u043c \u0441\u043f\u0435\u0446\u0430\u043c\u00a0\u2014 \u043f\u043e\u0440\u0436\u0430\u0442\u044c \u0441\u00a0\u043a\u043e\u0441\u0442\u044b\u043b\u044c\u043d\u043e\u0433\u043e \u0431\u0440\u0435\u0434\u043e\u043a\u043e\u0434\u0430 \u0438 \u0435\u0449\u0451 \u0440\u0430\u0437 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u043a\u0430\u043a\u00a0\u043b\u0443\u0447\u0448\u0435 \u043d\u0435\u00a0\u0434\u0435\u043b\u0430\u0442\u044c. \u0410\u00a0\u043f\u0440\u043e\u0441\u0442\u043e\u043c\u0443 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044e \u0431\u0435\u0437\u00a0\u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0432\u044b\u043a\u043e\u0432 \u0432\u00a0\u043f\u0440\u043e\u0444\u0438\u043b\u044c\u043d\u043e\u0439 \u0441\u0444\u0435\u0440\u0435\u00a0\u2014 \u0441\u00a0\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u043c \u043f\u043e\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0437\u0430\u00a0\u043c\u043e\u0438\u043c\u0438 <s>\u043c\u0443\u0447\u0435\u043d\u0438\u044f\u043c\u0438<\/s> <s>\u0441\u0442\u0440\u0430\u0434\u0430\u043d\u0438\u044f\u043c\u0438<\/s> <s>\u043f\u044b\u0442\u043a\u0430\u043c\u0438<\/s> (\u0442\u0430\u043a \u0438 \u043d\u0435\u00a0\u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0441\u0438\u043d\u043e\u043d\u0438\u043c \u043f\u043e\u0434\u00a0\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u00a0\u043d\u0443\u043b\u044f), \u043e\u0446\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u0437\u0430\u0442\u0440\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0441\u0438\u043b \u043a \u0443\u0441\u043f\u0435\u0445\u0443 (\u0421\u041f\u041e\u0419\u041b\u0415\u0420: \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 0.0001) \u0438 \u043f\u043e\u0434\u0447\u0435\u0440\u043f\u043d\u0443\u0442\u044c \u0434\u043b\u044f\u00a0\u0441\u0435\u0431\u044f \u043a\u0430\u043a\u0438\u0435\u2011\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043a\u043e\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u0440\u0443\u0437\u044c\u044f\u043c.<\/p>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u044d\u0442\u0438 \u0432\u0430\u0448\u0438 \u0442\u044f\u043d, \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0442.\u0434.<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u043f\u043e\u00a0\u0441\u0435\u0431\u0435 (<em>\u0434\u0430-\u0434\u0430, \u0441\u0430\u043c \u0438\u0437\u00a0\u0447\u0438\u0441\u043b\u0430 \u0442\u0435\u0445, \u0434\u043e\u00a0\u043a\u043e\u0433\u043e \u00ab\u0442\u0440\u0435\u043d\u0434\u044b\u00bb, \u0435\u0441\u043b\u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u043d\u0430\u0437\u0432\u0430\u0442\u044c, \u0434\u043e\u0445\u043e\u0434\u044f\u0442 \u0432\u00a0\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c<\/em>), \u0447\u0442\u043e\u00a0\u043a\u0442\u043e\u2011\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0435\u00a0\u0432\u044a\u0435\u0437\u0436\u0430\u0442\u044c \u0432\u043e\u00a0\u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043c\u043e\u043b\u043e\u0434\u0451\u0436\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043f\u043e\u00a0\u0442\u0438\u043f\u0443 \u00ab\u0442\u044f\u043d\u043a\u0430\u00bb \u0438 \u043f\u0440. \u0412\u00a0\u044d\u0442\u043e\u043c \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u0435 \u044f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0438\u0445 \u0438 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u0438\u0439, <strong>\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u0430\u043b\u0435\u0435 \u0432\u00a0\u0441\u0442\u0430\u0442\u044c\u0435<\/strong>. <em>\u0414\u043b\u044f\u00a0\u0432\u0441\u0435\u0437\u043d\u0430\u044e\u0449\u0438\u0445, \u043a\u0441\u0442\u0430\u0442\u0438, \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c, \u043d\u0430\u0432\u0435\u0432\u0430\u0435\u0442 \u0442\u0430\u043a\u0443\u044e \u043d\u043e\u0441\u0442\u0430\u043b\u044c\u0433\u0438\u044e&#8230;<\/em><\/p>\n<p>\u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0433\u0443\u0433\u043b\u0430 \u2013 \u0434\u0430, \u044d\u0442\u0430 \u0431\u0430\u0437\u0430&#8230; \u041d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044f \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043d\u043e \u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u0445 \u0441\u043e \u0441\u0432\u043e\u0438\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c, \u0432\u0435\u0434\u044c \u0442\u043e\u0442 \u0436\u0435 \u0433\u0443\u0433\u043b \u043c\u043e\u0436\u0435\u0442 (\u043f\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043c\u043e\u0436\u0435\u0442) \u0432\u044b\u0434\u0430\u0442\u044c \u043d\u0435\u0440\u0435\u043b\u0435\u0432\u0430\u043d\u0442\u043d\u0443\u044e \u0438\u043d\u0444\u0443 \u0438 \u0437\u0430\u043f\u0443\u0442\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0430, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435, \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u043d\u0430\u043c\u0438 \u0441\u043e\u0432\u0441\u0435\u043c \u00ab\u0437\u0435\u043b\u0451\u043d\u044b\u0439\u00bb \u043d\u043e\u0432\u0438\u0447\u043e\u043a.<\/p>\n<ul>\n<li>\n<p>\u0421\u0442\u0440\u0438\u043c\u00a0\u2014 \u043f\u0440\u044f\u043c\u0430\u044f \u043e\u043d\u043b\u0430\u0439\u043d\u2011\u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044f. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c\u0438 \u0434\u043b\u044f\u00a0\u0441\u0442\u0440\u0438\u043c\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Twitch, YouTube, Trovo \u0438 \u0434\u0440. \u041a\u0430\u043a\u00a0\u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0435\u0434\u0443\u0442 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u043d\u0430\u0442\u044b (\u043e\u0442 donate\u00a0\u2014 \u00ab\u0436\u0435\u0440\u0432\u0442\u043e\u0432\u0430\u0442\u044c\u00bb)\u00a0\u2014 \u0434\u043e\u0431\u0440\u043e\u0432\u043e\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0436\u0435\u0440\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f. \u0420\u0430\u0434\u0438 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0434\u043e\u043d\u0430\u0442\u043e\u0432, \u0430\u00a0\u0435\u0449\u0451 \u0434\u043b\u044f\u00a0\u0440\u043e\u0441\u0442\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u0438 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0439 (\u043b\u0430\u0439\u043a\u043e\u0432, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 \u0438 \u043f\u0440.) <em>\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435<\/em> \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0441\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b \u0442\u0432\u043e\u0440\u0438\u0442\u044c \u0432\u0441\u044f\u043a\u0443\u044e <strong>\u0434\u0438\u0447\u044c<\/strong>, \u0432\u043f\u043b\u043e\u0442\u044c \u0434\u043e\u00a0\u0440\u0430\u0437\u0434\u0435\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u043c\u0435\u0440\u043e\u0439 \u0438\u043b\u0438\u00a0\u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430. <em>\u0421\u0442\u0440\u0438\u043c\u0435\u0440\u044b<\/em>, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0440\u0430\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442 \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0433\u0440, \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u043e\u0432 \u0432\u0438\u0434\u043e\u0441\u0438\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e. <em>\u0421\u0442\u0440\u0438\u043c\u0435\u0440\u0448\u0438<\/em> \u2014 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0443 \u043d\u0438\u0445 \u043d\u0430 \u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0435\u0441\u0442\u044c, \u043a\u0445\u043c, \u043a\u0430\u043a \u0431\u044b \u044d\u0442\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u00ab<em>\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b<\/em>\u00bb&#8230;<\/p>\n<\/li>\n<li>\n<p><abbr class=\"habraabbr\" title=\"\" data-title=\"&lt;p>&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/85f\/295\/7dc\/85f2957dcb356a4fe2e1b974fbe26c03.jpg&#187; data-abbr=&#187;\u0422\u044f\u043d&#187; data-image-width=&#187;736&#8243; data-image-height=&#187;1102&#8243;>\u0422\u044f\u043d<\/abbr> (\u0442\u044f\u043d\u043a\u0430, tyan)\u00a0\u2014 <abbr class=\"habraabbr\" title=\"\u0440\u0435\u0434. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 &quot;\u0442\u044f\u043d&quot; \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u0434\u0435\u0432\u0443\u0448\u043a\u0443, \u043d\u043e \u0432 \u042f\u043f\u043e\u043d\u0441\u043a\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0432\u0443\u0448\u043a\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441. \u0422\u044f\u043d, \u043a\u0443\u043d, \u0441\u0430\u043d, \u0441\u0430\u043c\u0430 - \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b. &quot;\u0422\u044f\u043d&quot; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0431\u044f \u043c\u043b\u0430\u0434\u0448\u0435. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e &quot;\u0442\u044f\u043d&quot; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0434\u0435\u0432\u043e\u0447\u043a\u0435. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043c\u0443\u0436\u0441\u043a\u043e\u043c \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0443\u0436\u0447\u0438\u043d\u0430\u043c.\" data-title=\"&lt;p>\u043c\u043b\u0430\u0434\u0448\u0435. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e&quot;\u0442\u044f\u043d&quot; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0434\u0435\u0432\u043e\u0447\u043a\u0435. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043c\u0443\u0436\u0441\u043a\u043e\u043c \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0443\u0436\u0447\u0438\u043d\u0430\u043c.&#187; data-title=&#187;&lt;p>\u0440\u0435\u0434. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435 &quot;\u0442\u044f\u043d&quot; \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u043b\u043e\u0441\u044c \u0432 \u0434\u0435\u0432\u0443\u0448\u043a\u0443, \u043d\u043e \u0432 \u042f\u043f\u043e\u043d\u0441\u043a\u043e\u043c \u044d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0434\u0435\u0432\u0443\u0448\u043a\u0430, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435, \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441. \u0422\u044f\u043d, \u043a\u0443\u043d, \u0441\u0430\u043d, \u0441\u0430\u043c\u0430 &#8212; \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u0438\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u044b. &quot;\u0422\u044f\u043d&quot; \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0431\u044f \u043c\u043b\u0430\u0434\u0448\u0435. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e &quot;\u0442\u044f\u043d&quot; \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u0439 \u0434\u0435\u0432\u043e\u0447\u043a\u0435.&lt;em>&amp;nbsp;\u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 \u043c\u0443\u0436\u0441\u043a\u043e\u043c \u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0435 \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u043a \u043c\u0443\u0436\u0447\u0438\u043d\u0430\u043c.&lt;\/em>&lt;\/p>&#187; data-abbr=&#187;\u0434\u0435\u0432\u0443\u0448\u043a\u0430? \u041d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c&#187;>\u0434\u0435\u0432\u0443\u0448\u043a\u0430<\/abbr> \u0432\u00a0\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0435 \u0441\u00a0\u044f\u043f\u043e\u043d\u0441\u043a\u043e\u0433\u043e. \u041f\u043e\u043d\u044f\u0442\u0438\u0435 \u0441\u0442\u0430\u043b\u043e \u043c\u043e\u043b\u043e\u0434\u0451\u0436\u043d\u044b\u043c, \u0442\u0430\u043a \u043a\u0430\u043a\u00a0\u0441\u0443\u0444\u0444\u0438\u043a\u0441 \u00ab\u0442\u044f\u043d\u00bb \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u044f\u043f\u043e\u043d\u0441\u043a\u0438\u0445 \u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f\u0445 \u2013 <strong><abbr class=\"habraabbr\" title=\"\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u0432, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u044b\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u043a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c \u0438 \u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u044f\u043c. \u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435\u00a0 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u0430\u043d\u0438\u043c\u0435 &quot;\u0421\u0443\u0434\u044c\u0431\u0430\/\u043d\u043e\u0447\u044c \u0441\u0445\u0432\u0430\u0442\u043a\u0438&quot;\" data-title=\"&lt;p>\u043c. \u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435\u00a0 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u0430\u043d\u0438\u043c\u0435 &quot;\u0421\u0443\u0434\u044c\u0431\u0430\/\u043d\u043e\u0447\u044c \u0441\u0445\u0432\u0430\u0442\u043a\u0438&quot;&#187; data-title=&#187;&lt;p>\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u043b\u044e\u0431\u044b\u0445 \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u043e\u0432, \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u044e\u0449\u0438\u0435\u0441\u044f \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u044b\u043c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435\u043c \u043a \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0430\u043c \u0438 \u0438\u0445 \u044d\u043c\u043e\u0446\u0438\u044f\u043c.&lt;\/p>&lt;p>\u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435&amp;nbsp; \u043c\u043e\u043c\u0435\u043d\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u0430\u043d\u0438\u043c\u0435 &quot;\u0421\u0443\u0434\u044c\u0431\u0430\/\u043d\u043e\u0447\u044c \u0441\u0445\u0432\u0430\u0442\u043a\u0438&quot;&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a13\/384\/831\/a1338483130d49ab0ad77c31ebb7f544.gif&#187; data-abbr=&#187;\u0430\u043d\u0438\u043c\u0435&#187; data-image-width=&#187;540&#8243; data-image-height=&#187;304&#8243;>\u0430\u043d\u0438\u043c\u0435<\/abbr><\/strong>. \u0412\u043e\u043e\u0431\u0449\u0435, \u0441 \u0430\u043d\u0438\u043c\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0442\u0440\u0435\u043d\u0434\u043e\u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043c\u043e\u043b\u043e\u0434\u0451\u0436\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u043e\u0442\u00a0\u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u043a\u043e\u0432 \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u044f \u0441\u0430\u043c\u044b\u043c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u043c \u0430\u043d\u0438\u043c\u0435\u2011\u0441\u0435\u043a\u0442\u0430\u043d\u0442\u0441\u0442\u0432\u043e\u043c (\u0448\u0443\u0442\u043a\u0430). <abbr class=\"habraabbr\" title=\"\u041d\u0430 \u0444\u043e\u0442\u043e \u043b\u044e\u0434\u0438, \u043f\u0435\u0440\u0435\u043e\u0434\u0435\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 &quot;\u0410\u043a\u0430\u0442\u0441\u0443\u043a\u0438&quot; \u0438\u0437 \u0430\u043d\u0438\u043c\u0435 &quot;\u041d\u0430\u0440\u0443\u0442\u043e&quot;\" data-title=\"&lt;p>quot; \u0438\u0437 \u0430\u043d\u0438\u043c\u0435 &quot;\u041d\u0430\u0440\u0443\u0442\u043e&quot;&#187; data-title=&#187;&lt;p>\u041d\u0430 \u0444\u043e\u0442\u043e \u043b\u044e\u0434\u0438, \u043f\u0435\u0440\u0435\u043e\u0434\u0435\u0432\u0448\u0438\u0435\u0441\u044f \u0432 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436\u0435\u0439 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 &quot;\u0410\u043a\u0430\u0442\u0441\u0443\u043a\u0438&quot; \u0438\u0437 \u0430\u043d\u0438\u043c\u0435 &quot;\u041d\u0430\u0440\u0443\u0442\u043e&quot;&lt;\/p>&#187; data-image=&#187;https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/091\/a00\/8d7\/091a008d75d2270b751dc3853ee13d03.jpg&#187; data-abbr=&#187;\u0410\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u0438&#187; data-image-width=&#187;604&#8243; data-image-height=&#187;453&#8243;>\u0410\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u0438<\/abbr>\u00a0\u2014 \u043e\u0441\u043e\u0431\u043e \u044f\u0440\u044b\u0435 \u0437\u043d\u0430\u0442\u043e\u043a\u0438 \u0430\u043d\u0438\u043c\u0435, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430\u00a0\u0441\u0432\u043e\u044e \u0431\u0435\u0437\u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u044c, \u0432\u043e\u00a0\u0432\u0440\u0435\u043c\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0437\u0430\u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u0434\u0432\u0435\u0440\u0433\u0430\u043b\u0438\u0441\u044c \u0431\u0443\u043b\u043b\u0438\u043d\u0433\u0443 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043e\u0441\u043e\u0431\u043e \u043a\u043e\u043d\u0441\u0435\u0440\u0432\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u043c\u0430\u043b\u043e\u043b\u0435\u0442\u043d\u0438\u0445 \u043d\u0435\u0430\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u043e\u0432, \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0437\u00a0\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043f\u043e\u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0438 \u0442\u043e\u0436\u0435 \u0441\u0442\u0430\u043b\u0438 \u0430\u043d\u0438\u043c\u0435\u0448\u043d\u0438\u043a\u0430\u043c\u0438. \u0412\u00a0\u043e\u0431\u0449\u0435\u043c, \u044d\u0442\u043e \u0432\u0441\u0451 \u043e\u0447\u0435\u043d\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0442\u0435\u043c\u0430, \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0438 \u0432\u00a0\u0433\u0443\u0433\u043b\u0435.<\/p>\n<\/li>\n<li>\n<p><abbr class=\"habraabbr\" title=\"\u041c\u043d\u043e\u0433\u0438\u0435 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u0430\u043a \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0435\u0435) \u043f\u0438\u0448\u0443\u0442 \u0434\u043e\u043a\u0438\u043c\u0430\u0442\u0443\u0440\u0430, \u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442 &quot;\u0434\u0430\u043a\u0438\u043c\u0430\u043a\u0443\u0440\u0430&quot;.\" data-title=\"&lt;p>\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0431\u0443\u0434\u0435\u0442&quot;\u0434\u0430\u043a\u0438\u043c\u0430\u043a\u0443\u0440\u0430&quot;.&#187;<\/abbr><\/p>\n<\/li>\n<\/ul>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-375446","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/375446","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=375446"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/375446\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=375446"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=375446"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=375446"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}