{"id":500888,"date":"2026-10-29T15:09:38","date_gmt":"2026-10-29T12:09:38","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=500888"},"modified":"2026-10-29T15:09:38","modified_gmt":"2026-10-29T12:09:38","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=500888","title":{"rendered":"\u041b\u0430\u0443\u043d\u0447\u0435\u0440 Minecraft \u043d\u0430 Rust \u0438 iroh: P2P-\u043a\u043e\u043c\u043d\u0430\u0442\u044b, \u0430\u0432\u0442\u043e\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0431\u043e\u0440\u043e\u043a \u0438 \u0433\u043e\u043b\u043e\u0441 \u043f\u043e\u0432\u0435\u0440\u0445 QUIC"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u0417\u0430\u0434\u0430\u0447\u0430<\/h3>\n<p>\u0418\u0433\u0440\u0430\u0442\u044c \u0432\u0434\u0432\u043e\u0451\u043c \u0432 Minecraft \u0441 \u043c\u043e\u0434\u0430\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f. \u041d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0443 \u043e\u0431\u043e\u0438\u0445 \u0441\u043e\u0432\u043f\u0430\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0433\u0440\u044b, \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a (Fabric, Forge, NeoForge, Quilt), \u043d\u0430\u0431\u043e\u0440 \u043c\u043e\u0434\u043e\u0432 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0435\u0449\u0451 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0432 \u0441\u0435\u0442\u0438, \u0430 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e Hamachi, \u043f\u0440\u043e\u0431\u0440\u043e\u0441 \u043f\u043e\u0440\u0442\u043e\u0432 \u0438\u043b\u0438 \u0430\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.<\/p>\n<p>\u042f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0435\u0431\u0435 \u0442\u0430\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<ol>\n<li>\n<p>\u0411\u0435\u0437 \u0431\u0435\u043b\u043e\u0433\u043e IP \u0438 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u043f\u043e\u0440\u0442\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0413\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u0445\u043e\u0441\u0442\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438.<\/p>\n<\/li>\n<li>\n<p>\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0447\u0430\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 \u0442\u043e\u0442 \u0436\u0435 \u043a\u0430\u043d\u0430\u043b.<\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 MineDed (GPL-3.0, Windows \u0438 Linux). \u041d\u0438\u0436\u0435 \u2014 \u043a\u0430\u043a \u043e\u043d \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b. \u041f\u0440\u043e\u0435\u043a\u0442 \u043f\u0438\u0441\u0430\u043b\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Claude Code, \u0438 \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430<\/h3>\n<p>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Tauri 2: \u044f\u0434\u0440\u043e \u043d\u0430 Rust, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 React 19 \u0438 TypeScript. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0432\u0435\u0441\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 10 \u041c\u0411, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u2014 Cargo workspace, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0440\u0435\u0439\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u043e\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041a\u0440\u0435\u0439\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-types<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0431\u0449\u0438\u0435 DTO, <code>AppError<\/code>, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-runtime<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043f\u0443\u0442\u0438, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, <code>LaunchPlan<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-http<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0435\u0434\u0438\u043d\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-core<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0433\u0440\u044b, Java, \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b, \u0437\u0430\u043f\u0443\u0441\u043a<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-loaders<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Fabric, Quilt, Forge, NeoForge<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-content<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u0430\u0442\u0430\u043b\u043e\u0433 Modrinth, \u043c\u043e\u0434\u043f\u0430\u043a\u0438, \u043f\u0440\u0435\u0441\u0435\u0442\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-accounts<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043e\u0444\u0444\u043b\u0430\u0439\u043d-\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b, Yggdrasil, keyring, \u0441\u043a\u0438\u043d\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-p2p<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043e\u043c\u043d\u0430\u0442\u044b \u043d\u0430 iroh, \u0442\u0443\u043d\u043d\u0435\u043b\u044c, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>lc-voice<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0447\u0430\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>apps\/desktop<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Tauri-\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 (<code>src-tauri<\/code>) \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (<code>src<\/code>)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0436\u0438\u0432\u0451\u0442 \u0432 Docker: <code>hub<\/code> \u043d\u0430 axum, \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043a\u0438\u043d\u043e\u0432 Drasl, Caddy \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>iroh-relay<\/code>.<\/p>\n<h4>\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438<\/h4>\n<p>\u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0440\u0435\u0439\u0442\u0435 \u0435\u0441\u0442\u044c <code>src\/contract.rs<\/code> \u0441 \u0442\u0440\u0435\u0439\u0442\u0430\u043c\u0438 \u0438 <code>src\/stub.rs<\/code> \u0441 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u0442\u0440\u0435\u0439\u0442\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0440\u0435\u0439\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438 \u043d\u0435 \u043b\u043e\u043c\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u043b\u0438\u043d\u0442\u0435\u0440\u0430\u043c\u0438 \u0438 \u0440\u0435\u0432\u044c\u044e:<\/p>\n<ul>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 Tauri. \u041d\u0430\u0440\u0443\u0436\u0443 \u043e\u043d\u0438 \u043e\u0442\u0434\u0430\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0440\u0435\u0439\u0442\u044b <code>*Observer<\/code>, \u0430 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438\u0445 \u043a IPC.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043b\u0433\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 <code>&amp;dyn ProgressSink<\/code> \u0438 \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0433\u0430\u043c\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 <code>check_cancelled()<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0448\u0438\u0431\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u0440\u0435\u0439\u0442\u0430\u043c\u0438 \u0438 \u0447\u0435\u0440\u0435\u0437 IPC \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a <code>AppError<\/code> \u0441 <code>ErrorCode<\/code>, \u0434\u0435\u0442\u0430\u043b\u0438 \u2014 \u0447\u0435\u0440\u0435\u0437 <code>.detail(key, value)<\/code>.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 <code>lc_http::Downloader<\/code>. \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 <code>reqwest::Client<\/code> \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u0440\u0435\u0439\u0442\u0430\u0445 \u043d\u0435\u043b\u044c\u0437\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0443\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 <code>lc_runtime::Paths<\/code>, \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0438\u043f\u0435 <code>Secret<\/code> \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0432 \u043b\u043e\u0433\u0430\u0445.<\/p>\n<\/li>\n<li>\n<p><code>unwrap<\/code> \u0438 <code>expect<\/code> \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b \u0432\u043d\u0435 \u0442\u0435\u0441\u0442\u043e\u0432, <code>unsafe<\/code> \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d workspace-\u043b\u0438\u043d\u0442\u043e\u043c, clippy \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441 <code>-D warnings<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0438\u043f\u044b Rust \u2192 TypeScript \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>specta<\/code> \u0438 <code>tauri-specta<\/code> (\u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0430 \u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0438\u043d\u043e\u043c), \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043b\u0435\u0436\u0438\u0442 \u0432 <code>bindings.ts<\/code> \u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u0422\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 IPC \u043d\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c.<\/p>\n<p>\u042f\u0434\u0440\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 (<code>crates\/lc-p2p\/src\/proto.rs<\/code>, \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043e):<\/p>\n<pre><code class=\"rust\">pub const ALPN: &amp;[u8] = b\"lc\/1\";pub const PROTOCOL_VERSION: u32 = 1;\/\/\/ Above this many peers the host forwards voice instead of full mesh.pub const MESH_LIMIT: usize = 6;#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]#[serde(tag = \"t\", rename_all = \"snake_case\")]pub enum ControlMsg {    Hello { protocol: u32, name: String, uuid: Option&lt;String&gt;,            peer_token: String, password_proof: Option&lt;String&gt; },    Welcome { peers: Vec&lt;String&gt;, peer_names: Vec&lt;String&gt; },    Ping { nonce: u64 },    Pong { nonce: u64 },    Chat { id: String, text: String, sent_at: String \/* \u2026 *\/ },    VoiceState { speaking: bool, muted: bool, peer: Option&lt;String&gt; },    Kick { reason: String },    Bye,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u0442\u0435\u0441\u0442\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>ControlMsg::Ping<\/code> \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u0432 <code>{\"t\":\"ping\",\"nonce\":1}<\/code>, \u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0441\u0442.<\/p>\n<h3>\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442: iroh<\/h3>\n<p>\u0414\u043b\u044f P2P \u044f \u0432\u044b\u0431\u0440\u0430\u043b iroh. \u041e\u043d \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 QUIC, \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442 \u0443\u0437\u043b\u044b \u043f\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443, \u0441\u0430\u043c \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0438\u0442\u044c NAT \u0438 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 relay-\u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 hole punching \u0438 \u0441\u0432\u043e\u044e \u0441\u0445\u0435\u043c\u0443 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043b\u044f \u0438\u0433\u0440\u043e\u043a\u0430:<\/p>\n<ul>\n<li>\n<p>\u0425\u043e\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043c\u043d\u0430\u0442\u0443, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u0434 \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u0432\u0438\u0434\u0430 <code>https:\/\/mineded.dedseckms.ru\/join\/\u041a\u041e\u0414<\/code>. \u041a\u043e\u043c\u043d\u0430\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0435\u043c.<\/p>\n<\/li>\n<li>\n<p>\u0413\u043e\u0441\u0442\u044c \u0432\u0432\u043e\u0434\u0438\u0442 \u043a\u043e\u0434 \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443, \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u0440\u044f\u043c\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e (\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 NAT, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442), \u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 relay. \u041e\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c, \u0438 relay \u0432\u0438\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u043a\u043e\u0434\u0435 \u0437\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0440\u0435\u0439\u0442 <code>lc-p2p<\/code>, \u0430 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u044b\u043d\u0435\u0441\u0435\u043d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <code>proto.rs<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b, \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e.<\/p>\n<p>\u041c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043e\u0434\u043d\u043e QUIC-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 ALPN <code>lc\/1<\/code>, \u0438 \u0432 \u043d\u0451\u043c \u0445\u043e\u0434\u0438\u0442 \u0442\u0440\u0438 \u0432\u0438\u0434\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0427\u0442\u043e<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, JSON \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 (<code>ControlMsg<\/code>)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u0433\u0440\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u0430\u0436\u0434\u043e\u0435 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 Minecraft \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 <code>StreamOpen<\/code>, \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u044b\u0440\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0413\u043e\u043b\u043e\u0441<\/p>\n<\/td>\n<td>\n<p align=\"left\">QUIC-\u0434\u0430\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u044b: 8-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u043a\u0430\u0434\u0440 Opus \u043d\u0430 20 \u043c\u0441<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u043c \u0438\u0434\u0451\u0442 <code>Hello<\/code> \u0441 \u0434\u0432\u0443\u043c\u044f \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u043c\u0438. <code>peer_token<\/code> \u0432\u044b\u0434\u0430\u0451\u0442 hub-\u0441\u0435\u0440\u0432\u0435\u0440 (axum): \u043e\u043d \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435, \u0438 \u0445\u043e\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u0441\u0432\u043e\u0438\u043c <code>hostToken<\/code>. \u0414\u043b\u044f \u043a\u043e\u043c\u043d\u0430\u0442 \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>password_proof<\/code> \u2014 HMAC-SHA256, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447 \u2014 \u043f\u0430\u0440\u043e\u043b\u044c, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 TLS-\u0441\u0435\u0441\u0441\u0438\u0438, \u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u043d\u0430\u0442\u044b. \u0421\u0430\u043c \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e \u0441\u0435\u0442\u0438 \u043d\u0435 \u0438\u0434\u0451\u0442, \u0430 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 TLS-\u0441\u0435\u0441\u0441\u0438\u0438.<\/p>\n<p>\u041a\u043e\u0434 \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 <code>ABCD-1234<\/code> (\u0432\u043e\u0441\u0435\u043c\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0430 \u0438 \u0446\u0438\u0444\u0440\u044b). <code>parse_code<\/code> \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432\u0432\u043e\u0434: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u043a\u043e\u0434 \u0431\u0435\u0437 \u0434\u0435\u0444\u0438\u0441\u0430 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u043c <code>?query<\/code> \u0438\u043b\u0438 <code>#fragment<\/code>. \u0414\u0440\u0443\u0437\u044c\u044f\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 <code>https:\/\/mineded.dedseckms.ru\/join\/\u041a\u041e\u0414<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0430\u0439\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 <code>mineded:\/\/join\/\u041a\u041e\u0414<\/code>, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u044b (\u043f\u043b\u0430\u0433\u0438\u043d deep-link \u0432 Tauri). \u0421\u0442\u0430\u0440\u0430\u044f \u0441\u0445\u0435\u043c\u0430 <code>mineup:\/\/<\/code>, \u043e\u0441\u0442\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u0422\u0443\u043d\u043d\u0435\u043b\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430<\/h3>\n<p>Minecraft \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 TCP-\u0430\u0434\u0440\u0435\u0441\u0443 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u0433\u043e\u0441\u0442\u044f \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u043d\u0430 <code>127.0.0.1:\u043f\u043e\u0440\u0442<\/code> \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438\u0433\u0440\u044b. \u0414\u043b\u044f Minecraft \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a QUIC \u043a \u0445\u043e\u0441\u0442\u0443, \u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0445\u043e\u0441\u0442\u0430 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u0440\u0442\u043e\u043c \u043c\u0438\u0440\u0430, \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u00ab\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0442\u0438\u00bb (Esc \u2192 \u00ab\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0442\u0438\u00bb). \u0418\u0433\u0440\u043e\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f iroh.<\/p>\n<p>\u0425\u043e\u0441\u0442\u0443 \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u0442\u0443 Minecraft \u043e\u0442\u043a\u0440\u044b\u043b \u043c\u0438\u0440 \u0434\u043b\u044f \u0441\u0435\u0442\u0438, \u0430 \u043f\u043e\u0440\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043d\u043e\u0432\u044b\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0438 \u043e\u0431\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f.<\/p>\n<ol>\n<li>\n<p><strong>LAN-\u0430\u043d\u043e\u043d\u0441\u044b.<\/strong> \u0418\u0433\u0440\u0430 \u0440\u0430\u0437 \u0432 ~1,5 \u0441 \u0448\u043b\u0451\u0442 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 <code>224.0.2.60:4445<\/code> \u043f\u0430\u043a\u0435\u0442 \u0432\u0438\u0434\u0430 <code>[MOTD]\u2026[\/MOTD][AD]\u043f\u043e\u0440\u0442[\/AD]<\/code>. \u041b\u0430\u0443\u043d\u0447\u0435\u0440 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 (\u0441\u043e\u043a\u0435\u0442 \u0441 <code>SO_REUSEADDR<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0440\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043a\u0430\u043d\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u044b), \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u0440\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 <code>127.0.0.1:\u043f\u043e\u0440\u0442<\/code> \u0437\u0430 700 \u043c\u0441. \u0422\u0430\u043a \u0430\u043d\u043e\u043d\u0441 \u0441\u043e\u0441\u0435\u0434\u0430 \u043f\u043e Wi-Fi \u043d\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442 \u0442\u0443\u043d\u043d\u0435\u043b\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041b\u043e\u0433 \u0438\u0433\u0440\u044b.<\/strong> \u0421\u0442\u0440\u043e\u043a\u0438 <code>Started serving on &lt;\u043f\u043e\u0440\u0442&gt;<\/code> \u0438 <code>Local game hosted on port &lt;\u043f\u043e\u0440\u0442&gt;<\/code>. \u0421\u0442\u0440\u043e\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 (<code>Render thread<\/code>, \u0434\u043e 1.13 <code>Client thread<\/code>), \u0430 \u0443 Forge \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u0440\u0441\u0435\u0440 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.<\/p>\n<\/li>\n<\/ol>\n<p>\u041b\u043e\u0433 \u2014 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 <code>[CHAT]<\/code> \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0430 \u0440\u0430\u0437\u0431\u043e\u0440 \u0431\u0435\u0440\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u0433\u0440\u044b. \u0418\u043d\u0430\u0447\u0435 \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0433 \u0431\u044b \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0432 \u0447\u0430\u0442\u0435 \u00abStarted serving on 22\u00bb \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u043d\u0430 \u0447\u0443\u0436\u043e\u0439 \u043f\u043e\u0440\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 <code>chat_lines_are_ignored<\/code>:<\/p>\n<pre><code class=\"rust\">pub fn port_from_log_line(line: &amp;str) -&gt; Option&lt;u16&gt; {    const MARKERS: [&amp;str; 2] = [\"Started serving on \", \"Local game hosted on port \"];    if line.contains(\"[CHAT]\") {        return None;    }    \/\/ Log4j prefix ends at the first \"]: \": `[time] [Server thread\/INFO]: msg`    let end = line.find(\"]: \")?;    let prefix = &amp;line[..end + 1];    let msg = &amp;line[end + 3..];    \/\/ \u2026 only [Server thread\/INFO], [Render thread\/INFO], [Client thread\/INFO]}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0433\u043e\u0441\u0442\u044f \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u0432 <code>servers.dat<\/code> \u0438\u0433\u0440\u044b \u0438 \u0440\u0430\u0441\u0441\u044b\u043b\u0430\u0435\u0442 \u0442\u0435 \u0436\u0435 LAN-\u0430\u043d\u043e\u043d\u0441\u044b \u0441 TTL 0, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043c\u0430\u0448\u0438\u043d\u044b. MOTD \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u043a\u043e\u0431\u043e\u043a \u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0434\u043e 64 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0417\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u043c\u043d\u0430\u0442, \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439.<\/p>\n<h3>\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u0431\u043e\u0440\u043a\u0438<\/h3>\n<p>\u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u044f \u0432\u0437\u044f\u043b <code>.mrpack<\/code>: \u044d\u0442\u043e ZIP \u0441 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u043c <code>modrinth.index.json<\/code> \u0438 \u043f\u0430\u043f\u043a\u043e\u0439 <code>overrides\/<\/code>. \u0412 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0444\u0430\u0439\u043b\u044b \u0441 \u0445\u044d\u0448\u0430\u043c\u0438 \u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435, \u0430 \u0432 <code>overrides<\/code> \u043b\u0435\u0436\u0438\u0442 \u0442\u043e, \u0447\u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 Modrinth.<\/p>\n<p>\u0421\u0445\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438:<\/p>\n<ul>\n<li>\n<p>\u041c\u043e\u0434\u044b, \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043f\u0430\u043a\u0438 \u0441 Modrinth \u0443\u0445\u043e\u0434\u044f\u0442 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438. \u0413\u043e\u0441\u0442\u044c \u043a\u0430\u0447\u0430\u0435\u0442 \u0438\u0445 \u0441\u0430\u043c \u0441 CDN, \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b \u0445\u043e\u0441\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u043e P2P-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0443 \u0433\u043e\u0441\u0442\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043e\u043d\u0430 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u00ab\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0438\u0433\u0440\u0430\u0442\u044c\u00bb \u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a, \u043c\u043e\u0434\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c QUIC. \u0413\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0438 \u043f\u0438\u0448\u0435\u0442 <code>StreamOpen::Pack { version }<\/code>, \u0445\u043e\u0441\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 <code>PackReply<\/code>, \u043f\u043e\u0441\u043b\u0435 <code>Ready<\/code> \u0438\u0434\u0451\u0442 \u0440\u043e\u0432\u043d\u043e <code>size<\/code> \u0441\u044b\u0440\u044b\u0445 \u0431\u0430\u0439\u0442, \u0438 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"rust\">pub enum StreamOpen {    Game,    Pack { version: u32 },}pub enum PackReply {    \/\/\/ `sha256`: lowercase hex of the whole file.    Ready { size: u64, sha256: String },    \/\/\/ `reason`: `unsupported` (pack version), `not_game_room`, `too_large`, `export_failed`.    Error { reason: String },}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0425\u043e\u0441\u0442\u044b \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a \u0431\u0435\u0437 \u043e\u0442\u0432\u0435\u0442\u0430. \u042d\u0442\u043e \u0443\u0447\u0442\u0435\u043d\u043e \u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0443\u0436\u043d\u0430 \u043b\u0438 \u0433\u043e\u0441\u0442\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430, \u043a\u043e\u043c\u043d\u0430\u0442\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u0431\u043e\u0440\u043a\u0438 (<code>InstanceSig<\/code>): \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0433\u0440\u044b, \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a, \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u0438 <code>mods_hash<\/code>. \u0425\u044d\u0448 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443, \u0430 \u043d\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c \u0444\u0430\u0439\u043b\u043e\u0432: \u0431\u0435\u0440\u0451\u0442\u0441\u044f SHA-256 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0433\u043e <code>mods\/*.jar<\/code>, \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u043e\u0442 \u043d\u0435\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f SHA-256 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c:<\/p>\n<pre><code class=\"rust\">hashes.sort();let mut h = Sha256::new();for x in &amp;hashes {    h.update(x.as_bytes());    h.update(b\"\\n\");}Ok(hex::encode(h.finalize()))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u044b \u0434\u0430\u044e\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0445\u044d\u0448, \u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 (<code>.jar.disabled<\/code>) \u0438 \u043d\u0435-jar \u0444\u0430\u0439\u043b\u044b \u0432 \u043d\u0435\u0433\u043e \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442. \u0422\u0435\u0441\u0442 <code>mods_hash_ignores_order_and_non_jars<\/code> \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e.<\/p>\n<p><strong>\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0445\u043e\u0441\u0442\u0430.<\/strong> \u0425\u043e\u0441\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 <code>.mrpack<\/code> \u0438\u0437 \u0438\u0433\u0440\u043e\u0432\u043e\u0439 \u043f\u0430\u043f\u043a\u0438 (\u043a\u0440\u043e\u043c\u0435 <code>logs<\/code>, <code>crash-reports<\/code>, <code>screenshots<\/code>, <code>saves<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u043f\u0430\u043f\u043e\u043a). \u0424\u0430\u0439\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0441\u0442\u0430\u0432\u0438\u043b \u0438\u0437 Modrinth \u0438 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b URL, sha1 \u0438 sha512, \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 <code>modrinth.index.json<\/code> \u0441\u0441\u044b\u043b\u043a\u043e\u0439. \u0412\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 (\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u044b, \u043a\u043e\u043d\u0444\u0438\u0433\u0438) \u043a\u043b\u0430\u0434\u0451\u0442\u0441\u044f \u0432 <code>overrides\/<\/code>. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u044d\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u043e\u043c\u043d\u0430\u0442\u0443 \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043a\u043e\u043c\u043d\u0430\u0442\u0430 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p><strong>\u0418\u043c\u043f\u043e\u0440\u0442 <\/strong><code><strong>.mrpack<\/strong><\/code> \u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u0435\u0442 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438: \u0438\u0433\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c <code>minecraft<\/code>, \u0444\u0430\u0439\u043b\u044b \u0441 <code>env.client = unsupported<\/code> \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f, \u0430 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043d\u0443\u0436\u043d\u044b URL \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u043e\u0433\u043e \u0445\u043e\u0441\u0442\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 sha1 \u0438 sha512. \u0424\u0430\u0439\u043b\u044b \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 staging-\u043f\u0430\u043f\u043a\u0443 \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u0442\u043e\u043c\u0435, \u0447\u0442\u043e \u0438 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b (\u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0445 \u0431\u0435\u0437 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f), \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u043e sha1 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438 \u043f\u043e sha512 \u043f\u043e\u0441\u043b\u0435, \u0437\u0430\u0442\u0435\u043c \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f <code>overrides<\/code> \u0438 <code>client-overrides<\/code>. \u0415\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0438\u0434\u0451\u0442 \u043d\u0435 \u0442\u0430\u043a, \u043f\u043e\u043b\u0443\u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0430\u043d\u0441 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f.<\/p>\n<h4>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0434\u043e\u0432<\/h4>\n<p>\u0421\u0432\u043e\u0438 \u043c\u043e\u0434\u044b \u0441 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0435\u0442 \u043f\u043e \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0432\u043d\u0443\u0442\u0440\u0438 <code>.jar<\/code>: \u0434\u043b\u044f Fabric \u044d\u0442\u043e <code>fabric.mod.json<\/code>, \u0434\u043b\u044f Quilt <code>quilt.mod.json<\/code>, \u0434\u043b\u044f Forge \u0438 NeoForge <code>META-INF\/mods.toml<\/code> \u0438 <code>META-INF\/neoforge.mods.toml<\/code>. \u041e\u0442\u0442\u0443\u0434\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0432\u0435\u0440\u0441\u0438\u044f \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0415\u0441\u043b\u0438 \u0447\u0435\u0433\u043e-\u0442\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442, \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0435\u0435 \u0438\u0437 Modrinth.<\/p>\n<p>\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043d\u0430 Modrinth API v2 (\u043a\u043b\u044e\u0447 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d). \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u0435\u0441\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0441 \u0442\u0438\u043f\u0430\u043c\u0438 <code>required<\/code>, <code>optional<\/code>, <code>incompatible<\/code> \u0438 <code>embedded<\/code>, \u0438 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442 \u0438\u0445 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0438\u043d\u0434\u0435\u043a\u0441 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430: \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432\u0438\u0434 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430, \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, <code>project_id<\/code>, <code>version_id<\/code>, sha1, sha512, \u0440\u0430\u0437\u043c\u0435\u0440 \u0438 URL. \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043e\u043a \u0438\u0437 <code>.mrpack<\/code> \u0432\u044b\u043d\u0438\u043c\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0441\u0430\u043c\u043e\u0433\u043e CDN-\u0430\u0434\u0440\u0435\u0441\u0430 \u0432\u0438\u0434\u0430 <code>cdn.modrinth.com\/data\/&lt;\u043f\u0440\u043e\u0435\u043a\u0442&gt;\/versions\/&lt;\u0432\u0435\u0440\u0441\u0438\u044f&gt;\/&lt;\u0444\u0430\u0439\u043b&gt;<\/code>.<\/p>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043f\u043e \u0445\u044d\u0448\u0430\u043c, \u0430 \u043d\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c \u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<pre><code class=\"rust\">let body = serde_json::json!({    \"hashes\": hashes,    \"algorithm\": \"sha1\",    \"loaders\": loaders,    \"game_versions\": [target.mc],});<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043e\u0434\u0438\u043d <code>POST \/version_files\/update<\/code> \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0432\u0438\u0434 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 (\u043c\u043e\u0434\u044b, \u0440\u0435\u0441\u0443\u0440\u0441\u043f\u0430\u043a\u0438, \u0448\u0435\u0439\u0434\u0435\u0440\u044b, \u0434\u0430\u0442\u0430\u043f\u0430\u043a\u0438). \u0414\u043b\u044f Quilt \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u043e\u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0435\u0442\u0441\u044f \u0434\u043e <code>quilt<\/code> \u0438 <code>fabric<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e Fabric-\u043c\u043e\u0434\u043e\u0432 \u043d\u0430 \u043d\u0451\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u043b\u044f \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a\u0438 <code>iris<\/code>, <code>optifine<\/code>, <code>canvas<\/code> \u0438 <code>vanilla<\/code>. \u0414\u043b\u044f \u043c\u043e\u0434\u043f\u0430\u043a\u043e\u0432 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043f\u043e \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0443: featured-\u0440\u0435\u043b\u0438\u0437, \u0437\u0430\u0442\u0435\u043c \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u043b\u0438\u0437, \u0437\u0430\u0442\u0435\u043c \u0441\u0430\u043c\u0430\u044f \u0441\u0432\u0435\u0436\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0441 <code>.mrpack<\/code>. \u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0435\u0440\u0435\u0434 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0432 URL \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f: \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0430, \u0446\u0438\u0444\u0440\u044b, <code>-<\/code> \u0438 <code>_<\/code>.<\/p>\n<h3>\u0413\u043e\u043b\u043e\u0441<\/h3>\n<p>\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0447\u0430\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0443. \u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f:<\/p>\n<ul>\n<li>\n<p>\u043a\u043e\u0434\u0435\u043a Opus, 36 \u043a\u0431\u0438\u0442\/\u0441;<\/p>\n<\/li>\n<li>\n<p>\u0448\u0443\u043c\u043e\u043f\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 RNNoise;<\/p>\n<\/li>\n<li>\n<p>\u0444\u0438\u043b\u044c\u0442\u0440 \u0434\u043b\u044f \u043d\u0438\u0437\u043a\u043e\u0447\u0430\u0441\u0442\u043e\u0442\u043d\u043e\u0433\u043e \u0433\u0443\u043b\u0430 \u0438 \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0447\u0438 \u0441 \u043f\u0440\u0435\u0434\u0437\u0430\u0445\u0432\u0430\u0442\u043e\u043c \u0438 \u00ab\u0445\u0432\u043e\u0441\u0442\u043e\u043c\u00bb, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0433\u043b\u043e\u0442\u0430\u043b\u0438\u0441\u044c \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u0444\u0440\u0430\u0437;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430 \u043f\u0440\u0438\u0451\u043c\u043d\u0438\u043a\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0415\u0441\u0442\u044c push-to-talk \u0441 \u0432\u044b\u0431\u043e\u0440\u043e\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0433\u043e\u043b\u043e\u0441\u043e\u043c, \u0440\u0435\u0433\u0443\u043b\u0438\u0440\u043e\u0432\u043a\u0430 \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430 \u0438 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e\u0432\u0435\u0440\u0445 \u0438\u0433\u0440\u044b. \u041e\u0432\u0435\u0440\u043b\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u043a\u043e\u043d\u043d\u043e\u043c \u0438 borderless-\u0440\u0435\u0436\u0438\u043c\u0430\u0445, \u043d\u043e \u043d\u0435 \u0432 \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u043c, \u0430 \u043d\u0430 Wayland \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0434\u0435\u0440\u0436\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u0432\u0435\u0440\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d.<\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0441\u043b\u0443\u0445: \u043c\u044b \u0441 \u0434\u0440\u0443\u0433\u043e\u043c \u0437\u0430\u0445\u043e\u0434\u0438\u043b\u0438 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u043d\u0430\u0442\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0440\u0435\u0447\u0438, \u0440\u0430\u0431\u043e\u0442\u0443 \u0448\u0443\u043c\u043e\u043f\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443. \u0412 \u0432\u0435\u0440\u0441\u0438\u0438 1.2.1 \u044d\u0442\u043e \u0434\u0430\u043b\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442: \u043f\u0440\u043e\u043f\u0430\u043b \u00ab\u0432\u0435\u0440\u0442\u043e\u043b\u0451\u0442\u00bb \u043d\u0430 \u0444\u043e\u043d\u0435 \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b\u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0442\u044c\u0441\u044f \u0441\u043b\u043e\u0432\u0430.<\/p>\n<h4>\u0427\u0442\u043e \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430<\/h4>\n<p><strong>\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430<\/strong> (<code>tx.rs<\/code>). \u0417\u0430\u0445\u0432\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0437\u0432\u0443\u043a \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a\u0438\u0435 \u044d\u0442\u0430\u043f\u044b:<\/p>\n<ol>\n<li>\n<p>\u041c\u043e\u043d\u043e \u043d\u0430 \u0447\u0430\u0441\u0442\u043e\u0442\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u2192 48 \u043a\u0413\u0446 \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0441\u0435\u043c\u043f\u043b\u0435\u0440 \u043d\u0430 \u043e\u043a\u043e\u043d\u043d\u043e\u043c sinc-\u0444\u0438\u043b\u044c\u0442\u0440\u0435 (<code>rubato<\/code>, \u043e\u043a\u043d\u043e 128 \u0442\u043e\u0447\u0435\u043a, \u0441\u0440\u0435\u0437 0,92, \u0447\u0430\u043d\u043a\u0438 \u043f\u043e 10 \u043c\u0441). \u041f\u0440\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0447\u0430\u0441\u0442\u043e\u0442 \u0440\u0435\u0441\u0435\u043c\u043f\u043b\u0435\u0440 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0437\u0432\u0443\u043a \u043a\u0430\u043a \u0435\u0441\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0434\u0440\u044b \u043f\u043e 20 \u043c\u0441 (960 \u0441\u044d\u043c\u043f\u043b\u043e\u0432), \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u0430 \u043e\u0442 0 \u0434\u043e 2.<\/p>\n<\/li>\n<li>\n<p>\u0424\u0438\u043b\u044c\u0442\u0440 \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u043e\u0442 90 \u0413\u0446 (\u0431\u0438\u043a\u0432\u0430\u0434 \u0411\u0430\u0442\u0442\u0435\u0440\u0432\u043e\u0440\u0442\u0430 2-\u0433\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0430): \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0443\u043b \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430, \u0440\u043e\u043a\u043e\u0442 \u0438 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u0443\u044e \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e \u0434\u043e \u0448\u0443\u043c\u043e\u043f\u043e\u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>RNNoise (\u043a\u0440\u0435\u0439\u0442 <code>nnnoiseless<\/code>) \u043f\u043e \u0434\u0432\u0443\u043c \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u043a\u0430\u043c \u043a\u0430\u0434\u0440\u0430 \u043f\u043e 10 \u043c\u0441. \u041e\u043d \u0436\u0435 \u043e\u0442\u0434\u0430\u0451\u0442 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u0447\u0438, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u0435\u0442\u0435\u043a\u0442\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438. \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f 6% \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u00ab\u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0448\u0443\u043c\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u041c\u044f\u0433\u043a\u0438\u0439 \u043b\u0438\u043c\u0438\u0442\u0435\u0440: \u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0434\u043e \u043f\u043e\u0440\u043e\u0433\u0430 0,8, \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0430\u0441\u044b\u0449\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <code>tanh<\/code>, \u0432\u044b\u0448\u0435 1,0 \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442. \u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f \u043d\u0435 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u0442 \u00ab\u043d\u0430\u043a\u0430\u0447\u043a\u0438\u00bb.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u0439\u0442 (PTT \u0438\u043b\u0438 VAD) \u0441 \u043f\u0440\u0435\u0434\u0437\u0430\u0445\u0432\u0430\u0442\u043e\u043c \u0438 \u00ab\u0445\u0432\u043e\u0441\u0442\u043e\u043c\u00bb.<\/p>\n<\/li>\n<li>\n<p>Opus \u0438 \u0434\u0430\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.<\/p>\n<\/li>\n<\/ol>\n<pre><code class=\"rust\">const HIGH_PASS_HZ: f64 = 90.0;\/\/\/ Dry signal mixed back after RNNoise: masks \"musical noise\" artefacts.const DRY_MIX: f32 = 0.06;\/\/ ...*s = d \/ 32_767.0 * (1.0 - DRY_MIX) + *s * DRY_MIX;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0440\u0430\u0437\u044b \u043d\u0435 \u0442\u0435\u0440\u044f\u043b\u043e\u0441\u044c, \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u0433\u0434\u0430, \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u043c \u0433\u0435\u0439\u0442\u0435. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u043d\u043a\u043e\u0434\u0435\u0440\u0430 Opus \u043d\u0435 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043b\u043e\u0441\u044c. \u041f\u0430\u043a\u0435\u0442\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u0433\u0435\u0439\u0442\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u0435\u0434\u0437\u0430\u0445\u0432\u0430\u0442\u0430, \u0430 \u043f\u0440\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0443\u0445\u043e\u0434\u044f\u0442 \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043a\u0430\u0434\u0440\u043e\u043c \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438. \u0412 \u0442\u0435\u0441\u0442\u0435 PTT \u044d\u0442\u043e \u0432\u0438\u0434\u043d\u043e: \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0443\u0445\u043e\u0434\u044f\u0442 \u0442\u0440\u0438 \u043a\u0430\u0434\u0440\u0430 \u043f\u0440\u0435\u0434\u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0439, \u043d\u043e\u043c\u0435\u0440\u0430 <code>100\u2026103<\/code>. \u041f\u0440\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0438 \u0433\u0435\u0439\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u0430\u0434\u0440 \u0437\u0430\u0442\u0443\u0445\u0430\u0435\u0442 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0440\u0430\u043c\u043f\u043e\u0439. \u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430 \u0432\u0445\u043e\u0434\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0430 200 \u043c\u0441, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u0435 \u043a\u043e\u043f\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430.<\/p>\n<p><strong>\u041f\u0440\u0438\u0451\u043c<\/strong> (<code>mixer.rs<\/code>). \u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0435\u0433\u043e \u0441\u0432\u043e\u0439 jitter-\u0431\u0443\u0444\u0435\u0440 \u0438 \u0441\u0432\u043e\u0439 \u0434\u0435\u043a\u043e\u0434\u0435\u0440. \u041a\u043b\u044e\u0447 \u043f\u043e\u0442\u043e\u043a\u0430 \u2014 \u043f\u0430\u0440\u0430 \u00ab\u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u043d\u0430 \u0442\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442\u0435 + \u0431\u0430\u0439\u0442 <code>speaker<\/code> \u0438\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u00bb, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0445\u043e\u0441\u0442 \u043f\u0435\u0440\u0435\u0441\u044b\u043b\u0430\u0435\u0442 \u0433\u043e\u043b\u043e\u0441 \u0434\u0440\u0443\u0433\u0438\u0445 \u0433\u043e\u0441\u0442\u0435\u0439 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e. \u0418\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 20-\u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u044b\u0439 \u0442\u0438\u043a \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043e\u0434\u0438\u043d \u0438\u0437 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><strong>\u043f\u0430\u043a\u0435\u0442<\/strong> \u2014 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0435\u0441\u0442\u044c;<\/p>\n<\/li>\n<li>\n<p><strong>\u043f\u043e\u0442\u0435\u0440\u044f, \u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c<\/strong> \u2014 \u043a\u0430\u0434\u0440 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e FEC \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p><strong>\u043f\u043e\u0442\u0435\u0440\u044f \u0431\u0435\u0437 FEC<\/strong> \u2014 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u043e\u0442\u0435\u0440\u0438 (PLC Opus) \u0441 \u0437\u0430\u0442\u0443\u0445\u0430\u043d\u0438\u0435\u043c: \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435 0,8, \u0437\u0430\u0442\u0435\u043c 0,45, \u0437\u0430\u0442\u0435\u043c 0 \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u043f\u043e\u0434\u0440\u044f\u0434 \u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043a\u0430\u0434\u0440\u0435;<\/p>\n<\/li>\n<li>\n<p><strong>\u0442\u0438\u0448\u0438\u043d\u0430<\/strong> \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f, \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041b\u0438\u0448\u043d\u044f\u044f \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0441\u043b\u0435 \u0432\u0441\u043f\u043b\u0435\u0441\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u0438 \u043f\u0440\u0435\u0434\u0437\u0430\u0445\u0432\u0430\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u0438\u0437-\u0437\u0430 \u0434\u0440\u0435\u0439\u0444\u0430 \u0447\u0430\u0441\u043e\u0432) \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u043c \u043a\u0430\u0434\u0440\u043e\u0432: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0447\u0442\u0438 \u0442\u0438\u0445\u0438\u0445 (\u0442\u0438\u0448\u0435 \u221250 \u0434\u0411FS), \u0430 \u0435\u0441\u043b\u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435 12 \u043a\u0430\u0434\u0440\u043e\u0432, \u0442\u043e \u043b\u044e\u0431\u044b\u0445. \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0443\u0441\u0438\u043b\u0435\u043d\u0438\u044f \u0438\u0434\u0451\u0442 \u043f\u043b\u0430\u0432\u043d\u043e\u0439 \u0440\u0430\u043c\u043f\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0431\u044b\u043b\u043e \u0449\u0435\u043b\u0447\u043a\u043e\u0432 \u043d\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0444\u0440\u0430\u0437. \u0417\u0430\u0433\u043b\u0443\u0448\u0451\u043d\u043d\u044b\u0445 \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u043e\u0432 \u043c\u0438\u043a\u0448\u0435\u0440 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440. \u041f\u043e\u0442\u043e\u043a \u0431\u0435\u0437 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 10 \u0441\u0435\u043a\u0443\u043d\u0434 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f, \u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0440\u0435\u0447\u0438 \u0433\u043e\u0440\u0438\u0442, \u043f\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u043f\u0440\u043e\u0438\u0433\u0440\u0430\u043d \u043c\u0435\u043d\u0435\u0435 200 \u043c\u0441 \u043d\u0430\u0437\u0430\u0434. \u0412\u044b\u0445\u043e\u0434 \u043c\u0438\u043a\u0448\u0435\u0440\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u0442 \u0436\u0435 \u043c\u044f\u0433\u043a\u0438\u0439 \u043b\u0438\u043c\u0438\u0442\u0435\u0440, \u0433\u0440\u043e\u043c\u043a\u043e\u0441\u0442\u044c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043e\u0431\u0435\u0441\u0435\u0434\u043d\u0438\u043a\u0430 \u0438 \u043e\u0431\u0449\u0430\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u044b \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u043e\u0442 0 \u0434\u043e 2. \u041a\u0440\u0438\u0432\u044b\u0435 \u0438 \u043c\u0443\u0441\u043e\u0440\u043d\u044b\u0435 \u0434\u0430\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u044b (\u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435, \u043d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f, \u043f\u0443\u0441\u0442\u043e\u0439 \u0438\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 Opus-\u043f\u0430\u043a\u0435\u0442) \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f.<\/p>\n<pre><code class=\"rust\">\/\/\/ Gain at the end of the 1st, 2nd, 3rd consecutive concealed frame.const CONCEAL_GAINS: [f32; 3] = [0.8, 0.45, 0.0];\/\/\/ Decoded frames quieter than this may be skipped to drain excess latency.const SKIP_QUIET_DB: f32 = -50.0;\/\/\/ Beyond this excess (frames) frames are skipped regardless of level.const FORCE_SKIP_EXCESS: usize = 12;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0430 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0444\u043e\u0440\u043c\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0448\u0443\u043c \u0432\u0435\u043d\u0442\u0438\u043b\u044f\u0442\u043e\u0440\u0430 (\u0448\u0438\u0440\u043e\u043a\u043e\u043f\u043e\u043b\u043e\u0441\u043d\u044b\u0439 \u0448\u0443\u043c \u043f\u043b\u044e\u0441 \u0433\u0443\u043b 50 \u0413\u0446) \u0437\u0430 250 \u043a\u0430\u0434\u0440\u043e\u0432 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u043a\u0440\u044b\u0442\u044c VAD \u0431\u043e\u043b\u044c\u0448\u0435 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437 \u0438 \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0432 \u0441\u0435\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 40 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u0417\u0430\u0434\u0435\u0440\u0436\u0430\u043d\u043d\u0430\u044f \u043f\u0430\u0447\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u043a\u0435, \u0430 \u043d\u0435 \u043a \u0446\u0438\u0444\u0440\u043e\u0432\u043e\u0439 \u0442\u0438\u0448\u0438\u043d\u0435, \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c \u0446\u0435\u043b\u0435\u0432\u0443\u044e \u0433\u043b\u0443\u0431\u0438\u043d\u0443 jitter-\u0431\u0443\u0444\u0435\u0440\u0430. \u0410 \u00ab\u043f\u0430\u0447\u043a\u0430\u00bb \u0442\u0438\u0445\u0438\u0445 \u043a\u0430\u0434\u0440\u043e\u0432 \u043f\u0440\u0435\u0434\u0437\u0430\u0445\u0432\u0430\u0442\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u0442\u043e\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u043d\u0435 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438.<\/p>\n<h3>\u0410\u043a\u043a\u0430\u0443\u043d\u0442\u044b \u0438 \u0441\u043a\u0438\u043d\u044b<\/h3>\n<p>\u0414\u043b\u044f \u0441\u043a\u0438\u043d\u043e\u0432 \u0438 \u043f\u043b\u0430\u0449\u0435\u0439 \u0440\u0430\u0437\u0432\u0451\u0440\u043d\u0443\u0442 Drasl, \u0441\u0435\u0440\u0432\u0435\u0440, \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u0441 Yggdrasil \u0438 authlib-injector, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0433\u0440\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0435\u0433\u043e \u0431\u0435\u0437 \u043f\u0430\u0442\u0447\u0435\u0439. \u041c\u043e\u0436\u043d\u043e \u0438\u0433\u0440\u0430\u0442\u044c \u0438 \u0441 \u043e\u0444\u0444\u043b\u0430\u0439\u043d-\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u043c (\u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0438\u043a), \u0442\u043e\u0433\u0434\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u043d\u0435 \u043d\u0443\u0436\u043d\u0430. \u0421\u0435\u043a\u0440\u0435\u0442\u044b \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u043c keyring.<\/p>\n<p>\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u043a\u043e\u043c\u043d\u0430\u0442: \u0435\u0441\u043b\u0438 \u0445\u043e\u0441\u0442 \u0432\u043e\u0448\u0451\u043b \u0447\u0435\u0440\u0435\u0437 \u00ab\u041c\u043e\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u00bb, \u0433\u043e\u0441\u0442\u0438 \u0442\u043e\u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0441 \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0425\u043e\u0441\u0442 \u0441 \u043e\u0444\u0444\u043b\u0430\u0439\u043d-\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u043c \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0445.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0431\u044b\u043b\u0430 \u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0441\u043a\u0438\u043d\u043e\u0432 \u043f\u043e \u043d\u0438\u043a\u0443 \u0438\u0437 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043f\u0438\u0440\u0430\u043b\u0430\u0441\u044c \u0432 \u0431\u0430\u0433\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0441\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043b\u0438\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \u0438\u0437 \u043d\u0438\u043a\u0430.<\/p>\n<h3>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/h3>\n<p>\u0410\u0432\u0442\u043e\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u043d\u044b, \u0438 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u043d\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442 \u043f\u043e\u0434\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f updater-\u043f\u043b\u0430\u0433\u0438\u043d Tauri: CI \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0441 \u043f\u043e\u0434\u043f\u0438\u0441\u044c\u044e (<code>createUpdaterArtifacts: true<\/code>), \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 minisign \u0432\u0448\u0438\u0442 \u0432 <code>tauri.conf.json<\/code>, \u0430 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 <code>latest.json<\/code> \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0431\u0435\u0440\u0451\u0442 \u0438\u0437 GitHub Releases. \u0415\u0441\u043b\u0438 GitHub \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d, \u0435\u0441\u0442\u044c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043d\u0430 \u043c\u043e\u0451\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435:<\/p>\n<pre><code class=\"json\">\"updater\": {  \"pubkey\": \"&lt;\u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 minisign&gt;\",  \"endpoints\": [    \"https:\/\/github.com\/Dedseckms\/MineDed\/releases\/latest\/download\/latest.json\",    \"https:\/\/relay.dedseckms.ru\/updates\/latest.json\"  ],  \"windows\": { \"installMode\": \"passive\" }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0432\u0435\u0440\u0438\u044f \u0442\u0430\u043a\u0430\u044f: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0443 \u0445\u043e\u0441\u0442\u0430, \u0433\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0443 \u0441\u0435\u0431\u044f \u0447\u0443\u0436\u0438\u0435 \u043c\u043e\u0434\u044b, \u0442\u043e \u0435\u0441\u0442\u044c \u0447\u0443\u0436\u043e\u0439 \u043a\u043e\u0434, \u0438 \u043d\u0438\u043a\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435 \u0434\u043e\u043a\u0430\u0436\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434 \u0431\u0435\u0437\u0432\u0440\u0435\u0434\u0435\u043d. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u0441\u0442\u043e\u0438\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0448\u044c, \u0430 \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0438\u0433\u0440 \u0435\u0441\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c. \u0417\u0430\u0442\u043e \u0441\u0430\u043c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0437\u0430\u0449\u0438\u0449\u0451\u043d \u043e\u0442 \u0446\u0435\u043b\u043e\u0433\u043e \u0440\u044f\u0434\u0430 \u0430\u0442\u0430\u043a:<\/p>\n<ul>\n<li>\n<p><strong>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/strong> \u0414\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 <code>.mrpack<\/code> \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u044b \u0442\u043e\u043b\u044c\u043a\u043e <code>https<\/code> \u0438 \u0447\u0435\u0442\u044b\u0440\u0435 \u0445\u043e\u0441\u0442\u0430 \u0438\u0437 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Modrinth: <code>cdn.modrinth.com<\/code>, <code>github.com<\/code>, <code>raw.githubusercontent.com<\/code>, <code>gitlab.com<\/code>.<\/p>\n<\/li>\n<li>\n<p><strong>\u0426\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u044c.<\/strong> sha1 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435, sha512 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0451. \u041c\u0430\u043d\u0438\u0444\u0435\u0441\u0442 \u0431\u0435\u0437 \u043b\u044e\u0431\u043e\u0433\u043e \u0438\u0437 \u044d\u0442\u0438\u0445 \u0445\u044d\u0448\u0435\u0439 \u043e\u0442\u043a\u043b\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u0435\u0449\u0451 \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0443\u0442\u0438.<\/strong> \u0412\u0441\u0435 \u043f\u0443\u0442\u0438 \u0438\u0437 \u0430\u0440\u0445\u0438\u0432\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 <code>safe_join<\/code>, \u043d\u0430 \u0437\u0430\u0449\u0438\u0442\u0443 \u043e\u0442 zip-slip \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0441\u0442.<\/p>\n<\/li>\n<li>\n<p><strong>\u041b\u0438\u043c\u0438\u0442\u044b \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438.<\/strong> \u041d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 20 000 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438 4 \u0413\u0438\u0411. \u0421\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u044b, \u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0430\u0440\u0445\u0438\u0432\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0427\u0443\u0436\u0438\u0435 zip-\u0441\u0431\u043e\u0440\u043a\u0438.<\/strong> JVM-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u0431\u0435\u043b\u043e\u043c\u0443 \u0441\u043f\u0438\u0441\u043a\u0443: \u0440\u0430\u0437\u043c\u0435\u0440\u044b <code>-Xmx<\/code>, <code>-Xms<\/code>, <code>-Xss<\/code>, <code>-Xmn<\/code>, 73 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u0430 <code>-XX<\/code> (\u0441\u0431\u043e\u0440\u0449\u0438\u043a \u043c\u0443\u0441\u043e\u0440\u0430, JIT, \u043f\u0430\u043c\u044f\u0442\u044c) \u0438 \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u044b\u0435 <code>-D<\/code>-\u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430. \u0412\u0441\u0451, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0435\u0442 \u0444\u0430\u0439\u043b\u044b \u0438\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430\u043c\u0438 <code>java.<\/code>, <code>log4j<\/code>, <code>forge<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u041f\u0443\u0442\u044c \u043a Java \u0438\u0437 \u0447\u0443\u0436\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 \u043d\u0435 \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0422\u0443\u043d\u043d\u0435\u043b\u044c<\/strong> \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u0432 \u0447\u0430\u0442\u0435 (\u0441\u043c. \u0432\u044b\u0448\u0435), \u0430 \u043f\u0430\u0440\u043e\u043b\u044c \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e \u0441\u0435\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u0435\u0431-\u0447\u0430\u0441\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/strong> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0436\u0451\u0441\u0442\u043a\u0438\u043c CSP: <code>default-src 'self'<\/code>, \u0430 <code>frame-src<\/code>, <code>object-src<\/code> \u0438 <code>form-action<\/code> \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b (<code>'none'<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>\u0424\u0440\u0430\u0433\u043c\u0435\u043d\u0442 \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u0444\u0438\u043b\u044c\u0442\u0440 JVM-\u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u0441\u0435\u043a\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"rust\">\"-XX:OnOutOfMemoryError=calc.exe\",\"-Dlog4j.configurationFile=http:\/\/x\/y.xml\",\"-javaagent:evil.jar\",\"-Djava.library.path=evil\",<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<h3>\u041a\u0430\u043a \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441 \u0418\u0418-\u0430\u0433\u0435\u043d\u0442\u043e\u043c<\/h3>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u044f \u0434\u0435\u043b\u0430\u043b \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Claude Code, \u043d\u043e \u043d\u0435 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u00ab\u043e\u0434\u0438\u043d \u0430\u0433\u0435\u043d\u0442 \u043f\u0438\u0448\u0435\u0442 \u0432\u0441\u0451\u00bb. \u042f \u043e\u043f\u0438\u0441\u0430\u043b \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 (\u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043e\u043d \u043d\u0435 \u043f\u043e\u043f\u0430\u043b) \u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0441\u044f \u0438\u0445.<\/p>\n<p><strong>\u0420\u043e\u043b\u0438.<\/strong> \u0411\u044b\u043b\u0438 lead, \u0430 \u0442\u0430\u043a\u0436\u0435 core, mods, accounts, net, voice, ui, server-ops, qa \u0438 release. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0440\u043e\u043b\u0438 \u0441\u0432\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0430\u043f\u043e\u043a, \u043a\u0443\u0434\u0430 \u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0438\u0441\u0430\u0442\u044c: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, core \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <code>crates\/lc-core<\/code> \u0438 \u0441\u0432\u043e\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u0445 Tauri, voice \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <code>crates\/lc-voice<\/code>, qa \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <code>tests\/<\/code> \u0438 \u0432 \u043f\u0440\u043e\u0434\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 \u0432\u043e\u0432\u0441\u0435.<\/p>\n<p><strong>\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f.<\/strong> \u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0443\u0431\u0430\u0433\u0435\u043d\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c git worktree \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u0442\u043a\u0435 \u0432\u0438\u0434\u0430 <code>agent\/&lt;\u0440\u043e\u043b\u044c&gt;\/&lt;\u0437\u0430\u0434\u0430\u0447\u0430&gt;<\/code>, \u0430 \u043a\u043e\u043c\u043c\u0438\u0442\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0443 <code>&lt;\u0440\u043e\u043b\u044c&gt;(&lt;\u043e\u0431\u043b\u0430\u0441\u0442\u044c&gt;): &lt;\u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e&gt;<\/code>.<\/p>\n<p><strong>\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b \u043c\u0435\u043d\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e lead.<\/strong> \u0415\u0441\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u0443 \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0440\u0435\u0439\u0442 \u0438\u043b\u0438 DTO, \u043e\u043d \u043d\u0435 \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0438 \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442 \u0442\u0438\u043f\u044b \u0443 \u0441\u0435\u0431\u044f, \u0430 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u0438\u0448\u0435\u0442 \u0432 \u043e\u0442\u0447\u0451\u0442\u0435 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0443. \u042d\u0442\u043e \u043d\u0435 \u0434\u0430\u0432\u0430\u043b\u043e \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u0440\u0430\u0437\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\u043c.<\/p>\n<p><strong>Definition of done.<\/strong> \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0447\u0438\u0442\u0430\u043b\u0430\u0441\u044c \u0433\u043e\u0442\u043e\u0432\u043e\u0439, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432 \u0435\u0451 worktree \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b\u0438 <code>cargo fmt --all --check<\/code>, <code>cargo clippy --workspace --all-targets -- -D warnings<\/code>, <code>cargo test --workspace<\/code> \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u0444\u0440\u043e\u043d\u0442\u0435\u043d\u0434\u0430. \u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0438\u043f\u043e\u0432 \u0438 vitest.<\/p>\n<p><strong>\u041c\u0435\u0440\u0436.<\/strong> \u0412 <code>main<\/code> \u0432\u043b\u0438\u0432\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e lead \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0432\u044c\u044e \u0440\u043e\u043b\u0438 qa.<\/p>\n<p><strong>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u043b \u044f.<\/strong> \u041f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u0430\u0433\u0435\u043d\u0442\u0430 \u044f \u0441\u0430\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041c\u0435\u043b\u043a\u0438\u0435 \u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0435\u043b\u0430\u043b \u0440\u0443\u043a\u0430\u043c\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u0442\u043e\u043a\u0435\u043d\u044b, \u0430 \u0443\u0437\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0442\u0434\u0430\u0432\u0430\u043b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0440\u043e\u043b\u0438. \u0413\u043e\u043b\u043e\u0441, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0435\u0433\u043e \u0432\u0434\u0432\u043e\u0451\u043c \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u043d\u0430\u0442\u0435. \u0410\u0433\u0435\u043d\u0442 \u043d\u0435 \u043b\u044e\u0431\u0438\u043b \u043d\u0435\u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f: \u0443\u043f\u043e\u0440\u043d\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0438\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e \u043d\u0438\u043a\u0443, \u0438 \u043f\u043e \u0445\u043e\u0434\u0443 \u0432\u044b\u043b\u0435\u0437\u0430\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u043b\u043a\u0438\u0445 \u0431\u0430\u0433\u043e\u0432.<\/p>\n<h3>\u0427\u0442\u043e \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f<\/h3>\n<ul>\n<li>\n<p>\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u043c\u043e\u0434\u043e\u0432 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 Modrinth. \u0414\u043e\u0441\u0442\u0443\u043f \u043a API CurseForge \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043e\u0431\u0440\u0435\u043d\u0438\u044e, \u044d\u0442\u043e \u0434\u043e\u043b\u0433\u043e, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u043b\u0438\u0431\u043e \u043c\u0435\u043d\u044c\u0448\u0435, \u043b\u0438\u0431\u043e \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u043d\u0430 Modrinth. \u0414\u043e\u0441\u0442\u0443\u043f \u043a API CurseForge \u043e\u0434\u043e\u0431\u0440\u0438\u043b\u0438 \u043d\u0435\u0434\u0430\u0432\u043d\u043e. \u0412 \u043a\u043e\u0434\u0435 CurseForge \u043f\u043e\u043a\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442, \u0430 \u0438\u043c\u043f\u043e\u0440\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0451\u043d.<\/p>\n<\/li>\n<li>\n<p>\u041e\u0432\u0435\u0440\u043b\u0435\u0439 \u0433\u043e\u043b\u043e\u0441\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u044d\u043a\u0441\u043a\u043b\u044e\u0437\u0438\u0432\u043d\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0411\u0435\u0437 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 relay, \u0438 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u043f\u043e\u043a\u0430 \u0431\u0435\u0437 \u043f\u043b\u0430\u0442\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0438\u0441\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Windows SmartScreen \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<h3>\u041a\u0430\u043a \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c<\/h3>\n<p>\u0414\u043e\u0441\u0442\u0443\u043f \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043b\u0438\u0431\u043e \u043f\u043e \u0438\u043d\u0432\u0430\u0439\u0442\u0430\u043c \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043a\u0438\u043d\u043e\u0432 drasl \u043b\u0438\u0431\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u0444\u0444\u043b\u0430\u0439\u043d \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u043e\u0432. \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0443\u0436\u043d\u043e \u0434\u0432\u043e\u0435: \u043e\u0434\u0438\u043d \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043c\u043d\u0430\u0442\u0443, \u0432\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435.<\/p>\n<ul>\n<li>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u0440\u0435\u043b\u0438\u0437\u044b: <a href=\"https:\/\/github.com\/Dedseckms\/MineDed\" rel=\"noopener nofollow\">https:\/\/github.com\/Dedseckms\/MineDed<\/a><\/p>\n<\/li>\n<li>\n<p>\u0411\u0430\u0433\u0438 \u0438 \u0438\u0434\u0435\u0438: <a href=\"https:\/\/github.com\/Dedseckms\/MineDed\/issues\" rel=\"noopener nofollow\">https:\/\/github.com\/Dedseckms\/MineDed\/issues<\/a><\/p>\n<\/li>\n<\/ul>\n<p><em>\u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u043d\u0435 \u0441\u0432\u044f\u0437\u0430\u043d \u0441 Mojang \u0438 Microsoft.<\/em><\/p>\n<\/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\/1101234\/\">https:\/\/habr.com\/ru\/articles\/1101234\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0417\u0430\u0434\u0430\u0447\u0430\u0418\u0433\u0440\u0430\u0442\u044c \u0432\u0434\u0432\u043e\u0451\u043c \u0432 Minecraft \u0441 \u043c\u043e\u0434\u0430\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f. \u041d\u0443\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0443 \u043e\u0431\u043e\u0438\u0445 \u0441\u043e\u0432\u043f\u0430\u043b\u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0433\u0440\u044b, \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a (Fabric, Forge, NeoForge, Quilt), \u043d\u0430\u0431\u043e\u0440 \u043c\u043e\u0434\u043e\u0432 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438. \u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0438\u0433\u0440\u043e\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0435\u0449\u0451 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0432 \u0441\u0435\u0442\u0438, \u0430 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e Hamachi, \u043f\u0440\u043e\u0431\u0440\u043e\u0441 \u043f\u043e\u0440\u0442\u043e\u0432 \u0438\u043b\u0438 \u0430\u0440\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440.\u042f \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0441\u0435\u0431\u0435 \u0442\u0430\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:\u0411\u0435\u0437 \u0431\u0435\u043b\u043e\u0433\u043e IP \u0438 \u043f\u0440\u043e\u0431\u0440\u043e\u0441\u0430 \u043f\u043e\u0440\u0442\u043e\u0432.\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435.\u0413\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u0445\u043e\u0441\u0442\u0430, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438.\u0421\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0448\u0438\u0444\u0440\u0443\u0435\u0442\u0441\u044f.\u0413\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0447\u0430\u0442 \u0432\u0441\u0442\u0440\u043e\u0435\u043d \u0432 \u0442\u043e\u0442 \u0436\u0435 \u043a\u0430\u043d\u0430\u043b.\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u043b\u0430\u0443\u043d\u0447\u0435\u0440 MineDed (GPL-3.0, Windows \u0438 Linux). \u041d\u0438\u0436\u0435 \u2014 \u043a\u0430\u043a \u043e\u043d \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u0438 \u043a\u0430\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u043b. \u041f\u0440\u043e\u0435\u043a\u0442 \u043f\u0438\u0441\u0430\u043b\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 Claude Code, \u0438 \u043f\u0440\u043e \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0442\u043e\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0434\u0435\u043b.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Tauri 2: \u044f\u0434\u0440\u043e \u043d\u0430 Rust, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0430 React 19 \u0438 TypeScript. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0432\u0435\u0441\u0438\u0442 \u043e\u043a\u043e\u043b\u043e 10 \u041c\u0411, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u043a\u0430. \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u2014 Cargo workspace, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0440\u0435\u0439\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0432\u043e\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c:\u041a\u0440\u0435\u0439\u0442\u041e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044clc-types\u043e\u0431\u0449\u0438\u0435 DTO, AppError, \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u044blc-runtime\u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043f\u0443\u0442\u0438, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, LaunchPlanlc-http\u0435\u0434\u0438\u043d\u044b\u0439 \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a \u0444\u0430\u0439\u043b\u043e\u0432lc-core\u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0433\u0440\u044b, Java, \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u044b, \u0437\u0430\u043f\u0443\u0441\u043alc-loadersFabric, Quilt, Forge, NeoForgelc-content\u043a\u0430\u0442\u0430\u043b\u043e\u0433 Modrinth, \u043c\u043e\u0434\u043f\u0430\u043a\u0438, \u043f\u0440\u0435\u0441\u0435\u0442\u044b \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438lc-accounts\u043e\u0444\u0444\u043b\u0430\u0439\u043d-\u0430\u043a\u043a\u0430\u0443\u043d\u0442\u044b, Yggdrasil, keyring, \u0441\u043a\u0438\u043d\u044blc-p2p\u043a\u043e\u043c\u043d\u0430\u0442\u044b \u043d\u0430 iroh, \u0442\u0443\u043d\u043d\u0435\u043b\u044c, \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043blc-voice\u0433\u043e\u043b\u043e\u0441\u043e\u0432\u043e\u0439 \u0447\u0430\u0442apps\/desktopTauri-\u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 (src-tauri) \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 (src)\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0436\u0438\u0432\u0451\u0442 \u0432 Docker: hub \u043d\u0430 axum, \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u043a\u0438\u043d\u043e\u0432 Drasl, Caddy \u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 iroh-relay.\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438\u0412 \u043a\u0430\u0436\u0434\u043e\u043c \u043a\u0440\u0435\u0439\u0442\u0435 \u0435\u0441\u0442\u044c src\/contract.rs \u0441 \u0442\u0440\u0435\u0439\u0442\u0430\u043c\u0438 \u0438 src\/stub.rs \u0441 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0442\u0438\u0432 \u0442\u0440\u0435\u0439\u0442\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 \u0447\u0443\u0436\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0440\u0435\u0439\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438 \u043d\u0435 \u043b\u043e\u043c\u0430\u0442\u044c \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0430\u0432\u0438\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0437\u0430\u043a\u0440\u0435\u043f\u0438\u043b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u043b\u0438\u043d\u0442\u0435\u0440\u0430\u043c\u0438 \u0438 \u0440\u0435\u0432\u044c\u044e:\u0421\u0435\u0440\u0432\u0438\u0441\u044b \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 Tauri. \u041d\u0430\u0440\u0443\u0436\u0443 \u043e\u043d\u0438 \u043e\u0442\u0434\u0430\u044e\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0440\u0435\u0439\u0442\u044b *Observer, \u0430 \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438\u0445 \u043a IPC.\u0414\u043e\u043b\u0433\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0442 &amp;dyn ProgressSink \u0438 \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0433\u0430\u043c\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0442 check_cancelled(), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0438\u043b\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c.\u041e\u0448\u0438\u0431\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u043a\u0440\u0435\u0439\u0442\u0430\u043c\u0438 \u0438 \u0447\u0435\u0440\u0435\u0437 IPC \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043a AppError \u0441 ErrorCode, \u0434\u0435\u0442\u0430\u043b\u0438 \u2014 \u0447\u0435\u0440\u0435\u0437 .detail(key, value).\u0421\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 lc_http::Downloader. \u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 reqwest::Client \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u0440\u0435\u0439\u0442\u0430\u0445 \u043d\u0435\u043b\u044c\u0437\u044f.\u041f\u0443\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 lc_runtime::Paths, \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0438\u043f\u0435 Secret \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0432 \u043b\u043e\u0433\u0430\u0445.unwrap \u0438 expect \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u044b \u0432\u043d\u0435 \u0442\u0435\u0441\u0442\u043e\u0432, unsafe \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d workspace-\u043b\u0438\u043d\u0442\u043e\u043c, clippy \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441 -D warnings.\u0422\u0438\u043f\u044b Rust \u2192 TypeScript \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 specta \u0438 tauri-specta (\u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u043a\u0440\u0435\u043f\u043b\u0435\u043d\u0430 \u0442\u043e\u0447\u043d\u044b\u043c \u043f\u0438\u043d\u043e\u043c), \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043b\u0435\u0436\u0438\u0442 \u0432 bindings.ts \u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u0442\u0441\u044f. \u0422\u0430\u043a \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 IPC \u043d\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0431\u044d\u043a\u0435\u043d\u0434\u043e\u043c \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c.\u042f\u0434\u0440\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0430 (crates\/lc-p2p\/src\/proto.rs, \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043e):pub const ALPN: &amp;[u8] = b&#187;lc\/1&#8243;;pub const PROTOCOL_VERSION: u32 = 1;\/\/\/ Above this many peers the host forwards voice instead of full mesh.pub const MESH_LIMIT: usize = 6;#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]#[serde(tag = &#171;t&#187;, rename_all = &#171;snake_case&#187;)]pub enum ControlMsg {    Hello { protocol: u32, name: String, uuid: Option&lt;String&gt;,            peer_token: String, password_proof: Option&lt;String&gt; },    Welcome { peers: Vec&lt;String&gt;, peer_names: Vec&lt;String&gt; },    Ping { nonce: u64 },    Pong { nonce: u64 },    Chat { id: String, text: String, sent_at: String \/* \u2026 *\/ },    VoiceState { speaking: bool, muted: bool, peer: Option&lt;String&gt; },    Kick { reason: String },    Bye,}\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043f\u043e\u0434\u043a\u0440\u0435\u043f\u043b\u0451\u043d \u0442\u0435\u0441\u0442\u0430\u043c\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, ControlMsg::Ping \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u0432 {&#171;t&#187;:&#187;ping&#187;,&#187;nonce&#187;:1}, \u0438 \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0442\u0435\u0441\u0442.\u0422\u0440\u0430\u043d\u0441\u043f\u043e\u0440\u0442: iroh\u0414\u043b\u044f P2P \u044f \u0432\u044b\u0431\u0440\u0430\u043b iroh. \u041e\u043d \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d \u043d\u0430 QUIC, \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442 \u0443\u0437\u043b\u044b \u043f\u043e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c\u0443 \u043a\u043b\u044e\u0447\u0443, \u0441\u0430\u043c \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u0438\u0442\u044c NAT \u0438 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 relay-\u0441\u0435\u0440\u0432\u0435\u0440. \u0414\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u044d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u043e, \u0447\u0442\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0439 hole punching \u0438 \u0441\u0432\u043e\u044e \u0441\u0445\u0435\u043c\u0443 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\u041a\u0430\u043a \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0434\u043b\u044f \u0438\u0433\u0440\u043e\u043a\u0430:\u0425\u043e\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u043e\u043c\u043d\u0430\u0442\u0443, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u0434 \u0438 \u0441\u0441\u044b\u043b\u043a\u0443 \u0432\u0438\u0434\u0430 https:\/\/mineded.dedseckms.ru\/join\/\u041a\u041e\u0414. \u041a\u043e\u043c\u043d\u0430\u0442\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u0435\u043c.\u0413\u043e\u0441\u0442\u044c \u0432\u0432\u043e\u0434\u0438\u0442 \u043a\u043e\u0434 \u0438\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443, \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f.\u0415\u0441\u043b\u0438 \u043f\u0440\u044f\u043c\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e (\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u0447\u043d\u044b\u0439 NAT, \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442), \u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0451\u0442 \u0447\u0435\u0440\u0435\u0437 relay. \u041e\u043d \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c, \u0438 relay \u0432\u0438\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b.\u0412 \u043a\u043e\u0434\u0435 \u0437\u0430 \u044d\u0442\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043a\u0440\u0435\u0439\u0442 lc-p2p, \u0430 \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0432\u044b\u043d\u0435\u0441\u0435\u043d \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b proto.rs, \u043a\u043e\u0442\u043e\u0440\u044b\u0439, \u043a\u0430\u043a \u0438 \u0432\u0441\u0435 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b, \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e.\u041c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u043e \u043e\u0434\u043d\u043e QUIC-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 ALPN lc\/1, \u0438 \u0432 \u043d\u0451\u043c \u0445\u043e\u0434\u0438\u0442 \u0442\u0440\u0438 \u0432\u0438\u0434\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430.\u0427\u0442\u043e\u041a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043f\u0435\u0440\u0432\u044b\u0439 \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a, JSON \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044e \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 (ControlMsg)\u0418\u0433\u0440\u0430\u043a\u0430\u0436\u0434\u043e\u0435 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 Minecraft \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u0432\u0443\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a: \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430 StreamOpen, \u0434\u0430\u043b\u044c\u0448\u0435 \u0441\u044b\u0440\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u0432 \u043e\u0431\u0435 \u0441\u0442\u043e\u0440\u043e\u043d\u044b\u0413\u043e\u043b\u043e\u0441QUIC-\u0434\u0430\u0442\u0430\u0433\u0440\u0430\u043c\u043c\u044b: 8-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0438 \u043a\u0430\u0434\u0440 Opus \u043d\u0430 20 \u043c\u0441\u0412 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u043f\u0435\u0440\u0432\u044b\u043c \u0438\u0434\u0451\u0442 Hello \u0441 \u0434\u0432\u0443\u043c\u044f \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u0430\u043c\u0438. peer_token \u0432\u044b\u0434\u0430\u0451\u0442 hub-\u0441\u0435\u0440\u0432\u0435\u0440 (axum): \u043e\u043d \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442, \u0447\u0442\u043e \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043a\u043e\u043c\u043d\u0430\u0442\u0435, \u0438 \u0445\u043e\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0433\u043e \u0441\u0432\u043e\u0438\u043c hostToken. \u0414\u043b\u044f \u043a\u043e\u043c\u043d\u0430\u0442 \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f password_proof \u2014 HMAC-SHA256, \u0433\u0434\u0435 \u043a\u043b\u044e\u0447 \u2014 \u043f\u0430\u0440\u043e\u043b\u044c, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u2014 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u0437 TLS-\u0441\u0435\u0441\u0441\u0438\u0438, \u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043c\u043d\u0430\u0442\u044b. \u0421\u0430\u043c \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e \u0441\u0435\u0442\u0438 \u043d\u0435 \u0438\u0434\u0451\u0442, \u0430 \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 TLS-\u0441\u0435\u0441\u0441\u0438\u0438.\u041a\u043e\u0434 \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u0438\u043c\u0435\u0435\u0442 \u0432\u0438\u0434 ABCD-1234 (\u0432\u043e\u0441\u0435\u043c\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u0430 \u0438 \u0446\u0438\u0444\u0440\u044b). parse_code \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0432\u0432\u043e\u0434: \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u043f\u0440\u043e\u0431\u0435\u043b\u044b, \u043a\u043e\u0434 \u0431\u0435\u0437 \u0434\u0435\u0444\u0438\u0441\u0430 \u0438 \u0441\u0441\u044b\u043b\u043a\u0438 \u0441 \u0445\u0432\u043e\u0441\u0442\u043e\u043c ?query \u0438\u043b\u0438 #fragment. \u0414\u0440\u0443\u0437\u044c\u044f\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0430 https:\/\/mineded.dedseckms.ru\/join\/\u041a\u041e\u0414, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u044b \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442 \u043a\u043b\u0438\u043a\u0430\u0431\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0430\u0439\u0442\u0430 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 mineded:\/\/join\/\u041a\u041e\u0414, \u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c \u044d\u0442\u043e\u0439 \u0441\u0445\u0435\u043c\u044b (\u043f\u043b\u0430\u0433\u0438\u043d deep-link \u0432 Tauri). \u0421\u0442\u0430\u0440\u0430\u044f \u0441\u0445\u0435\u043c\u0430 mineup:\/\/, \u043e\u0441\u0442\u0430\u0432\u0448\u0430\u044f\u0441\u044f \u0441 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f.\u0422\u0443\u043d\u043d\u0435\u043b\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430Minecraft \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043f\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u043c\u0443 TCP-\u0430\u0434\u0440\u0435\u0441\u0443 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 \u0433\u043e\u0441\u0442\u044f \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043e\u043a\u0435\u0442 \u043d\u0430 127.0.0.1:\u043f\u043e\u0440\u0442 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0438\u0433\u0440\u044b. \u0414\u043b\u044f Minecraft \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0435\u0442\u0438.\u0414\u0430\u043b\u044c\u0448\u0435 \u043a\u0430\u0436\u0434\u043e\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u043a\u0441\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043f\u043e\u0442\u043e\u043a QUIC \u043a \u0445\u043e\u0441\u0442\u0443, \u0430 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0445\u043e\u0441\u0442\u0430 \u043f\u043e\u0442\u043e\u043a \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u0440\u0442\u043e\u043c \u043c\u0438\u0440\u0430, \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u00ab\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0442\u0438\u00bb (Esc \u2192 \u00ab\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043b\u044f \u0441\u0435\u0442\u0438\u00bb). \u0418\u0433\u0440\u043e\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0438\u0434\u0451\u0442 \u0432\u043d\u0443\u0442\u0440\u0438 \u0442\u043e\u0433\u043e \u0436\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f iroh.\u0425\u043e\u0441\u0442\u0443 \u043d\u0443\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u043f\u043e\u0440\u0442\u0443 Minecraft \u043e\u0442\u043a\u0440\u044b\u043b \u043c\u0438\u0440 \u0434\u043b\u044f \u0441\u0435\u0442\u0438, \u0430 \u043f\u043e\u0440\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043d\u043e\u0432\u044b\u0439. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430, \u0438 \u043e\u0431\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442\u0441\u044f.LAN-\u0430\u043d\u043e\u043d\u0441\u044b. \u0418\u0433\u0440\u0430 \u0440\u0430\u0437 \u0432 ~1,5 \u0441 \u0448\u043b\u0451\u0442 \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 224.0.2.60:4445 \u043f\u0430\u043a\u0435\u0442 \u0432\u0438\u0434\u0430 [MOTD]\u2026[\/MOTD][AD]\u043f\u043e\u0440\u0442[\/AD]. \u041b\u0430\u0443\u043d\u0447\u0435\u0440 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u0433\u0440\u0443\u043f\u043f\u0443 (\u0441\u043e\u043a\u0435\u0442 \u0441 SO_REUSEADDR, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0442\u043e\u0442 \u0436\u0435 \u043f\u043e\u0440\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043a\u0430\u043d\u0435\u0440 \u0441\u0430\u043c\u043e\u0439 \u0438\u0433\u0440\u044b), \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442\u044b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u044d\u0442\u043e\u0439 \u0436\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u0442 \u043f\u043e\u0440\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 TCP-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 127.0.0.1:\u043f\u043e\u0440\u0442 \u0437\u0430 700 \u043c\u0441. \u0422\u0430\u043a \u0430\u043d\u043e\u043d\u0441 \u0441\u043e\u0441\u0435\u0434\u0430 \u043f\u043e Wi-Fi \u043d\u0435 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442 \u0442\u0443\u043d\u043d\u0435\u043b\u044c.\u041b\u043e\u0433 \u0438\u0433\u0440\u044b. \u0421\u0442\u0440\u043e\u043a\u0438 Started serving on &lt;\u043f\u043e\u0440\u0442&gt; \u0438 Local game hosted on port &lt;\u043f\u043e\u0440\u0442&gt;. \u0421\u0442\u0440\u043e\u043a\u0430 \u043f\u0438\u0448\u0435\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0430 (Render thread, \u0434\u043e 1.13 Client thread), \u0430 \u0443 Forge \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0430 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0430\u0440\u0441\u0435\u0440 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b.\u041b\u043e\u0433 \u2014 \u044d\u0442\u043e \u0442\u0435\u043a\u0441\u0442, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0447\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043b\u044e\u0431\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 [CHAT] \u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0430 \u0440\u0430\u0437\u0431\u043e\u0440 \u0431\u0435\u0440\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438\u0433\u0440\u044b. \u0418\u043d\u0430\u0447\u0435 \u0438\u0433\u0440\u043e\u043a \u043c\u043e\u0433 \u0431\u044b \u043d\u0430\u0431\u0440\u0430\u0442\u044c \u0432 \u0447\u0430\u0442\u0435 \u00abStarted serving on 22\u00bb \u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u043d\u043d\u0435\u043b\u044c \u043d\u0430 \u0447\u0443\u0436\u043e\u0439 \u043f\u043e\u0440\u0442. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0440\u0435\u0433\u0440\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 chat_lines_are_ignored:pub fn port_from_log_line(line: &amp;str) -&gt; Option&lt;u16&gt; {    const MARKERS: [&amp;str; 2] = [&#171;Started serving on &#171;, &#171;Local game hosted on port &#171;];    if line.contains(&#171;[CHAT]&#187;) {        return None;    }    \/\/ Log4j prefix ends at the first &#171;]: &#171;: `[time] [Server thread\/INFO]: msg`    let end = line.find(&#171;]: &#171;)?;    let prefix = &amp;line[..end + 1];    let msg = &amp;line[end + 3..];    \/\/ \u2026 only [Server thread\/INFO], [Render thread\/INFO], [Client thread\/INFO]}\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0433\u043e\u0441\u0442\u044f \u043b\u0430\u0443\u043d\u0447\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044c \u043a\u043e\u043c\u043d\u0430\u0442\u044b \u0432 servers.dat \u0438\u0433\u0440\u044b \u0438 \u0440\u0430\u0441\u0441\u044b\u043b\u0430\u0435\u0442 \u0442\u0435 \u0436\u0435 LAN-\u0430\u043d\u043e\u043d\u0441\u044b \u0441 TTL 0, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043c\u0430\u0448\u0438\u043d\u044b. MOTD \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0447\u0438\u0449\u0430\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u043a\u043e\u0431\u043e\u043a \u0438 \u043e\u0431\u0440\u0435\u0437\u0430\u0435\u0442\u0441\u044f \u0434\u043e 64 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432. \u0417\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u043c\u043d\u0430\u0442, \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0435\u0441\u044f \u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430, \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439.\u041f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0441\u0431\u043e\u0440\u043a\u0438\u0417\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u044f \u0432\u0437\u044f\u043b .mrpack: \u044d\u0442\u043e ZIP \u0441 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u043c modrinth.index.json \u0438 \u043f\u0430\u043f\u043a\u043e\u0439 overrides\/. \u0412 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0444\u0430\u0439\u043b\u044b \u0441 \u0445\u044d\u0448\u0430\u043c\u0438 \u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435, \u0430 \u0432 overrides \u043b\u0435\u0436\u0438\u0442 \u0442\u043e, \u0447\u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 Modrinth.\u0421\u0445\u0435\u043c\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438:\u041c\u043e\u0434\u044b, \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043f\u0430\u043a\u0438 \u0441 Modrinth \u0443\u0445\u043e\u0434\u044f\u0442 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438. \u0413\u043e\u0441\u0442\u044c \u043a\u0430\u0447\u0430\u0435\u0442 \u0438\u0445 \u0441\u0430\u043c \u0441 CDN, \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043d\u0435 \u043d\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043a\u0430\u043d\u0430\u043b \u0445\u043e\u0441\u0442\u0430.\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u043e\u0434\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u043e P2P-\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044e.\u0415\u0441\u043b\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u0443 \u0433\u043e\u0441\u0442\u044f \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043e\u043d\u0430 \u043f\u043e\u0434\u0445\u0432\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u0435\u0437 \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442, \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u00ab\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0438 \u0438\u0433\u0440\u0430\u0442\u044c\u00bb \u0441\u0442\u0430\u0432\u044f\u0442\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a, \u043c\u043e\u0434\u044b \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0438.\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c QUIC. \u0413\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a \u0438 \u043f\u0438\u0448\u0435\u0442 StreamOpen::Pack { version }, \u0445\u043e\u0441\u0442 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 PackReply, \u043f\u043e\u0441\u043b\u0435 Ready \u0438\u0434\u0451\u0442 \u0440\u043e\u0432\u043d\u043e size \u0441\u044b\u0440\u044b\u0445 \u0431\u0430\u0439\u0442, \u0438 \u043f\u043e\u0442\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f:pub enum StreamOpen {    Game,    Pack { version: u32 },}pub enum PackReply {    \/\/\/ `sha256`: lowercase hex of the whole file.    Ready { size: u64, sha256: String },    \/\/\/ `reason`: `unsupported` (pack version), `not_game_room`, `too_large`, `export_failed`.    Error { reason: String },}\u0425\u043e\u0441\u0442\u044b \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442 \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442 \u043f\u043e\u0442\u043e\u043a \u0431\u0435\u0437 \u043e\u0442\u0432\u0435\u0442\u0430. \u042d\u0442\u043e \u0443\u0447\u0442\u0435\u043d\u043e \u0432 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0435 \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439.\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0443\u0436\u043d\u0430 \u043b\u0438 \u0433\u043e\u0441\u0442\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430, \u043a\u043e\u043c\u043d\u0430\u0442\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u044c \u0441\u0431\u043e\u0440\u043a\u0438 (InstanceSig): \u0432\u0435\u0440\u0441\u0438\u044f \u0438\u0433\u0440\u044b, \u0437\u0430\u0433\u0440\u0443\u0437\u0447\u0438\u043a, \u0435\u0433\u043e \u0432\u0435\u0440\u0441\u0438\u044f \u0438 mods_hash. \u0425\u044d\u0448 \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c\u0443, \u0430 \u043d\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c \u0444\u0430\u0439\u043b\u043e\u0432: \u0431\u0435\u0440\u0451\u0442\u0441\u044f SHA-256 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u043e\u0433\u043e mods\/*.jar, \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0438 \u043e\u0442 \u043d\u0435\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f SHA-256 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c:hashes.sort();let mut h = Sha256::new();for x in &amp;hashes {    h.update(x.as_bytes());    h.update(b&#187;\\n&#187;);}Ok(hex::encode(h.finalize()))\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u044b \u0434\u0430\u044e\u0442 \u0442\u043e\u0442 \u0436\u0435 \u0445\u044d\u0448, \u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0435 (.jar.disabled) \u0438 \u043d\u0435-jar \u0444\u0430\u0439\u043b\u044b \u0432 \u043d\u0435\u0433\u043e \u043d\u0435 \u0432\u0445\u043e\u0434\u044f\u0442. \u0422\u0435\u0441\u0442 mods_hash_ignores_order_and_non_jars \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e.\u042d\u043a\u0441\u043f\u043e\u0440\u0442 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0445\u043e\u0441\u0442\u0430. \u0425\u043e\u0441\u0442 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 .mrpack \u0438\u0437&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-500888","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500888","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=500888"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/500888\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=500888"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=500888"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=500888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}