From abbad97bddfb1b3e72275f07158f8e30290b5a37 Mon Sep 17 00:00:00 2001 From: TIANHE Date: Fri, 27 Feb 2026 19:57:23 +0800 Subject: [PATCH] v2.2.1: frontend closed-source + Docker one-click deploy - Remove frontend source code (now in private repo) - Add pre-built frontend/dist/ with Nginx serving - Simplify docker-compose.yml (no Node.js build needed) - Update README with docs index and Docker deploy guide - Add admin order list and AI analysis stats tabs - Add quick trade API routes - Clean up redundant files (package-lock.json, yarn.lock, .iml) - Add GitHub Actions workflow for frontend update automation --- .github/workflows/update-frontend.yml | 84 + .gitignore | 504 +- QuantDinger.iml | 12 - README.md | 273 +- backend_api_python/app/__init__.py | 26 + backend_api_python/app/routes/__init__.py | 4 +- backend_api_python/app/routes/credentials.py | 82 +- backend_api_python/app/routes/quick_trade.py | 555 + backend_api_python/app/routes/strategy.py | 33 +- backend_api_python/app/routes/user.py | 447 + .../app/services/exchange_execution.py | 4 +- .../app/services/pending_order_worker.py | 6 +- backend_api_python/app/services/strategy.py | 14 +- .../app/services/usdt_payment_service.py | 188 +- backend_api_python/env.example | 2 + backend_api_python/migrations/init.sql | 30 + docker-compose.yml | 48 +- docs/CHANGELOG.md | 44 + frontend/Dockerfile | 13 + frontend/VERSION | 1 + .../nginx-docker.conf => frontend/nginx.conf | 21 +- package-lock.json | 6 - quantdinger_vue/.browserslistrc | 3 - quantdinger_vue/.dockerignore | 41 - quantdinger_vue/.editorconfig | 39 - quantdinger_vue/.env | 3 - quantdinger_vue/.env.development | 3 - quantdinger_vue/.env.preview | 3 - quantdinger_vue/.eslintrc.js | 75 - quantdinger_vue/.eslintrc.json | 5 - quantdinger_vue/.gitattributes | 11 - quantdinger_vue/.gitignore | 21 - quantdinger_vue/.husky/.gitignore | 1 - quantdinger_vue/.lintstagedrc.json | 4 - quantdinger_vue/.prettierrc | 6 - quantdinger_vue/.stylelintrc.js | 102 - quantdinger_vue/.travis.yml | 7 - quantdinger_vue/Dockerfile | 32 - quantdinger_vue/README.md | 62 - quantdinger_vue/babel.config.js | 30 - quantdinger_vue/build-docker.ps1 | 27 - quantdinger_vue/build-docker.sh | 21 - quantdinger_vue/commitlint.config.js | 26 - quantdinger_vue/config/plugin.config.js | 49 - quantdinger_vue/config/themePluginConfig.js | 115 - quantdinger_vue/deploy/caddy.conf | 9 - quantdinger_vue/deploy/nginx.conf | 24 - quantdinger_vue/jest.config.js | 23 - quantdinger_vue/jsconfig.json | 11 - quantdinger_vue/package.json | 83 - quantdinger_vue/postcss.config.js | 5 - quantdinger_vue/public/avatar2.jpg | Bin 133769 -> 0 bytes quantdinger_vue/public/index.html | 477 - quantdinger_vue/public/logo.png | Bin 9218 -> 0 bytes quantdinger_vue/public/maps/world-atlas.json | 1 - quantdinger_vue/public/maps/world.json | 1 - quantdinger_vue/public/slogo.png | Bin 27144 -> 0 bytes quantdinger_vue/src/App.vue | 49 - quantdinger_vue/src/api/ai-trading.js | 113 - quantdinger_vue/src/api/auth.js | 131 - quantdinger_vue/src/api/billing.js | 39 - quantdinger_vue/src/api/credentials.js | 40 - quantdinger_vue/src/api/dashboard.js | 30 - quantdinger_vue/src/api/fast-analysis.js | 104 - quantdinger_vue/src/api/global-market.js | 80 - quantdinger_vue/src/api/login.js | 59 - quantdinger_vue/src/api/manage.js | 70 - quantdinger_vue/src/api/market.js | 259 - quantdinger_vue/src/api/portfolio.js | 151 - quantdinger_vue/src/api/settings.js | 56 - quantdinger_vue/src/api/strategy.js | 237 - quantdinger_vue/src/api/user.js | 222 - quantdinger_vue/src/assets/background.svg | 69 - .../src/assets/icons/bx-analyse.svg | 1 - quantdinger_vue/src/assets/logo.png | Bin 105735 -> 0 bytes quantdinger_vue/src/assets/logo.svg | 29 - quantdinger_vue/src/assets/slogo.png | Bin 27144 -> 0 bytes .../ArticleListContent/ArticleListContent.vue | 89 - .../components/ArticleListContent/index.js | 3 - .../src/components/AvatarList/Item.jsx | 25 - .../src/components/AvatarList/List.jsx | 72 - .../src/components/AvatarList/index.js | 9 - .../src/components/AvatarList/index.less | 59 - .../src/components/AvatarList/index.md | 64 - quantdinger_vue/src/components/Charts/Bar.vue | 62 - .../src/components/Charts/ChartCard.vue | 120 - .../src/components/Charts/Liquid.vue | 67 - .../src/components/Charts/MiniArea.vue | 56 - .../src/components/Charts/MiniBar.vue | 57 - .../src/components/Charts/MiniProgress.vue | 75 - .../src/components/Charts/MiniSmoothArea.vue | 40 - .../src/components/Charts/Radar.vue | 68 - .../src/components/Charts/RankList.vue | 77 - .../src/components/Charts/TagCloud.vue | 113 - .../src/components/Charts/TransferBar.vue | 64 - .../src/components/Charts/Trend.vue | 82 - .../src/components/Charts/chart.less | 13 - .../src/components/Charts/smooth.area.less | 14 - quantdinger_vue/src/components/Dialog.js | 113 - .../src/components/Editor/QuillEditor.vue | 79 - .../src/components/Editor/WangEditor.vue | 57 - .../src/components/Ellipsis/Ellipsis.vue | 64 - .../src/components/Ellipsis/index.js | 3 - .../src/components/Ellipsis/index.md | 38 - .../FooterToolbar/FooterToolBar.vue | 47 - .../src/components/FooterToolbar/index.js | 4 - .../src/components/FooterToolbar/index.less | 23 - .../src/components/FooterToolbar/index.md | 48 - .../src/components/GlobalFooter/index.vue | 129 - .../GlobalHeader/AvatarDropdown.vue | 103 - .../components/GlobalHeader/RightContent.vue | 164 - .../components/IconSelector/IconSelector.vue | 86 - .../src/components/IconSelector/README.md | 48 - .../src/components/IconSelector/icons.js | 36 - .../src/components/IconSelector/index.js | 2 - .../src/components/MultiTab/MultiTab.vue | 161 - .../src/components/MultiTab/events.js | 2 - .../src/components/MultiTab/index.js | 40 - .../src/components/MultiTab/index.less | 25 - .../src/components/NProgress/nprogress.less | 70 - .../src/components/NoticeIcon/NoticeIcon.vue | 844 -- .../src/components/NoticeIcon/index.js | 2 - .../src/components/NumberInfo/NumberInfo.vue | 54 - .../src/components/NumberInfo/index.js | 3 - .../src/components/NumberInfo/index.less | 55 - .../src/components/NumberInfo/index.md | 43 - .../src/components/Other/CarbonAds.vue | 62 - .../src/components/PageLoading/index.jsx | 106 - .../src/components/Search/GlobalSearch.jsx | 62 - .../src/components/Search/index.less | 25 - .../src/components/SelectLang/index.jsx | 70 - .../src/components/SelectLang/index.less | 47 - .../SettingDrawer/SettingDrawer.vue | 355 - .../components/SettingDrawer/SettingItem.vue | 38 - .../src/components/SettingDrawer/index.js | 2 - .../components/SettingDrawer/settingConfig.js | 53 - .../components/SettingDrawer/themeColor.js | 36 - .../StandardFormRow/StandardFormRow.vue | 122 - .../src/components/StandardFormRow/index.js | 3 - .../src/components/Table/README.md | 341 - quantdinger_vue/src/components/Table/index.js | 325 - .../components/TagSelect/TagSelectOption.jsx | 45 - .../src/components/TagSelect/index.jsx | 113 - .../src/components/TextArea/index.jsx | 67 - .../src/components/TextArea/style.less | 12 - quantdinger_vue/src/components/Tree/Tree.jsx | 124 - .../src/components/Trend/Trend.vue | 41 - quantdinger_vue/src/components/Trend/index.js | 3 - .../src/components/Trend/index.less | 44 - quantdinger_vue/src/components/Trend/index.md | 45 - .../src/components/Turnstile/index.vue | 199 - quantdinger_vue/src/components/_util/util.js | 46 - quantdinger_vue/src/components/index.js | 56 - quantdinger_vue/src/components/index.less | 6 - .../src/components/tools/TwoStepCaptcha.vue | 102 - quantdinger_vue/src/config/aiModels.js | 41 - quantdinger_vue/src/config/defaultSettings.js | 33 - quantdinger_vue/src/config/router.config.js | 186 - quantdinger_vue/src/core/bootstrap.js | 37 - quantdinger_vue/src/core/directives/action.js | 34 - quantdinger_vue/src/core/icons.js | 11 - quantdinger_vue/src/core/lazy_use.js | 129 - .../src/core/permission/permission.js | 55 - quantdinger_vue/src/core/use.js | 27 - quantdinger_vue/src/global.less | 117 - quantdinger_vue/src/layouts/BasicLayout.less | 423 - quantdinger_vue/src/layouts/BasicLayout.vue | 1040 -- quantdinger_vue/src/layouts/BlankLayout.vue | 16 - quantdinger_vue/src/layouts/PageView.vue | 12 - quantdinger_vue/src/layouts/RouteView.vue | 32 - quantdinger_vue/src/layouts/UserLayout.vue | 264 - quantdinger_vue/src/layouts/index.js | 7 - quantdinger_vue/src/locales/index.js | 68 - quantdinger_vue/src/locales/lang/ar-SA.js | 1822 --- quantdinger_vue/src/locales/lang/de-DE.js | 1871 --- quantdinger_vue/src/locales/lang/en-US.js | 3159 ---- quantdinger_vue/src/locales/lang/fr-FR.js | 1823 --- quantdinger_vue/src/locales/lang/ja-JP.js | 1827 --- quantdinger_vue/src/locales/lang/ko-KR.js | 1826 --- quantdinger_vue/src/locales/lang/th-TH.js | 1823 --- quantdinger_vue/src/locales/lang/vi-VN.js | 2953 ---- quantdinger_vue/src/locales/lang/zh-CN.js | 2970 ---- quantdinger_vue/src/locales/lang/zh-TW.js | 2250 --- quantdinger_vue/src/main.js | 56 - quantdinger_vue/src/mock/index.js | 24 - quantdinger_vue/src/mock/services/article.js | 88 - quantdinger_vue/src/mock/services/auth.js | 49 - quantdinger_vue/src/mock/services/manage.js | 252 - quantdinger_vue/src/mock/services/other.js | 973 -- quantdinger_vue/src/mock/services/tagCloud.js | 9 - quantdinger_vue/src/mock/services/user.js | 577 - quantdinger_vue/src/mock/util.js | 38 - quantdinger_vue/src/permission.js | 128 - quantdinger_vue/src/router/README.md | 134 - .../src/router/generator-routers.js | 85 - quantdinger_vue/src/router/index.js | 28 - quantdinger_vue/src/store/app-mixin.js | 32 - quantdinger_vue/src/store/device-mixin.js | 11 - quantdinger_vue/src/store/getters.js | 16 - quantdinger_vue/src/store/i18n-mixin.js | 16 - quantdinger_vue/src/store/index.js | 29 - quantdinger_vue/src/store/modules/app.js | 99 - .../src/store/modules/async-router.js | 42 - .../src/store/modules/static-router.js | 54 - quantdinger_vue/src/store/modules/user.js | 270 - quantdinger_vue/src/store/mutation-types.js | 26 - quantdinger_vue/src/utils/axios.js | 34 - quantdinger_vue/src/utils/codeDecrypt.js | 138 - quantdinger_vue/src/utils/domUtil.js | 21 - quantdinger_vue/src/utils/filter.js | 20 - quantdinger_vue/src/utils/request.js | 197 - quantdinger_vue/src/utils/routeConvert.js | 30 - quantdinger_vue/src/utils/screenLog.js | 4 - quantdinger_vue/src/utils/util.js | 95 - quantdinger_vue/src/utils/utils.less | 54 - quantdinger_vue/src/views/404.vue | 15 - .../components/FastAnalysisReport.vue | 1221 -- .../views/ai-analysis/components/index.vue | 3748 ----- .../src/views/ai-analysis/index.vue | 2045 --- .../src/views/ai-asset-analysis/index.vue | 491 - quantdinger_vue/src/views/billing/index.vue | 768 - quantdinger_vue/src/views/dashboard/index.vue | 2383 --- quantdinger_vue/src/views/exception/403.vue | 20 - quantdinger_vue/src/views/exception/404.vue | 20 - quantdinger_vue/src/views/exception/500.vue | 20 - .../components/BacktestHistoryDrawer.vue | 221 - .../components/BacktestModal.vue | 1642 --- .../components/BacktestRunViewer.vue | 283 - .../components/IndicatorEditor.vue | 1180 -- .../components/KlineChart.vue | 3887 ----- .../src/views/indicator-analysis/index.vue | 3455 ----- .../components/CommentList.vue | 402 - .../components/IndicatorCard.vue | 357 - .../components/IndicatorDetail.vue | 606 - .../src/views/indicator-community/index.vue | 1004 -- quantdinger_vue/src/views/portfolio/index.vue | 3200 ----- quantdinger_vue/src/views/profile/index.vue | 2041 --- quantdinger_vue/src/views/settings/index.vue | 828 -- .../components/AIDecisionRecords.vue | 539 - .../components/PositionRecords.vue | 806 -- .../components/TradingRecords.vue | 1242 -- .../src/views/trading-assistant/index.vue | 5758 -------- .../src/views/user-manage/index.vue | 1448 -- quantdinger_vue/src/views/user/Login.vue | 1598 --- .../src/views/user/RegisterResult.vue | 26 - quantdinger_vue/tests/unit/.eslintrc.js | 5 - quantdinger_vue/vue.config.js | 151 - scripts/build-frontend.sh | 58 + scripts/private-frontend-ci.yml.example | 63 + yarn.lock | 11922 ---------------- 250 files changed, 1895 insertions(+), 91621 deletions(-) create mode 100644 .github/workflows/update-frontend.yml delete mode 100644 QuantDinger.iml create mode 100644 backend_api_python/app/routes/quick_trade.py create mode 100644 frontend/Dockerfile create mode 100644 frontend/VERSION rename quantdinger_vue/deploy/nginx-docker.conf => frontend/nginx.conf (67%) delete mode 100644 package-lock.json delete mode 100644 quantdinger_vue/.browserslistrc delete mode 100644 quantdinger_vue/.dockerignore delete mode 100644 quantdinger_vue/.editorconfig delete mode 100644 quantdinger_vue/.env delete mode 100644 quantdinger_vue/.env.development delete mode 100644 quantdinger_vue/.env.preview delete mode 100644 quantdinger_vue/.eslintrc.js delete mode 100644 quantdinger_vue/.eslintrc.json delete mode 100644 quantdinger_vue/.gitattributes delete mode 100644 quantdinger_vue/.gitignore delete mode 100644 quantdinger_vue/.husky/.gitignore delete mode 100644 quantdinger_vue/.lintstagedrc.json delete mode 100644 quantdinger_vue/.prettierrc delete mode 100644 quantdinger_vue/.stylelintrc.js delete mode 100644 quantdinger_vue/.travis.yml delete mode 100644 quantdinger_vue/Dockerfile delete mode 100644 quantdinger_vue/README.md delete mode 100644 quantdinger_vue/babel.config.js delete mode 100644 quantdinger_vue/build-docker.ps1 delete mode 100644 quantdinger_vue/build-docker.sh delete mode 100644 quantdinger_vue/commitlint.config.js delete mode 100644 quantdinger_vue/config/plugin.config.js delete mode 100644 quantdinger_vue/config/themePluginConfig.js delete mode 100644 quantdinger_vue/deploy/caddy.conf delete mode 100644 quantdinger_vue/deploy/nginx.conf delete mode 100644 quantdinger_vue/jest.config.js delete mode 100644 quantdinger_vue/jsconfig.json delete mode 100644 quantdinger_vue/package.json delete mode 100644 quantdinger_vue/postcss.config.js delete mode 100644 quantdinger_vue/public/avatar2.jpg delete mode 100644 quantdinger_vue/public/index.html delete mode 100644 quantdinger_vue/public/logo.png delete mode 100644 quantdinger_vue/public/maps/world-atlas.json delete mode 100644 quantdinger_vue/public/maps/world.json delete mode 100644 quantdinger_vue/public/slogo.png delete mode 100644 quantdinger_vue/src/App.vue delete mode 100644 quantdinger_vue/src/api/ai-trading.js delete mode 100644 quantdinger_vue/src/api/auth.js delete mode 100644 quantdinger_vue/src/api/billing.js delete mode 100644 quantdinger_vue/src/api/credentials.js delete mode 100644 quantdinger_vue/src/api/dashboard.js delete mode 100644 quantdinger_vue/src/api/fast-analysis.js delete mode 100644 quantdinger_vue/src/api/global-market.js delete mode 100644 quantdinger_vue/src/api/login.js delete mode 100644 quantdinger_vue/src/api/manage.js delete mode 100644 quantdinger_vue/src/api/market.js delete mode 100644 quantdinger_vue/src/api/portfolio.js delete mode 100644 quantdinger_vue/src/api/settings.js delete mode 100644 quantdinger_vue/src/api/strategy.js delete mode 100644 quantdinger_vue/src/api/user.js delete mode 100644 quantdinger_vue/src/assets/background.svg delete mode 100644 quantdinger_vue/src/assets/icons/bx-analyse.svg delete mode 100644 quantdinger_vue/src/assets/logo.png delete mode 100644 quantdinger_vue/src/assets/logo.svg delete mode 100644 quantdinger_vue/src/assets/slogo.png delete mode 100644 quantdinger_vue/src/components/ArticleListContent/ArticleListContent.vue delete mode 100644 quantdinger_vue/src/components/ArticleListContent/index.js delete mode 100644 quantdinger_vue/src/components/AvatarList/Item.jsx delete mode 100644 quantdinger_vue/src/components/AvatarList/List.jsx delete mode 100644 quantdinger_vue/src/components/AvatarList/index.js delete mode 100644 quantdinger_vue/src/components/AvatarList/index.less delete mode 100644 quantdinger_vue/src/components/AvatarList/index.md delete mode 100644 quantdinger_vue/src/components/Charts/Bar.vue delete mode 100644 quantdinger_vue/src/components/Charts/ChartCard.vue delete mode 100644 quantdinger_vue/src/components/Charts/Liquid.vue delete mode 100644 quantdinger_vue/src/components/Charts/MiniArea.vue delete mode 100644 quantdinger_vue/src/components/Charts/MiniBar.vue delete mode 100644 quantdinger_vue/src/components/Charts/MiniProgress.vue delete mode 100644 quantdinger_vue/src/components/Charts/MiniSmoothArea.vue delete mode 100644 quantdinger_vue/src/components/Charts/Radar.vue delete mode 100644 quantdinger_vue/src/components/Charts/RankList.vue delete mode 100644 quantdinger_vue/src/components/Charts/TagCloud.vue delete mode 100644 quantdinger_vue/src/components/Charts/TransferBar.vue delete mode 100644 quantdinger_vue/src/components/Charts/Trend.vue delete mode 100644 quantdinger_vue/src/components/Charts/chart.less delete mode 100644 quantdinger_vue/src/components/Charts/smooth.area.less delete mode 100644 quantdinger_vue/src/components/Dialog.js delete mode 100644 quantdinger_vue/src/components/Editor/QuillEditor.vue delete mode 100644 quantdinger_vue/src/components/Editor/WangEditor.vue delete mode 100644 quantdinger_vue/src/components/Ellipsis/Ellipsis.vue delete mode 100644 quantdinger_vue/src/components/Ellipsis/index.js delete mode 100644 quantdinger_vue/src/components/Ellipsis/index.md delete mode 100644 quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue delete mode 100644 quantdinger_vue/src/components/FooterToolbar/index.js delete mode 100644 quantdinger_vue/src/components/FooterToolbar/index.less delete mode 100644 quantdinger_vue/src/components/FooterToolbar/index.md delete mode 100644 quantdinger_vue/src/components/GlobalFooter/index.vue delete mode 100644 quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue delete mode 100644 quantdinger_vue/src/components/GlobalHeader/RightContent.vue delete mode 100644 quantdinger_vue/src/components/IconSelector/IconSelector.vue delete mode 100644 quantdinger_vue/src/components/IconSelector/README.md delete mode 100644 quantdinger_vue/src/components/IconSelector/icons.js delete mode 100644 quantdinger_vue/src/components/IconSelector/index.js delete mode 100644 quantdinger_vue/src/components/MultiTab/MultiTab.vue delete mode 100644 quantdinger_vue/src/components/MultiTab/events.js delete mode 100644 quantdinger_vue/src/components/MultiTab/index.js delete mode 100644 quantdinger_vue/src/components/MultiTab/index.less delete mode 100644 quantdinger_vue/src/components/NProgress/nprogress.less delete mode 100644 quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue delete mode 100644 quantdinger_vue/src/components/NoticeIcon/index.js delete mode 100644 quantdinger_vue/src/components/NumberInfo/NumberInfo.vue delete mode 100644 quantdinger_vue/src/components/NumberInfo/index.js delete mode 100644 quantdinger_vue/src/components/NumberInfo/index.less delete mode 100644 quantdinger_vue/src/components/NumberInfo/index.md delete mode 100644 quantdinger_vue/src/components/Other/CarbonAds.vue delete mode 100644 quantdinger_vue/src/components/PageLoading/index.jsx delete mode 100644 quantdinger_vue/src/components/Search/GlobalSearch.jsx delete mode 100644 quantdinger_vue/src/components/Search/index.less delete mode 100644 quantdinger_vue/src/components/SelectLang/index.jsx delete mode 100644 quantdinger_vue/src/components/SelectLang/index.less delete mode 100644 quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue delete mode 100644 quantdinger_vue/src/components/SettingDrawer/SettingItem.vue delete mode 100644 quantdinger_vue/src/components/SettingDrawer/index.js delete mode 100644 quantdinger_vue/src/components/SettingDrawer/settingConfig.js delete mode 100644 quantdinger_vue/src/components/SettingDrawer/themeColor.js delete mode 100644 quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue delete mode 100644 quantdinger_vue/src/components/StandardFormRow/index.js delete mode 100644 quantdinger_vue/src/components/Table/README.md delete mode 100644 quantdinger_vue/src/components/Table/index.js delete mode 100644 quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx delete mode 100644 quantdinger_vue/src/components/TagSelect/index.jsx delete mode 100644 quantdinger_vue/src/components/TextArea/index.jsx delete mode 100644 quantdinger_vue/src/components/TextArea/style.less delete mode 100644 quantdinger_vue/src/components/Tree/Tree.jsx delete mode 100644 quantdinger_vue/src/components/Trend/Trend.vue delete mode 100644 quantdinger_vue/src/components/Trend/index.js delete mode 100644 quantdinger_vue/src/components/Trend/index.less delete mode 100644 quantdinger_vue/src/components/Trend/index.md delete mode 100644 quantdinger_vue/src/components/Turnstile/index.vue delete mode 100644 quantdinger_vue/src/components/_util/util.js delete mode 100644 quantdinger_vue/src/components/index.js delete mode 100644 quantdinger_vue/src/components/index.less delete mode 100644 quantdinger_vue/src/components/tools/TwoStepCaptcha.vue delete mode 100644 quantdinger_vue/src/config/aiModels.js delete mode 100644 quantdinger_vue/src/config/defaultSettings.js delete mode 100644 quantdinger_vue/src/config/router.config.js delete mode 100644 quantdinger_vue/src/core/bootstrap.js delete mode 100644 quantdinger_vue/src/core/directives/action.js delete mode 100644 quantdinger_vue/src/core/icons.js delete mode 100644 quantdinger_vue/src/core/lazy_use.js delete mode 100644 quantdinger_vue/src/core/permission/permission.js delete mode 100644 quantdinger_vue/src/core/use.js delete mode 100644 quantdinger_vue/src/global.less delete mode 100644 quantdinger_vue/src/layouts/BasicLayout.less delete mode 100644 quantdinger_vue/src/layouts/BasicLayout.vue delete mode 100644 quantdinger_vue/src/layouts/BlankLayout.vue delete mode 100644 quantdinger_vue/src/layouts/PageView.vue delete mode 100644 quantdinger_vue/src/layouts/RouteView.vue delete mode 100644 quantdinger_vue/src/layouts/UserLayout.vue delete mode 100644 quantdinger_vue/src/layouts/index.js delete mode 100644 quantdinger_vue/src/locales/index.js delete mode 100644 quantdinger_vue/src/locales/lang/ar-SA.js delete mode 100644 quantdinger_vue/src/locales/lang/de-DE.js delete mode 100644 quantdinger_vue/src/locales/lang/en-US.js delete mode 100644 quantdinger_vue/src/locales/lang/fr-FR.js delete mode 100644 quantdinger_vue/src/locales/lang/ja-JP.js delete mode 100644 quantdinger_vue/src/locales/lang/ko-KR.js delete mode 100644 quantdinger_vue/src/locales/lang/th-TH.js delete mode 100644 quantdinger_vue/src/locales/lang/vi-VN.js delete mode 100644 quantdinger_vue/src/locales/lang/zh-CN.js delete mode 100644 quantdinger_vue/src/locales/lang/zh-TW.js delete mode 100644 quantdinger_vue/src/main.js delete mode 100644 quantdinger_vue/src/mock/index.js delete mode 100644 quantdinger_vue/src/mock/services/article.js delete mode 100644 quantdinger_vue/src/mock/services/auth.js delete mode 100644 quantdinger_vue/src/mock/services/manage.js delete mode 100644 quantdinger_vue/src/mock/services/other.js delete mode 100644 quantdinger_vue/src/mock/services/tagCloud.js delete mode 100644 quantdinger_vue/src/mock/services/user.js delete mode 100644 quantdinger_vue/src/mock/util.js delete mode 100644 quantdinger_vue/src/permission.js delete mode 100644 quantdinger_vue/src/router/README.md delete mode 100644 quantdinger_vue/src/router/generator-routers.js delete mode 100644 quantdinger_vue/src/router/index.js delete mode 100644 quantdinger_vue/src/store/app-mixin.js delete mode 100644 quantdinger_vue/src/store/device-mixin.js delete mode 100644 quantdinger_vue/src/store/getters.js delete mode 100644 quantdinger_vue/src/store/i18n-mixin.js delete mode 100644 quantdinger_vue/src/store/index.js delete mode 100644 quantdinger_vue/src/store/modules/app.js delete mode 100644 quantdinger_vue/src/store/modules/async-router.js delete mode 100644 quantdinger_vue/src/store/modules/static-router.js delete mode 100644 quantdinger_vue/src/store/modules/user.js delete mode 100644 quantdinger_vue/src/store/mutation-types.js delete mode 100644 quantdinger_vue/src/utils/axios.js delete mode 100644 quantdinger_vue/src/utils/codeDecrypt.js delete mode 100644 quantdinger_vue/src/utils/domUtil.js delete mode 100644 quantdinger_vue/src/utils/filter.js delete mode 100644 quantdinger_vue/src/utils/request.js delete mode 100644 quantdinger_vue/src/utils/routeConvert.js delete mode 100644 quantdinger_vue/src/utils/screenLog.js delete mode 100644 quantdinger_vue/src/utils/util.js delete mode 100644 quantdinger_vue/src/utils/utils.less delete mode 100644 quantdinger_vue/src/views/404.vue delete mode 100644 quantdinger_vue/src/views/ai-analysis/components/FastAnalysisReport.vue delete mode 100644 quantdinger_vue/src/views/ai-analysis/components/index.vue delete mode 100644 quantdinger_vue/src/views/ai-analysis/index.vue delete mode 100644 quantdinger_vue/src/views/ai-asset-analysis/index.vue delete mode 100644 quantdinger_vue/src/views/billing/index.vue delete mode 100644 quantdinger_vue/src/views/dashboard/index.vue delete mode 100644 quantdinger_vue/src/views/exception/403.vue delete mode 100644 quantdinger_vue/src/views/exception/404.vue delete mode 100644 quantdinger_vue/src/views/exception/500.vue delete mode 100644 quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue delete mode 100644 quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue delete mode 100644 quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue delete mode 100644 quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue delete mode 100644 quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue delete mode 100644 quantdinger_vue/src/views/indicator-analysis/index.vue delete mode 100644 quantdinger_vue/src/views/indicator-community/components/CommentList.vue delete mode 100644 quantdinger_vue/src/views/indicator-community/components/IndicatorCard.vue delete mode 100644 quantdinger_vue/src/views/indicator-community/components/IndicatorDetail.vue delete mode 100644 quantdinger_vue/src/views/indicator-community/index.vue delete mode 100644 quantdinger_vue/src/views/portfolio/index.vue delete mode 100644 quantdinger_vue/src/views/profile/index.vue delete mode 100644 quantdinger_vue/src/views/settings/index.vue delete mode 100644 quantdinger_vue/src/views/trading-assistant/components/AIDecisionRecords.vue delete mode 100644 quantdinger_vue/src/views/trading-assistant/components/PositionRecords.vue delete mode 100644 quantdinger_vue/src/views/trading-assistant/components/TradingRecords.vue delete mode 100644 quantdinger_vue/src/views/trading-assistant/index.vue delete mode 100644 quantdinger_vue/src/views/user-manage/index.vue delete mode 100644 quantdinger_vue/src/views/user/Login.vue delete mode 100644 quantdinger_vue/src/views/user/RegisterResult.vue delete mode 100644 quantdinger_vue/tests/unit/.eslintrc.js delete mode 100644 quantdinger_vue/vue.config.js create mode 100644 scripts/build-frontend.sh create mode 100644 scripts/private-frontend-ci.yml.example delete mode 100644 yarn.lock diff --git a/.github/workflows/update-frontend.yml b/.github/workflows/update-frontend.yml new file mode 100644 index 0000000..1a9c037 --- /dev/null +++ b/.github/workflows/update-frontend.yml @@ -0,0 +1,84 @@ +# ====================================================== +# Workflow: Update Frontend Build +# ====================================================== +# This workflow is triggered manually (or via repository_dispatch) +# from your PRIVATE frontend repo after a new build. +# +# Setup: +# 1. In your PRIVATE frontend repo, create a GitHub Action that: +# - Builds the Vue.js project +# - Uses repository_dispatch to trigger this workflow +# - Or: upload the dist as an artifact and trigger this workflow +# +# 2. Create a GitHub Personal Access Token (PAT) with repo access +# and store it as a secret: FRONTEND_DEPLOY_TOKEN +# +# Alternative: Run manually from the Actions tab. +# ====================================================== + +name: Update Frontend Build + +on: + # Manual trigger from GitHub UI + workflow_dispatch: + inputs: + version: + description: 'Frontend version (e.g. 1.2.0)' + required: false + default: 'latest' + + # Triggered by private repo via repository_dispatch + repository_dispatch: + types: [frontend-updated] + +jobs: + update-frontend: + runs-on: ubuntu-latest + + steps: + - name: Checkout open-source repo + uses: actions/checkout@v4 + with: + token: ${{ secrets.FRONTEND_DEPLOY_TOKEN || secrets.GITHUB_TOKEN }} + + - name: Download frontend build artifact + # Option A: Download from private repo's latest release + # Replace OWNER/PRIVATE_REPO with your private frontend repo + env: + GH_TOKEN: ${{ secrets.FRONTEND_DEPLOY_TOKEN }} + run: | + echo "Downloading frontend build..." + # Option A: From GitHub Release + # gh release download latest -R OWNER/quantdinger-frontend -p 'dist.tar.gz' -D /tmp + # tar -xzf /tmp/dist.tar.gz -C frontend/dist/ + + # Option B: From repository_dispatch payload + if [ "${{ github.event.client_payload.artifact_url }}" != "" ]; then + curl -L -H "Authorization: token $GH_TOKEN" \ + "${{ github.event.client_payload.artifact_url }}" \ + -o /tmp/dist.tar.gz + rm -rf frontend/dist/* + tar -xzf /tmp/dist.tar.gz -C frontend/dist/ + else + echo "No artifact URL provided. Please use manual upload or release download." + echo "Skipping download step - assuming dist/ is already updated." + fi + + - name: Update VERSION + run: | + VERSION="${{ github.event.inputs.version || github.event.client_payload.version || 'latest' }}" + echo "$VERSION" > frontend/VERSION + echo "Frontend version: $VERSION" + + - name: Commit and push + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add frontend/dist/ frontend/VERSION + if git diff --staged --quiet; then + echo "No changes to commit" + else + VERSION=$(cat frontend/VERSION) + git commit -m "chore: update frontend build v${VERSION}" + git push + fi diff --git a/.gitignore b/.gitignore index 0220d98..2fd4513 100644 --- a/.gitignore +++ b/.gitignore @@ -1,432 +1,74 @@ +# ============================================ +# QuantDinger - Open Source Repository +# Frontend is closed-source, only dist/ is tracked. +# ============================================ -/quantdinger_vue/.browserslistrc -/quantdinger_vue/.dockerignore -/quantdinger_vue/.editorconfig -/quantdinger_vue/.env -/quantdinger_vue/.env.development -/quantdinger_vue/.env.preview -/quantdinger_vue/tests/unit/.eslintrc.js -/quantdinger_vue/.eslintrc.js -/quantdinger_vue/.eslintrc.json -/quantdinger_vue/.gitattributes -/quantdinger_vue/.husky/.gitignore -/quantdinger_vue/.gitignore -/quantdinger_vue/.lintstagedrc.json -/quantdinger_vue/.prettierrc -/quantdinger_vue/.stylelintrc.js -/quantdinger_vue/.travis.yml -/quantdinger_vue/src/views/exception/403.vue -/quantdinger_vue/src/views/exception/404.vue -/quantdinger_vue/src/views/404.vue -/quantdinger_vue/src/views/exception/500.vue -/quantdinger_vue/src/core/directives/action.js -/quantdinger_vue/src/api/ai-trading.js -/quantdinger_vue/src/views/trading-assistant/components/AIDecisionRecords.vue -/quantdinger_vue/src/config/aiModels.js -/quantdinger_vue/src/store/modules/app.js -/quantdinger_vue/src/App.vue -/quantdinger_vue/src/store/app-mixin.js -/quantdinger_vue/src/locales/lang/ar-SA.js -/quantdinger_vue/src/mock/services/article.js -/quantdinger_vue/src/components/ArticleListContent/ArticleListContent.vue -/quantdinger_vue/src/store/modules/async-router.js -/quantdinger_vue/src/api/auth.js -/quantdinger_vue/src/mock/services/auth.js -/quantdinger_vue/public/avatar2.jpg -/quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue -/quantdinger_vue/src/utils/axios.js -/quantdinger_vue/babel.config.js -/quantdinger_vue/src/assets/background.svg -/quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue -/quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue -/quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue -/quantdinger_vue/src/components/Charts/Bar.vue -/quantdinger_vue/src/layouts/BasicLayout.less -/quantdinger_vue/src/layouts/BasicLayout.vue -/quantdinger_vue/src/layouts/BlankLayout.vue -/quantdinger_vue/src/core/bootstrap.js -/quantdinger_vue/src/assets/icons/bx-analyse.svg -/quantdinger_vue/deploy/caddy.conf -/quantdinger_vue/src/components/Other/CarbonAds.vue -/quantdinger_vue/src/components/Charts/chart.less -/quantdinger_vue/src/components/Charts/ChartCard.vue -/quantdinger_vue/src/utils/codeDecrypt.js -/quantdinger_vue/commitlint.config.js -/quantdinger_vue/src/api/credentials.js -/quantdinger_vue/src/api/dashboard.js -/quantdinger_vue/src/locales/lang/de-DE.js -/quantdinger_vue/src/config/defaultSettings.js -/quantdinger_vue/src/store/device-mixin.js -/quantdinger_vue/src/components/Dialog.js -/quantdinger_vue/Dockerfile -/quantdinger_vue/src/utils/domUtil.js -/quantdinger_vue/src/components/Ellipsis/Ellipsis.vue -/quantdinger_vue/src/locales/lang/en-US.js -/quantdinger_vue/src/components/MultiTab/events.js -/quantdinger_vue/src/utils/filter.js -/quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue -/quantdinger_vue/src/locales/lang/fr-FR.js -/quantdinger_vue/src/router/generator-routers.js -/quantdinger_vue/src/store/getters.js -/quantdinger_vue/src/global.less -/quantdinger_vue/src/components/Search/GlobalSearch.jsx -/quantdinger_vue/src/store/i18n-mixin.js -/quantdinger_vue/src/components/IconSelector/icons.js -/quantdinger_vue/src/core/icons.js -/quantdinger_vue/src/components/IconSelector/IconSelector.vue -/quantdinger_vue/public/index.html -/quantdinger_vue/src/components/ArticleListContent/index.js -/quantdinger_vue/src/components/AvatarList/index.js -/quantdinger_vue/src/components/Ellipsis/index.js -/quantdinger_vue/src/components/FooterToolbar/index.js -/quantdinger_vue/src/components/IconSelector/index.js -/quantdinger_vue/src/components/MultiTab/index.js -/quantdinger_vue/src/components/NoticeIcon/index.js -/quantdinger_vue/src/components/NumberInfo/index.js -/quantdinger_vue/src/components/SettingDrawer/index.js -/quantdinger_vue/src/components/StandardFormRow/index.js -/quantdinger_vue/src/components/Table/index.js -/quantdinger_vue/src/components/Trend/index.js -/quantdinger_vue/src/components/index.js -/quantdinger_vue/src/layouts/index.js -/quantdinger_vue/src/locales/index.js -/quantdinger_vue/src/mock/index.js -/quantdinger_vue/src/router/index.js -/quantdinger_vue/src/store/index.js -/quantdinger_vue/src/components/PageLoading/index.jsx -/quantdinger_vue/src/components/SelectLang/index.jsx -/quantdinger_vue/src/components/TagSelect/index.jsx -/quantdinger_vue/src/components/TextArea/index.jsx -/quantdinger_vue/src/components/AvatarList/index.less -/quantdinger_vue/src/components/FooterToolbar/index.less -/quantdinger_vue/src/components/MultiTab/index.less -/quantdinger_vue/src/components/NumberInfo/index.less -/quantdinger_vue/src/components/Search/index.less -/quantdinger_vue/src/components/SelectLang/index.less -/quantdinger_vue/src/components/Trend/index.less -/quantdinger_vue/src/components/index.less -/quantdinger_vue/src/components/AvatarList/index.md -/quantdinger_vue/src/components/Ellipsis/index.md -/quantdinger_vue/src/components/FooterToolbar/index.md -/quantdinger_vue/src/components/NumberInfo/index.md -/quantdinger_vue/src/components/Trend/index.md -/quantdinger_vue/src/components/GlobalFooter/index.vue -/quantdinger_vue/src/components/Turnstile/index.vue -/quantdinger_vue/src/views/ai-analysis/components/index.vue -/quantdinger_vue/src/views/ai-analysis/index.vue -/quantdinger_vue/src/views/dashboard/index.vue -/quantdinger_vue/src/views/indicator-analysis/index.vue -/quantdinger_vue/src/views/indicator-community/index.vue -/quantdinger_vue/src/views/portfolio/index.vue -/quantdinger_vue/src/views/profile/index.vue -/quantdinger_vue/src/views/settings/index.vue -/quantdinger_vue/src/views/trading-assistant/index.vue -/quantdinger_vue/src/views/user-manage/index.vue -/quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue -/quantdinger_vue/src/components/AvatarList/Item.jsx -/quantdinger_vue/src/locales/lang/ja-JP.js -/quantdinger_vue/jest.config.js -/quantdinger_vue/jsconfig.json -/quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue -/quantdinger_vue/src/locales/lang/ko-KR.js -/quantdinger_vue/src/core/lazy_use.js -/quantdinger_vue/src/components/Charts/Liquid.vue -/quantdinger_vue/src/components/AvatarList/List.jsx -/quantdinger_vue/src/api/login.js -/quantdinger_vue/src/views/user/Login.vue -/quantdinger_vue/public/logo.png -/quantdinger_vue/src/assets/logo.png -/quantdinger_vue/src/assets/logo.svg -/quantdinger_vue/src/main.js -/quantdinger_vue/src/api/manage.js -/quantdinger_vue/src/mock/services/manage.js -/quantdinger_vue/src/api/market.js -/quantdinger_vue/src/components/Charts/MiniArea.vue -/quantdinger_vue/src/components/Charts/MiniBar.vue -/quantdinger_vue/src/components/Charts/MiniProgress.vue -/quantdinger_vue/src/components/Charts/MiniSmoothArea.vue -/quantdinger_vue/src/components/MultiTab/MultiTab.vue -/quantdinger_vue/src/store/mutation-types.js -/quantdinger_vue/deploy/nginx.conf -/quantdinger_vue/deploy/nginx-docker.conf -/quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue -/quantdinger_vue/src/components/NProgress/nprogress.less -/quantdinger_vue/src/components/NumberInfo/NumberInfo.vue -/quantdinger_vue/src/mock/services/other.js -/quantdinger_vue/package.json -/quantdinger_vue/src/layouts/PageView.vue -/quantdinger_vue/src/core/permission/permission.js -/quantdinger_vue/src/permission.js -/quantdinger_vue/config/plugin.config.js -/quantdinger_vue/pnpm-lock.yaml -/quantdinger_vue/src/api/portfolio.js -/quantdinger_vue/src/views/trading-assistant/components/PositionRecords.vue -/quantdinger_vue/postcss.config.js -/quantdinger_vue/src/components/Editor/QuillEditor.vue -/quantdinger_vue/src/components/Charts/Radar.vue -/quantdinger_vue/src/components/Charts/RankList.vue -/quantdinger_vue/src/components/IconSelector/README.md -/quantdinger_vue/src/components/Table/README.md -/quantdinger_vue/src/router/README.md -/quantdinger_vue/README.md -/quantdinger_vue/src/views/user/RegisterResult.vue -/quantdinger_vue/src/utils/request.js -/quantdinger_vue/src/components/GlobalHeader/RightContent.vue -/quantdinger_vue/src/utils/routeConvert.js -/quantdinger_vue/src/config/router.config.js -/quantdinger_vue/src/layouts/RouteView.vue -/quantdinger_vue/src/utils/screenLog.js -/quantdinger_vue/src/components/SettingDrawer/settingConfig.js -/quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue -/quantdinger_vue/src/components/SettingDrawer/SettingItem.vue -/quantdinger_vue/src/api/settings.js -/quantdinger_vue/public/slogo.png -/quantdinger_vue/src/assets/slogo.png -/quantdinger_vue/src/components/Charts/smooth.area.less -/quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue -/quantdinger_vue/src/store/modules/static-router.js -/quantdinger_vue/src/api/strategy.js -/quantdinger_vue/src/components/TextArea/style.less -/quantdinger_vue/src/mock/services/tagCloud.js -/quantdinger_vue/src/components/Charts/TagCloud.vue -/quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx -/quantdinger_vue/src/locales/lang/th-TH.js -/quantdinger_vue/src/components/SettingDrawer/themeColor.js -/quantdinger_vue/config/themePluginConfig.js -/quantdinger_vue/src/views/trading-assistant/components/TradingRecords.vue -/quantdinger_vue/src/components/Charts/TransferBar.vue -/quantdinger_vue/src/components/Tree/Tree.jsx -/quantdinger_vue/src/components/Charts/Trend.vue -/quantdinger_vue/src/components/Trend/Trend.vue -/quantdinger_vue/src/components/tools/TwoStepCaptcha.vue -/quantdinger_vue/src/core/use.js -/quantdinger_vue/src/api/user.js -/quantdinger_vue/src/mock/services/user.js -/quantdinger_vue/src/store/modules/user.js -/quantdinger_vue/src/layouts/UserLayout.vue -/quantdinger_vue/src/components/_util/util.js -/quantdinger_vue/src/mock/util.js -/quantdinger_vue/src/utils/util.js -/quantdinger_vue/src/utils/utils.less -/quantdinger_vue/src/locales/lang/vi-VN.js -/quantdinger_vue/vue.config.js -/quantdinger_vue/src/components/Editor/WangEditor.vue -/quantdinger_vue/yarn.lock -/quantdinger_vue/src/locales/lang/zh-CN.js -/quantdinger_vue/src/locales/lang/zh-TW.js -/quantdinger_vue/.browserslistrc -/quantdinger_vue/.dockerignore -/quantdinger_vue/.editorconfig -/quantdinger_vue/.env -/quantdinger_vue/.env.development -/quantdinger_vue/.env.preview -/quantdinger_vue/tests/unit/.eslintrc.js -/quantdinger_vue/.eslintrc.js -/quantdinger_vue/.eslintrc.json -/quantdinger_vue/.gitattributes -/quantdinger_vue/.husky/.gitignore -/quantdinger_vue/.gitignore -/quantdinger_vue/.lintstagedrc.json -/quantdinger_vue/.prettierrc -/quantdinger_vue/.stylelintrc.js -/quantdinger_vue/.travis.yml -/quantdinger_vue/src/views/exception/403.vue -/quantdinger_vue/src/views/exception/404.vue -/quantdinger_vue/src/views/404.vue -/quantdinger_vue/src/views/exception/500.vue -/quantdinger_vue/src/core/directives/action.js -/quantdinger_vue/src/api/ai-trading.js -/quantdinger_vue/src/views/trading-assistant/components/AIDecisionRecords.vue -/quantdinger_vue/src/config/aiModels.js -/quantdinger_vue/src/store/modules/app.js -/quantdinger_vue/src/App.vue -/quantdinger_vue/src/store/app-mixin.js -/quantdinger_vue/src/locales/lang/ar-SA.js -/quantdinger_vue/src/mock/services/article.js -/quantdinger_vue/src/components/ArticleListContent/ArticleListContent.vue -/quantdinger_vue/src/store/modules/async-router.js -/quantdinger_vue/src/api/auth.js -/quantdinger_vue/src/mock/services/auth.js -/quantdinger_vue/public/avatar2.jpg -/quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue -/quantdinger_vue/src/utils/axios.js -/quantdinger_vue/babel.config.js -/quantdinger_vue/src/assets/background.svg -/quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue -/quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue -/quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue -/quantdinger_vue/src/components/Charts/Bar.vue -/quantdinger_vue/src/layouts/BasicLayout.less -/quantdinger_vue/src/layouts/BasicLayout.vue -/quantdinger_vue/src/layouts/BlankLayout.vue -/quantdinger_vue/src/core/bootstrap.js -/quantdinger_vue/src/assets/icons/bx-analyse.svg -/quantdinger_vue/deploy/caddy.conf -/quantdinger_vue/src/components/Other/CarbonAds.vue -/quantdinger_vue/src/components/Charts/chart.less -/quantdinger_vue/src/components/Charts/ChartCard.vue -/quantdinger_vue/src/utils/codeDecrypt.js -/quantdinger_vue/commitlint.config.js -/quantdinger_vue/src/api/credentials.js -/quantdinger_vue/src/api/dashboard.js -/quantdinger_vue/src/locales/lang/de-DE.js -/quantdinger_vue/src/config/defaultSettings.js -/quantdinger_vue/src/store/device-mixin.js -/quantdinger_vue/src/components/Dialog.js -/quantdinger_vue/Dockerfile -/quantdinger_vue/src/utils/domUtil.js -/quantdinger_vue/src/components/Ellipsis/Ellipsis.vue -/quantdinger_vue/src/locales/lang/en-US.js -/quantdinger_vue/src/components/MultiTab/events.js -/quantdinger_vue/src/utils/filter.js -/quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue -/quantdinger_vue/src/locales/lang/fr-FR.js -/quantdinger_vue/src/router/generator-routers.js -/quantdinger_vue/src/store/getters.js -/quantdinger_vue/src/global.less -/quantdinger_vue/src/components/Search/GlobalSearch.jsx -/quantdinger_vue/src/store/i18n-mixin.js -/quantdinger_vue/src/components/IconSelector/icons.js -/quantdinger_vue/src/core/icons.js -/quantdinger_vue/src/components/IconSelector/IconSelector.vue -/quantdinger_vue/public/index.html -/quantdinger_vue/src/components/ArticleListContent/index.js -/quantdinger_vue/src/components/AvatarList/index.js -/quantdinger_vue/src/components/Ellipsis/index.js -/quantdinger_vue/src/components/FooterToolbar/index.js -/quantdinger_vue/src/components/IconSelector/index.js -/quantdinger_vue/src/components/MultiTab/index.js -/quantdinger_vue/src/components/NoticeIcon/index.js -/quantdinger_vue/src/components/NumberInfo/index.js -/quantdinger_vue/src/components/SettingDrawer/index.js -/quantdinger_vue/src/components/StandardFormRow/index.js -/quantdinger_vue/src/components/Table/index.js -/quantdinger_vue/src/components/Trend/index.js -/quantdinger_vue/src/components/index.js -/quantdinger_vue/src/layouts/index.js -/quantdinger_vue/src/locales/index.js -/quantdinger_vue/src/mock/index.js -/quantdinger_vue/src/router/index.js -/quantdinger_vue/src/store/index.js -/quantdinger_vue/src/components/PageLoading/index.jsx -/quantdinger_vue/src/components/SelectLang/index.jsx -/quantdinger_vue/src/components/TagSelect/index.jsx -/quantdinger_vue/src/components/TextArea/index.jsx -/quantdinger_vue/src/components/AvatarList/index.less -/quantdinger_vue/src/components/FooterToolbar/index.less -/quantdinger_vue/src/components/MultiTab/index.less -/quantdinger_vue/src/components/NumberInfo/index.less -/quantdinger_vue/src/components/Search/index.less -/quantdinger_vue/src/components/SelectLang/index.less -/quantdinger_vue/src/components/Trend/index.less -/quantdinger_vue/src/components/index.less -/quantdinger_vue/src/components/AvatarList/index.md -/quantdinger_vue/src/components/Ellipsis/index.md -/quantdinger_vue/src/components/FooterToolbar/index.md -/quantdinger_vue/src/components/NumberInfo/index.md -/quantdinger_vue/src/components/Trend/index.md -/quantdinger_vue/src/components/GlobalFooter/index.vue -/quantdinger_vue/src/components/Turnstile/index.vue -/quantdinger_vue/src/views/ai-analysis/components/index.vue -/quantdinger_vue/src/views/ai-analysis/index.vue -/quantdinger_vue/src/views/dashboard/index.vue -/quantdinger_vue/src/views/indicator-analysis/index.vue -/quantdinger_vue/src/views/indicator-community/index.vue -/quantdinger_vue/src/views/portfolio/index.vue -/quantdinger_vue/src/views/profile/index.vue -/quantdinger_vue/src/views/settings/index.vue -/quantdinger_vue/src/views/trading-assistant/index.vue -/quantdinger_vue/src/views/user-manage/index.vue -/quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue -/quantdinger_vue/src/components/AvatarList/Item.jsx -/quantdinger_vue/src/locales/lang/ja-JP.js -/quantdinger_vue/jest.config.js -/quantdinger_vue/jsconfig.json -/quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue -/quantdinger_vue/src/locales/lang/ko-KR.js -/quantdinger_vue/src/core/lazy_use.js -/quantdinger_vue/src/components/Charts/Liquid.vue -/quantdinger_vue/src/components/AvatarList/List.jsx -/quantdinger_vue/src/api/login.js -/quantdinger_vue/src/views/user/Login.vue -/quantdinger_vue/public/logo.png -/quantdinger_vue/src/assets/logo.png -/quantdinger_vue/src/assets/logo.svg -/quantdinger_vue/src/main.js -/quantdinger_vue/src/api/manage.js -/quantdinger_vue/src/mock/services/manage.js -/quantdinger_vue/src/api/market.js -/quantdinger_vue/src/components/Charts/MiniArea.vue -/quantdinger_vue/src/components/Charts/MiniBar.vue -/quantdinger_vue/src/components/Charts/MiniProgress.vue -/quantdinger_vue/src/components/Charts/MiniSmoothArea.vue -/quantdinger_vue/src/components/MultiTab/MultiTab.vue -/quantdinger_vue/src/store/mutation-types.js -/quantdinger_vue/deploy/nginx.conf -/quantdinger_vue/deploy/nginx-docker.conf -/quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue -/quantdinger_vue/src/components/NProgress/nprogress.less -/quantdinger_vue/src/components/NumberInfo/NumberInfo.vue -/quantdinger_vue/src/mock/services/other.js -/quantdinger_vue/package.json -/quantdinger_vue/src/layouts/PageView.vue -/quantdinger_vue/src/core/permission/permission.js -/quantdinger_vue/src/permission.js -/quantdinger_vue/config/plugin.config.js -/quantdinger_vue/pnpm-lock.yaml -/quantdinger_vue/src/api/portfolio.js -/quantdinger_vue/src/views/trading-assistant/components/PositionRecords.vue -/quantdinger_vue/postcss.config.js -/quantdinger_vue/src/components/Editor/QuillEditor.vue -/quantdinger_vue/src/components/Charts/Radar.vue -/quantdinger_vue/src/components/Charts/RankList.vue -/quantdinger_vue/src/components/IconSelector/README.md -/quantdinger_vue/src/components/Table/README.md -/quantdinger_vue/src/router/README.md -/quantdinger_vue/README.md -/quantdinger_vue/src/views/user/RegisterResult.vue -/quantdinger_vue/src/utils/request.js -/quantdinger_vue/src/components/GlobalHeader/RightContent.vue -/quantdinger_vue/src/utils/routeConvert.js -/quantdinger_vue/src/config/router.config.js -/quantdinger_vue/src/layouts/RouteView.vue -/quantdinger_vue/src/utils/screenLog.js -/quantdinger_vue/src/components/SettingDrawer/settingConfig.js -/quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue -/quantdinger_vue/src/components/SettingDrawer/SettingItem.vue -/quantdinger_vue/src/api/settings.js -/quantdinger_vue/public/slogo.png -/quantdinger_vue/src/assets/slogo.png -/quantdinger_vue/src/components/Charts/smooth.area.less -/quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue -/quantdinger_vue/src/store/modules/static-router.js -/quantdinger_vue/src/api/strategy.js -/quantdinger_vue/src/components/TextArea/style.less -/quantdinger_vue/src/mock/services/tagCloud.js -/quantdinger_vue/src/components/Charts/TagCloud.vue -/quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx -/quantdinger_vue/src/locales/lang/th-TH.js -/quantdinger_vue/src/components/SettingDrawer/themeColor.js -/quantdinger_vue/config/themePluginConfig.js -/quantdinger_vue/src/views/trading-assistant/components/TradingRecords.vue -/quantdinger_vue/src/components/Charts/TransferBar.vue -/quantdinger_vue/src/components/Tree/Tree.jsx -/quantdinger_vue/src/components/Charts/Trend.vue -/quantdinger_vue/src/components/Trend/Trend.vue -/quantdinger_vue/src/components/tools/TwoStepCaptcha.vue -/quantdinger_vue/src/core/use.js -/quantdinger_vue/src/api/user.js -/quantdinger_vue/src/mock/services/user.js -/quantdinger_vue/src/store/modules/user.js -/quantdinger_vue/src/layouts/UserLayout.vue -/quantdinger_vue/src/components/_util/util.js -/quantdinger_vue/src/mock/util.js -/quantdinger_vue/src/utils/util.js -/quantdinger_vue/src/utils/utils.less -/quantdinger_vue/src/locales/lang/vi-VN.js -/quantdinger_vue/vue.config.js -/quantdinger_vue/src/components/Editor/WangEditor.vue -/quantdinger_vue/yarn.lock -/quantdinger_vue/src/locales/lang/zh-CN.js -/quantdinger_vue/src/locales/lang/zh-TW.js -/quantdinger_vue/.browserslistrc +# ======================== +# Frontend Source (CLOSED SOURCE - NOT tracked) +# ======================== +/quantdinger_vue/ + +# ======================== +# Frontend dist - DO track (pre-built) +# ======================== +!/frontend/ +!/frontend/dist/ +!/frontend/dist/** + +# ======================== +# Environment & Secrets +# ======================== +.env +.env.local +.env.*.local +backend_api_python/.env + +# ======================== +# IDE & OS +# ======================== +.idea/ +.vscode/ +*.swp +*.swo +*~ +.DS_Store +Thumbs.db +*.iml + +# ======================== +# Python +# ======================== +__pycache__/ +*.py[cod] +*$py.class +*.egg-info/ +dist/ +build/ +*.egg +.eggs/ +venv/ +.venv/ +env/ + +# ======================== +# Node (if any remain) +# ======================== +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +package-lock.json +yarn.lock + +# ======================== +# Logs & Runtime Data +# ======================== +*.log +backend_api_python/logs/ +backend_api_python/data/quantdinger.db +backend_api_python/data/memory/ + +# ======================== +# Docker +# ======================== +docker-compose.override.yml diff --git a/QuantDinger.iml b/QuantDinger.iml deleted file mode 100644 index cbaeb14..0000000 --- a/QuantDinger.iml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/README.md b/README.md index 18ec9e0..5784378 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,8 @@

License + Version Python - Vue Docker Stars

@@ -62,12 +62,12 @@ QuantDinger is built for traders, researchers, and engineers who: ### Core Value -- **๐Ÿ”“ Apache 2.0 Open Source (Code)**: Permissive and commercial-friendly +- **๐Ÿ”“ Apache 2.0 Open Source (Backend)**: Permissive and commercial-friendly - **๐Ÿ Python-Native & Visual**: Write indicators in Python with AI assistance, visualize on built-in K-line charts - **๐Ÿค– AI-Loop Optimization**: AI analyzes backtest results to suggest parameter tuning, forming a closed optimization loop - **๐ŸŒ Universal Market Access**: Crypto (Live), US Stocks (IBKR), Forex (MT5), Futures (Data/Notify) - **๐Ÿ’ณ Built-in Monetization**: Membership subscription, credit system, USDT on-chain payment -- **โšก Docker & Clean Arch**: 4-line command deployment with modern tech stack +- **โšก Docker One-Click Deploy**: `docker-compose up -d` โ€” zero dependency, zero build, production-ready in 2 minutes --- @@ -82,17 +82,64 @@ QuantDinger is built for traders, researchers, and engineers who: --- -## ๐Ÿ“š Documentation +## ๐Ÿ“š Documentation Index -### Guides -- [Python Strategy Development Guide](docs/STRATEGY_DEV_GUIDE.md) -- [Interactive Brokers (IBKR) Trading Guide](docs/IBKR_TRADING_GUIDE_EN.md) ๐Ÿ†• -- [MetaTrader 5 (MT5) Trading Guide](docs/MT5_TRADING_GUIDE_EN.md) ๐Ÿ†• +All detailed guides and tutorials are in the [`docs/`](docs/) folder. Click any link below to jump directly. -### Notification Configuration -- [Telegram Notification Setup](docs/NOTIFICATION_TELEGRAM_CONFIG_EN.md) -- [Email (SMTP) Notification Setup](docs/NOTIFICATION_EMAIL_CONFIG_EN.md) -- [SMS (Twilio) Notification Setup](docs/NOTIFICATION_SMS_CONFIG_EN.md) +### ๐Ÿ“‹ General + +| Document | Description | +|----------|-------------| +| [Changelog](docs/CHANGELOG.md) | Version history, new features, bug fixes, and migration notes | +| [Multi-User Setup](docs/multi-user-setup.md) | PostgreSQL-based multi-user deployment guide | + +### ๐Ÿ Strategy Development + +| Document | Language | +|----------|----------| +| [Strategy Development Guide](docs/STRATEGY_DEV_GUIDE.md) | ๐Ÿ‡บ๐Ÿ‡ธ English | +| [็ญ–็•ฅๅผ€ๅ‘ๆŒ‡ๅ—](docs/STRATEGY_DEV_GUIDE_CN.md) | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | +| [็ญ–็•ฅ้–‹็™ผๆŒ‡ๅ—](docs/STRATEGY_DEV_GUIDE_TW.md) | ๐Ÿ‡น๐Ÿ‡ผ ็น้ซ”ไธญๆ–‡ | +| [ใ‚นใƒˆใƒฉใƒ†ใ‚ธใƒผ้–‹็™บใ‚ฌใ‚คใƒ‰](docs/STRATEGY_DEV_GUIDE_JA.md) | ๐Ÿ‡ฏ๐Ÿ‡ต ๆ—ฅๆœฌ่ชž | +| [์ „๋žต ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ](docs/STRATEGY_DEV_GUIDE_KO.md) | ๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ์–ด | + +### ๐Ÿ“ˆ Cross-Sectional Strategy + +| Document | Language | +|----------|----------| +| [Cross-Sectional Strategy Guide](docs/CROSS_SECTIONAL_STRATEGY_GUIDE_EN.md) | ๐Ÿ‡บ๐Ÿ‡ธ English | +| [ๆˆช้ข็ญ–็•ฅๅผ€ๅ‘ๆŒ‡ๅ—](docs/CROSS_SECTIONAL_STRATEGY_GUIDE_CN.md) | ๐Ÿ‡จ๐Ÿ‡ณ ็ฎ€ไฝ“ไธญๆ–‡ | + +### ๐Ÿฆ Broker Integration + +| Document | Description | +|----------|-------------| +| [IBKR Trading Guide](docs/IBKR_TRADING_GUIDE_EN.md) | Interactive Brokers (US Stocks) integration | +| [MT5 Trading Guide (EN)](docs/MT5_TRADING_GUIDE_EN.md) | MetaTrader 5 (Forex) integration โ€” English | +| [MT5 ไบคๆ˜“ๆŒ‡ๅ— (CN)](docs/MT5_TRADING_GUIDE_CN.md) | MetaTrader 5 (Forex) ้›†ๆˆๆŒ‡ๅ— โ€” ไธญๆ–‡ | + +### ๐Ÿ” OAuth Configuration + +| Document | Language | +|----------|----------| +| [OAuth Configuration (EN)](docs/OAUTH_CONFIG_EN.md) | ๐Ÿ‡บ๐Ÿ‡ธ Google & GitHub OAuth setup | +| [OAuth ้…็ฝฎๆŒ‡ๅ— (CN)](docs/OAUTH_CONFIG_CN.md) | ๐Ÿ‡จ๐Ÿ‡ณ Google & GitHub OAuth ้…็ฝฎ | + +### ๐Ÿ”” Notification Configuration + +| Channel | English | ไธญๆ–‡ | +|---------|---------|------| +| **Telegram** | [Setup Guide](docs/NOTIFICATION_TELEGRAM_CONFIG_EN.md) | [้…็ฝฎๆŒ‡ๅ—](docs/NOTIFICATION_TELEGRAM_CONFIG_CH.md) | +| **Email (SMTP)** | [Setup Guide](docs/NOTIFICATION_EMAIL_CONFIG_EN.md) | [้…็ฝฎๆŒ‡ๅ—](docs/NOTIFICATION_EMAIL_CONFIG_CH.md) | +| **SMS (Twilio)** | [Setup Guide](docs/NOTIFICATION_SMS_CONFIG_EN.md) | [้…็ฝฎๆŒ‡ๅ—](docs/NOTIFICATION_SMS_CONFIG_CH.md) | + +### ๐Ÿ’ป Code Examples + +| File | Description | +|------|-------------| +| [docs/examples/](docs/examples/) | Python strategy code examples and templates | + +--- ## ๐Ÿ“ธ Visual Tour @@ -175,13 +222,14 @@ QuantDinger is built for traders, researchers, and engineers who: *Fast, Accurate, Multi-Market Intelligence.* - **Fast Analysis Mode**: Single LLM call architecture for quick, accurate analysis -- **AI Trading Opportunities Radar** ๐Ÿ†•: Auto-scans Crypto, US Stocks, and Forex markets every hour, displaying opportunities in a rolling carousel +- **AI Trading Opportunities Radar**: Auto-scans Crypto, US Stocks, and Forex markets every hour, displaying opportunities in a rolling carousel +- **Quick Trade Panel (โšก้—ช็”ตไบคๆ˜“)**: Side-sliding trade panel โ€” see an AI signal or indicator opportunity, click "Trade Now" to instantly place an order without leaving the page. Supports market/limit orders, leverage, TP/SL price, and one-click position close. - **ATR-Based Trading Levels**: Stop-loss and take-profit recommendations based on technical analysis - **Analysis Memory**: Store analysis results for history review and continuous learning - **Strategic Integration**: AI analysis can serve as a "Market Filter" for your strategies -### 4. Membership & Billing System ๐Ÿ†• -*Built-in Monetization for SaaS Deployment.* +### 4. Membership & Billing System +*Built-in Monetization for Deployment.* - **Subscription Plans**: Monthly / Yearly / Lifetime tiers with configurable pricing - **Credit System**: Each plan includes credits; lifetime members receive monthly credit bonuses @@ -193,7 +241,7 @@ QuantDinger is built for traders, researchers, and engineers who: - **Publish & Share**: Share your Python indicators with the community - **Credit-Based Purchase**: Buy premium indicators from other users with credits -- **VIP Free Indicators** ๐Ÿ†•: Mark indicators as "VIP Free" โ€” VIP members can use them without spending credits +- **VIP Free Indicators**: Mark indicators as "VIP Free" โ€” VIP members can use them without spending credits - **Rating & Reviews**: Rate and review purchased indicators - **Live Performance Tracking**: Real-time performance stats aggregated from backtests and live trades @@ -320,10 +368,10 @@ Simply configure your preferred provider's API key in `.env`. The system auto-de ### 11. Tech Stack - **Backend**: Python (Flask) + PostgreSQL + Redis (optional) -- **Frontend**: Vue 2 + Ant Design Vue + KlineCharts/ECharts +- **Frontend**: Pre-built (Ant Design Vue + KlineCharts/ECharts) - **Payment**: USDT TRC20 on-chain (HD Wallet xpub derivation + TronGrid API) - **Mobile**: Vue 3 + Capacitor (Android / iOS) โ€” see `QuantDinger-Mobile/` -- **Deployment**: Docker Compose (with PostgreSQL) +- **Deployment**: Docker Compose (one-click, zero build) - **Current Version**: V2.2.1 ([Changelog](docs/CHANGELOG.md)) --- @@ -381,120 +429,165 @@ All UI elements, error messages, and documentation are fully translated. Languag --- -## ๐Ÿš€ Quick Start +## ๐Ÿš€ Quick Start (Docker One-Click Deploy) -### Option 1: Docker (Recommended) +> **Prerequisites**: Docker & Docker Compose installed. +> No Node.js, no Python environment needed โ€” everything runs in containers. + +### 1. Clone & Configure ```bash -# 1. Clone & configure git clone https://github.com/brokermr810/QuantDinger.git cd QuantDinger +``` + +### 2. Set Up Environment + +```bash +# Copy the environment template cp backend_api_python/env.example backend_api_python/.env +``` -# 2. Edit .env โ€” set your admin password & AI API key -# ADMIN_USER=quantdinger -# ADMIN_PASSWORD=your_password -# OPENROUTER_API_KEY=your_key (optional, for AI features) +> **Windows PowerShell**: +> ```powershell +> Copy-Item backend_api_python\env.example -Destination backend_api_python\.env +> ``` -# 3. Start all services +Edit `backend_api_python/.env` with your settings: + +```ini +# Required โ€” Change these for production! +ADMIN_USER=quantdinger +ADMIN_PASSWORD=your_secure_password +SECRET_KEY=your_random_secret_key + +# Optional โ€” Enable AI features +OPENROUTER_API_KEY=your_openrouter_key +# or +OPENAI_API_KEY=your_openai_key +``` + +### 3. Launch + +```bash docker-compose up -d --build ``` -> **Windows PowerShell**: use `Copy-Item backend_api_python\env.example -Destination backend_api_python\.env` instead of `cp`. - -**That's it!** Services will be available at: +**That's it!** ๐ŸŽ‰ Wait about 30 seconds for all services to start. | Service | URL | |---------|-----| -| Frontend UI | http://localhost:8888 | -| Backend API | http://localhost:5000 | +| **Frontend UI** | http://localhost:8888 | +| Backend API | http://localhost:5000 (internal) | +| PostgreSQL | localhost:5432 (internal) | Default login: `quantdinger` / `123456` (change in `.env` for production). -#### Common Docker Commands +### Common Docker Commands ```bash -docker-compose ps # View status -docker-compose logs -f backend # View backend logs -docker-compose restart # Restart services -docker-compose up -d --build # Rebuild & restart -docker-compose down # Stop services +docker-compose ps # View service status +docker-compose logs -f backend # View backend logs (real-time) +docker-compose logs -f frontend # View frontend/nginx logs +docker-compose restart backend # Restart backend only +docker-compose up -d --build # Rebuild & restart all +docker-compose down # Stop all services ``` -#### Update to Latest Version +### Update to Latest Version ```bash -git pull && docker-compose up -d --build +git pull +docker-compose up -d --build ``` -#### Backup & Restore +### Backup & Restore ```bash # Backup database -docker exec quantdinger-db pg_dump -U quantdinger quantdinger > backup.sql +docker exec quantdinger-db pg_dump -U quantdinger quantdinger > backup_$(date +%Y%m%d).sql # Restore database cat backup.sql | docker exec -i quantdinger-db psql -U quantdinger quantdinger ``` ---- +### Custom Port -### Option 2: Local Development +Create a `.env` file in the project root to override docker-compose defaults: -**Prerequisites**: Python 3.10+, Node.js 16+, PostgreSQL 14+ - -```bash -# 1. Setup database -sudo -u postgres psql -c "CREATE DATABASE quantdinger; CREATE USER quantdinger WITH ENCRYPTED PASSWORD 'your_password'; GRANT ALL PRIVILEGES ON DATABASE quantdinger TO quantdinger;" -psql -U quantdinger -d quantdinger -f backend_api_python/migrations/init.sql - -# 2. Start backend -cd backend_api_python -pip install -r requirements.txt -cp env.example .env # Edit .env with your DATABASE_URL -python run.py # โ†’ http://localhost:5000 - -# 3. Start frontend (in another terminal) -cd quantdinger_vue -npm install -npm run serve # โ†’ http://localhost:8000 +```ini +FRONTEND_PORT=3000 # Change frontend port (default: 8888) +BACKEND_PORT=127.0.0.1:5001 # Change backend port (default: 5000) +DB_PORT=127.0.0.1:5433 # Change database port (default: 5432) ``` --- -### Architecture +## ๐Ÿ—๏ธ Architecture ```text -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ quantdinger_vue โ”‚ -โ”‚ (Vue 2 + Ant Design Vue) โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ HTTP (/api/*) - โ–ผ -โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” -โ”‚ backend_api_python โ”‚ -โ”‚ (Flask + strategy runtime) โ”‚ -โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ - โ”‚ - โ”œโ”€ PostgreSQL (multi-user, orders, membership) - โ”œโ”€ Redis (optional cache) - โ”œโ”€ TronGrid API (USDT payment verification) - โ””โ”€ Data providers / LLMs / Exchanges +โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” +โ”‚ Docker Compose โ”‚ +โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ frontend (Nginx) โ”‚ โ”‚ +โ”‚ โ”‚ Pre-built static files โ”‚ โ”‚ +โ”‚ โ”‚ โ†’ :8888 โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ /api/* proxy โ”‚ +โ”‚ โ–ผ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ backend (Python/Flask) โ”‚ โ”‚ +โ”‚ โ”‚ API + AI + Strategy Runtime โ”‚ โ”‚ +โ”‚ โ”‚ โ†’ :5000 โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ โ”‚ +โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ +โ”‚ โ”‚ postgres (PostgreSQL 16) โ”‚ โ”‚ +โ”‚ โ”‚ Users, Orders, Strategies, ... โ”‚ โ”‚ +โ”‚ โ”‚ โ†’ :5432 โ”‚ โ”‚ +โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ +โ”‚ โ”‚ +โ”‚ External connections: โ”‚ +โ”‚ โ”œโ”€ LLM APIs (OpenRouter/OpenAI/...) โ”‚ +โ”‚ โ”œโ”€ Exchange APIs (Binance/OKX/...) โ”‚ +โ”‚ โ”œโ”€ TronGrid API (USDT payment) โ”‚ +โ”‚ โ””โ”€ Data providers (Yahoo/Finnhub/...) โ”‚ +โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ### Repository Layout ```text -. -โ”œโ”€ backend_api_python/ # Flask API + AI + backtest + strategy + billing -โ”‚ โ”œโ”€ app/ -โ”‚ โ”‚ โ”œโ”€ routes/ # API endpoints (user, billing, indicator, etc.) -โ”‚ โ”‚ โ””โ”€ services/ # Business logic (trading, payment, community) -โ”‚ โ”œโ”€ migrations/init.sql # Database schema -โ”‚ โ”œโ”€ env.example # Copy to .env for configuration -โ”‚ โ””โ”€ run.py # Entrypoint -โ”œโ”€ quantdinger_vue/ # Vue 2 UI (Ant Design Vue) -โ””โ”€ QuantDinger-Mobile/ # Vue 3 + Capacitor mobile app (optional) +QuantDinger/ +โ”œโ”€โ”€ backend_api_python/ # ๐Ÿ Backend API (Open Source) +โ”‚ โ”œโ”€โ”€ app/ +โ”‚ โ”‚ โ”œโ”€โ”€ routes/ # API endpoints (user, billing, strategy, ...) +โ”‚ โ”‚ โ”œโ”€โ”€ services/ # Business logic (trading, payment, AI, ...) +โ”‚ โ”‚ โ”œโ”€โ”€ data_sources/ # Market data providers +โ”‚ โ”‚ โ””โ”€โ”€ utils/ # Helpers (DB, auth, etc.) +โ”‚ โ”œโ”€โ”€ migrations/init.sql # Database schema +โ”‚ โ”œโ”€โ”€ env.example # โš™๏ธ Configuration template โ€” copy to .env +โ”‚ โ”œโ”€โ”€ Dockerfile # Backend container image +โ”‚ โ””โ”€โ”€ run.py # Entrypoint +โ”‚ +โ”œโ”€โ”€ frontend/ # ๐ŸŽจ Frontend (Pre-built) +โ”‚ โ”œโ”€โ”€ dist/ # Compiled static files (HTML/JS/CSS) +โ”‚ โ”œโ”€โ”€ Dockerfile # Nginx container image +โ”‚ โ”œโ”€โ”€ nginx.conf # Nginx config (SPA + API proxy) +โ”‚ โ””โ”€โ”€ VERSION # Frontend version tracker +โ”‚ +โ”œโ”€โ”€ docs/ # ๐Ÿ“š Documentation & Guides +โ”‚ โ”œโ”€โ”€ CHANGELOG.md # Version history +โ”‚ โ”œโ”€โ”€ screenshots/ # UI screenshots +โ”‚ โ””โ”€โ”€ *.md # Strategy, broker, notification guides +โ”‚ +โ”œโ”€โ”€ docker-compose.yml # ๐Ÿณ One-click deployment +โ”œโ”€โ”€ LICENSE # Apache License 2.0 +โ”œโ”€โ”€ TRADEMARKS.md # Trademark policy +โ”œโ”€โ”€ SECURITY.md # Security policy +โ”œโ”€โ”€ CONTRIBUTING.md # Contribution guide +โ””โ”€โ”€ CODE_OF_CONDUCT.md # Code of conduct ``` --- @@ -511,8 +604,8 @@ Use `backend_api_python/env.example` as a template. Key settings: | **OAuth** | `GOOGLE_CLIENT_ID`, `GITHUB_CLIENT_ID`, etc. | | **Security** | `TURNSTILE_SITE_KEY`, `ENABLE_REGISTRATION` | | **Order Execution** | `ORDER_MODE` (market/maker), `MAKER_WAIT_SEC` | -| **Membership** ๐Ÿ†• | `MEMBERSHIP_MONTHLY_PRICE_USD`, `MEMBERSHIP_MONTHLY_CREDITS`, `MEMBERSHIP_YEARLY_PRICE_USD`, etc. | -| **USDT Payment** ๐Ÿ†• | `USDT_PAY_ENABLED`, `USDT_TRC20_XPUB`, `TRONGRID_API_KEY`, `USDT_ORDER_EXPIRE_MINUTES` | +| **Membership** | `MEMBERSHIP_MONTHLY_PRICE_USD`, `MEMBERSHIP_MONTHLY_CREDITS`, `MEMBERSHIP_YEARLY_PRICE_USD`, etc. | +| **USDT Payment** | `USDT_PAY_ENABLED`, `USDT_TRC20_XPUB`, `TRONGRID_API_KEY`, `USDT_ORDER_EXPIRE_MINUTES` | | **Proxy** | `PROXY_PORT` or `PROXY_URL` | | **Workers** | `ENABLE_PENDING_ORDER_WORKER`, `ENABLE_PORTFOLIO_MONITOR` | @@ -524,7 +617,7 @@ The backend provides REST endpoints for login, market data, indicators, backtest - Health: `GET /api/health` - Auth: `POST /api/user/login`, `GET /api/user/info` -- Billing: `GET /api/billing/plans`, `POST /api/billing/usdt/create-order` ๐Ÿ†• +- Billing: `GET /api/billing/plans`, `POST /api/billing/usdt/create-order` For the full route list, see `backend_api_python/app/routes/`. @@ -534,6 +627,8 @@ For the full route list, see `backend_api_python/app/routes/`. Licensed under the **Apache License 2.0**. See `LICENSE`. +> **Note**: The frontend UI is provided as pre-built files. The backend source code is fully open under Apache 2.0. + --- ## ๐Ÿค Community & Support diff --git a/backend_api_python/app/__init__.py b/backend_api_python/app/__init__.py index 3ef6bc6..511220c 100644 --- a/backend_api_python/app/__init__.py +++ b/backend_api_python/app/__init__.py @@ -74,6 +74,31 @@ def start_pending_order_worker(): logger.error(f"Failed to start pending order worker: {e}") +def start_usdt_order_worker(): + """Start the USDT order background worker. + + Periodically scans pending/paid USDT orders and checks on-chain status. + Ensures orders are confirmed even if the user closes the browser after payment. + Only starts if USDT_PAY_ENABLED=true. + """ + import os + if str(os.getenv("USDT_PAY_ENABLED", "False")).lower() not in ("1", "true", "yes"): + logger.info("USDT order worker not started (USDT_PAY_ENABLED is not true).") + return + + # Avoid running twice with Flask reloader + debug = os.getenv("PYTHON_API_DEBUG", "false").lower() == "true" + if debug: + if os.environ.get("WERKZEUG_RUN_MAIN") != "true": + return + + try: + from app.services.usdt_payment_service import get_usdt_order_worker + get_usdt_order_worker().start() + except Exception as e: + logger.error(f"Failed to start USDT order worker: {e}") + + def restore_running_strategies(): """ Restore running strategies on startup. @@ -231,6 +256,7 @@ def create_app(config_name='default'): with app.app_context(): start_pending_order_worker() start_portfolio_monitor() + start_usdt_order_worker() restore_running_strategies() return app diff --git a/backend_api_python/app/routes/__init__.py b/backend_api_python/app/routes/__init__.py index c2bb55d..3ac20e4 100644 --- a/backend_api_python/app/routes/__init__.py +++ b/backend_api_python/app/routes/__init__.py @@ -25,6 +25,7 @@ def register_routes(app: Flask): from app.routes.community import community_bp from app.routes.fast_analysis import fast_analysis_bp from app.routes.billing import billing_bp + from app.routes.quick_trade import quick_trade_bp app.register_blueprint(health_bp) app.register_blueprint(auth_bp, url_prefix='/api/auth') # Auth routes @@ -44,4 +45,5 @@ def register_routes(app: Flask): app.register_blueprint(global_market_bp, url_prefix='/api/global-market') app.register_blueprint(community_bp, url_prefix='/api/community') app.register_blueprint(fast_analysis_bp, url_prefix='/api/fast-analysis') - app.register_blueprint(billing_bp, url_prefix='/api/billing') \ No newline at end of file + app.register_blueprint(billing_bp, url_prefix='/api/billing') + app.register_blueprint(quick_trade_bp, url_prefix='/api/quick-trade') \ No newline at end of file diff --git a/backend_api_python/app/routes/credentials.py b/backend_api_python/app/routes/credentials.py index 2e04ddb..20f2c9f 100644 --- a/backend_api_python/app/routes/credentials.py +++ b/backend_api_python/app/routes/credentials.py @@ -6,7 +6,6 @@ Local deployment notes: - Credentials are stored as plaintext JSON in DB (encrypted_config column kept for compatibility). """ -import time import traceback import json from flask import Blueprint, request, jsonify, g @@ -42,7 +41,7 @@ def list_credentials(): """ SELECT id, user_id, name, exchange_id, api_key_hint, created_at, updated_at FROM qd_exchange_credentials - WHERE user_id = ? + WHERE user_id = %s ORDER BY id DESC """, (user_id,) @@ -57,41 +56,84 @@ def list_credentials(): return jsonify({'code': 0, 'msg': str(e), 'data': {'items': []}}), 500 +CRYPTO_EXCHANGES = [ + 'binance', 'okx', 'bitget', 'bybit', 'coinbaseexchange', + 'kraken', 'kucoin', 'gate', 'bitfinex', 'deepcoin' +] + + @credentials_bp.route('/create', methods=['POST']) @login_required def create_credential(): - """Create a new credential for the current user.""" + """Create a new credential for the current user. + + Supports crypto exchanges, IBKR (US stocks) and MT5 (Forex). + """ try: user_id = g.user_id data = request.get_json() or {} name = (data.get('name') or '').strip() - exchange_id = (data.get('exchange_id') or '').strip() - api_key = (data.get('api_key') or '').strip() - secret_key = (data.get('secret_key') or '').strip() - passphrase = (data.get('passphrase') or '').strip() + exchange_id = (data.get('exchange_id') or '').strip().lower() if not exchange_id: return jsonify({'code': 0, 'msg': 'Missing exchange_id', 'data': None}), 400 - if not api_key or not secret_key: - return jsonify({'code': 0, 'msg': 'Missing api_key/secret_key', 'data': None}), 400 - plaintext_config = json.dumps({ - 'exchange_id': exchange_id, - 'api_key': api_key, - 'secret_key': secret_key, - 'passphrase': passphrase - }, ensure_ascii=False) + config = {'exchange_id': exchange_id} + hint = '' + + if exchange_id == 'ibkr': + # Interactive Brokers (US stocks) + config.update({ + 'ibkr_host': (data.get('ibkr_host') or '127.0.0.1').strip(), + 'ibkr_port': int(data.get('ibkr_port') or 7497), + 'ibkr_client_id': int(data.get('ibkr_client_id') or 1), + 'ibkr_account': (data.get('ibkr_account') or '').strip() + }) + hint = f"{config['ibkr_host']}:{config['ibkr_port']}" + elif exchange_id == 'mt5': + # MetaTrader 5 (Forex) + mt5_server = (data.get('mt5_server') or '').strip() + mt5_login = str(data.get('mt5_login') or '').strip() + mt5_password = (data.get('mt5_password') or '').strip() + if not mt5_server or not mt5_login or not mt5_password: + return jsonify({'code': 0, 'msg': 'Missing mt5_server/mt5_login/mt5_password', 'data': None}), 400 + config.update({ + 'mt5_server': mt5_server, + 'mt5_login': mt5_login, + 'mt5_password': mt5_password, + 'mt5_terminal_path': (data.get('mt5_terminal_path') or '').strip() + }) + hint = f"{mt5_server}/{mt5_login}" + elif exchange_id in CRYPTO_EXCHANGES: + # Crypto exchanges + api_key = (data.get('api_key') or '').strip() + secret_key = (data.get('secret_key') or '').strip() + if not api_key or not secret_key: + return jsonify({'code': 0, 'msg': 'Missing api_key/secret_key', 'data': None}), 400 + config.update({ + 'api_key': api_key, + 'secret_key': secret_key, + 'passphrase': (data.get('passphrase') or '').strip(), + 'enable_demo_trading': bool(data.get('enable_demo_trading', False)) + }) + hint = _api_key_hint(api_key) + else: + return jsonify({'code': 0, 'msg': f'Unsupported exchange: {exchange_id}', 'data': None}), 400 + + plaintext_config = json.dumps(config, ensure_ascii=False) with get_db_connection() as db: cur = db.cursor() cur.execute( """ INSERT INTO qd_exchange_credentials (user_id, name, exchange_id, api_key_hint, encrypted_config, created_at, updated_at) - VALUES (?, ?, ?, ?, ?, NOW(), NOW()) + VALUES (%s, %s, %s, %s, %s, NOW(), NOW()) + RETURNING id """, - (user_id, name, exchange_id, _api_key_hint(api_key), plaintext_config) + (user_id, name, exchange_id, hint, plaintext_config) ) - new_id = cur.lastrowid + row = cur.fetchone() + new_id = (row or {}).get('id') db.commit() cur.close() @@ -115,7 +157,7 @@ def delete_credential(): with get_db_connection() as db: cur = db.cursor() cur.execute( - "DELETE FROM qd_exchange_credentials WHERE id = ? AND user_id = ?", + "DELETE FROM qd_exchange_credentials WHERE id = %s AND user_id = %s", (cred_id, user_id) ) db.commit() @@ -146,7 +188,7 @@ def get_credential(): """ SELECT id, user_id, name, exchange_id, encrypted_config, api_key_hint, created_at, updated_at FROM qd_exchange_credentials - WHERE id = ? AND user_id = ? + WHERE id = %s AND user_id = %s """, (cred_id, user_id) ) diff --git a/backend_api_python/app/routes/quick_trade.py b/backend_api_python/app/routes/quick_trade.py new file mode 100644 index 0000000..cc26a89 --- /dev/null +++ b/backend_api_python/app/routes/quick_trade.py @@ -0,0 +1,555 @@ +""" +Quick Trade API โ€” manual / discretionary order placement. + +Allows users to place market or limit orders directly from AI analysis +or indicator analysis pages, without creating a strategy first. + +Endpoints: + POST /api/quick-trade/place-order โ€” Place a quick order + GET /api/quick-trade/balance โ€” Get available balance + GET /api/quick-trade/position โ€” Get current position for symbol + GET /api/quick-trade/history โ€” Get quick trade history +""" + +from __future__ import annotations + +import json +import time +import traceback +import uuid +from typing import Any, Dict + +from flask import Blueprint, g, jsonify, request + +from app.utils.db import get_db_connection +from app.utils.logger import get_logger +from app.utils.auth import login_required + +logger = get_logger(__name__) + +quick_trade_bp = Blueprint('quick_trade', __name__) + + +# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +def _safe_json(v, default=None): + if v is None: + return default + if isinstance(v, (dict, list)): + return v + try: + return json.loads(v) if isinstance(v, str) else default + except Exception: + return default + + +def _load_credential(credential_id: int, user_id: int) -> Dict[str, Any]: + """Load exchange credential JSON for the given user.""" + with get_db_connection() as db: + cur = db.cursor() + cur.execute( + "SELECT encrypted_config FROM qd_exchange_credentials WHERE id = %s AND user_id = %s", + (int(credential_id), int(user_id)), + ) + row = cur.fetchone() or {} + cur.close() + return _safe_json(row.get("encrypted_config"), {}) + + +def _build_exchange_config(credential_id: int, user_id: int, overrides: Dict[str, Any] = None) -> Dict[str, Any]: + """Build exchange config from saved credential + overrides.""" + base = _load_credential(credential_id, user_id) + if not base: + raise ValueError("Credential not found or access denied") + if overrides: + for k, v in overrides.items(): + if v is not None and (not isinstance(v, str) or v.strip()): + base[k] = v + return base + + +def _create_client(exchange_config: Dict[str, Any], market_type: str = "swap"): + """Create exchange client from config.""" + from app.services.live_trading.factory import create_client + return create_client(exchange_config, market_type=market_type) + + +def _record_quick_trade( + user_id: int, + credential_id: int, + exchange_id: str, + symbol: str, + side: str, + order_type: str, + amount: float, + price: float, + leverage: int, + market_type: str, + tp_price: float, + sl_price: float, + status: str, + exchange_order_id: str, + filled: float, + avg_price: float, + error_msg: str, + source: str, + raw_result: Dict[str, Any], +): + """Insert a quick trade record into the database.""" + try: + with get_db_connection() as db: + cur = db.cursor() + cur.execute( + """ + INSERT INTO qd_quick_trades + (user_id, credential_id, exchange_id, symbol, side, order_type, + amount, price, leverage, market_type, tp_price, sl_price, + status, exchange_order_id, filled_amount, avg_fill_price, + error_msg, source, raw_result, created_at) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW()) + RETURNING id + """, + ( + user_id, credential_id, exchange_id, symbol, side, order_type, + amount, price, leverage, market_type, tp_price, sl_price, + status, exchange_order_id, filled, avg_price, + error_msg, source, json.dumps(raw_result or {}), + ), + ) + row = cur.fetchone() + db.commit() + cur.close() + return (row or {}).get("id") + except Exception as e: + logger.error(f"Failed to record quick trade: {e}") + return None + + +# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ endpoints โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + +@quick_trade_bp.route('/place-order', methods=['POST']) +@login_required +def place_order(): + """ + Place a quick market or limit order. + + Body JSON: + credential_id (int) โ€” saved exchange credential ID + symbol (str) โ€” e.g. "BTC/USDT" + side (str) โ€” "buy" or "sell" + order_type (str) โ€” "market" or "limit" (default: market) + amount (float) โ€” order size (USDT quote amount for market buy, or base qty) + price (float) โ€” limit price (required for limit orders) + leverage (int) โ€” leverage multiplier (default: 1) + market_type (str) โ€” "swap" / "spot" (default: swap) + tp_price (float) โ€” take-profit price (optional, for record only) + sl_price (float) โ€” stop-loss price (optional, for record only) + source (str) โ€” "ai_radar" / "ai_analysis" / "indicator" / "manual" + """ + try: + user_id = g.user_id + body = request.get_json(force=True, silent=True) or {} + + credential_id = int(body.get("credential_id") or 0) + symbol = str(body.get("symbol") or "").strip() + side = str(body.get("side") or "").strip().lower() + order_type = str(body.get("order_type") or "market").strip().lower() + amount = float(body.get("amount") or 0) + price = float(body.get("price") or 0) + leverage = int(body.get("leverage") or 1) + market_type = str(body.get("market_type") or "swap").strip().lower() + tp_price = float(body.get("tp_price") or 0) + sl_price = float(body.get("sl_price") or 0) + source = str(body.get("source") or "manual").strip() + + # ---- validation ---- + if not credential_id: + return jsonify({"code": 0, "msg": "Missing credential_id"}), 400 + if not symbol: + return jsonify({"code": 0, "msg": "Missing symbol"}), 400 + if side not in ("buy", "sell"): + return jsonify({"code": 0, "msg": "side must be 'buy' or 'sell'"}), 400 + if amount <= 0: + return jsonify({"code": 0, "msg": "amount must be > 0"}), 400 + if order_type == "limit" and price <= 0: + return jsonify({"code": 0, "msg": "price required for limit orders"}), 400 + + if market_type in ("futures", "future", "perp", "perpetual"): + market_type = "swap" + + # ---- build exchange client ---- + exchange_config = _build_exchange_config(credential_id, user_id, { + "market_type": market_type, + }) + exchange_id = (exchange_config.get("exchange_id") or "").strip().lower() + if not exchange_id: + return jsonify({"code": 0, "msg": "Invalid credential: missing exchange_id"}), 400 + + client = _create_client(exchange_config, market_type=market_type) + + # ---- set leverage (futures only) ---- + if market_type != "spot" and leverage > 1: + try: + if hasattr(client, "set_leverage"): + client.set_leverage(symbol=symbol, leverage=leverage) + elif hasattr(client, "set_leverage") and callable(getattr(client, "set_leverage", None)): + client.set_leverage(symbol=symbol, lever=leverage) + except Exception as le: + logger.warning(f"set_leverage failed (non-fatal): {le}") + + # ---- place order ---- + client_order_id = f"qt_{int(time.time())}_{uuid.uuid4().hex[:8]}" + + result = None + if order_type == "market": + result = client.place_market_order( + symbol=symbol, + side=side.upper() if "binance" in exchange_id else side, + **_market_order_kwargs(client, symbol, amount, side, market_type, client_order_id), + ) + else: + result = client.place_limit_order( + symbol=symbol, + side=side.upper() if "binance" in exchange_id else side, + **_limit_order_kwargs(client, symbol, amount, price, side, market_type, client_order_id), + ) + + # ---- extract result ---- + exchange_order_id = str(getattr(result, "exchange_order_id", "") or "") + filled = float(getattr(result, "filled", 0) or 0) + avg_fill = float(getattr(result, "avg_price", 0) or 0) + raw = getattr(result, "raw", {}) or {} + + # ---- record trade ---- + trade_id = _record_quick_trade( + user_id=user_id, + credential_id=credential_id, + exchange_id=exchange_id, + symbol=symbol, + side=side, + order_type=order_type, + amount=amount, + price=price if order_type == "limit" else avg_fill, + leverage=leverage, + market_type=market_type, + tp_price=tp_price, + sl_price=sl_price, + status="filled" if filled > 0 else "submitted", + exchange_order_id=exchange_order_id, + filled=filled, + avg_price=avg_fill, + error_msg="", + source=source, + raw_result=raw, + ) + + return jsonify({ + "code": 1, + "msg": "Order placed successfully", + "data": { + "trade_id": trade_id, + "exchange_order_id": exchange_order_id, + "filled": filled, + "avg_price": avg_fill, + "status": "filled" if filled > 0 else "submitted", + }, + }) + + except Exception as e: + logger.error(f"quick trade failed: {e}") + logger.error(traceback.format_exc()) + + # Try to record the failure + try: + _record_quick_trade( + user_id=g.user_id, + credential_id=int(body.get("credential_id") or 0), + exchange_id="", + symbol=str(body.get("symbol") or ""), + side=str(body.get("side") or ""), + order_type=str(body.get("order_type") or "market"), + amount=float(body.get("amount") or 0), + price=0, + leverage=int(body.get("leverage") or 1), + market_type=str(body.get("market_type") or "swap"), + tp_price=0, + sl_price=0, + status="failed", + exchange_order_id="", + filled=0, + avg_price=0, + error_msg=str(e)[:500], + source=str(body.get("source") or "manual"), + raw_result={}, + ) + except Exception: + pass + + return jsonify({"code": 0, "msg": str(e)}), 500 + + +def _market_order_kwargs(client, symbol, amount, side, market_type, client_order_id): + """Build kwargs compatible with any exchange client's place_market_order.""" + from app.services.live_trading.binance import BinanceFuturesClient + from app.services.live_trading.binance_spot import BinanceSpotClient + from app.services.live_trading.okx import OkxClient + from app.services.live_trading.bitget import BitgetMixClient + from app.services.live_trading.bybit import BybitClient + + if isinstance(client, (BinanceFuturesClient, BinanceSpotClient)): + return {"quantity": amount, "client_order_id": client_order_id} + if isinstance(client, OkxClient): + return {"size": amount, "client_order_id": client_order_id} + if isinstance(client, BitgetMixClient): + return {"size": amount, "client_order_id": client_order_id} + if isinstance(client, BybitClient): + return {"qty": amount, "client_order_id": client_order_id} + # Generic fallback + return {"size": amount, "client_order_id": client_order_id} + + +def _limit_order_kwargs(client, symbol, amount, price, side, market_type, client_order_id): + """Build kwargs compatible with any exchange client's place_limit_order.""" + from app.services.live_trading.binance import BinanceFuturesClient + from app.services.live_trading.binance_spot import BinanceSpotClient + + if isinstance(client, (BinanceFuturesClient, BinanceSpotClient)): + return {"quantity": amount, "price": price, "client_order_id": client_order_id} + # Generic fallback + return {"size": amount, "price": price, "client_order_id": client_order_id} + + +@quick_trade_bp.route('/balance', methods=['GET']) +@login_required +def get_balance(): + """ + Get available balance from exchange. + + Query: credential_id (int), market_type (str, default "swap") + """ + try: + user_id = g.user_id + credential_id = request.args.get("credential_id", type=int) + market_type = request.args.get("market_type", "swap").strip().lower() + + if not credential_id: + return jsonify({"code": 0, "msg": "Missing credential_id"}), 400 + + exchange_config = _build_exchange_config(credential_id, user_id, {"market_type": market_type}) + exchange_id = (exchange_config.get("exchange_id") or "").strip().lower() + client = _create_client(exchange_config, market_type=market_type) + + balance_data = {"available": 0, "total": 0, "currency": "USDT"} + + try: + if hasattr(client, "get_balance"): + raw = client.get_balance() + balance_data = _parse_balance(raw, exchange_id, market_type) + elif hasattr(client, "get_account"): + raw = client.get_account() + balance_data = _parse_balance(raw, exchange_id, market_type) + elif hasattr(client, "get_accounts"): + raw = client.get_accounts() + balance_data = _parse_balance(raw, exchange_id, market_type) + except Exception as be: + logger.warning(f"Balance fetch failed: {be}") + balance_data["error"] = str(be) + + return jsonify({"code": 1, "msg": "success", "data": balance_data}) + except Exception as e: + logger.error(f"get_balance failed: {e}") + return jsonify({"code": 0, "msg": str(e)}), 500 + + +def _parse_balance(raw: Any, exchange_id: str, market_type: str) -> Dict[str, Any]: + """Best-effort parse balance from various exchange responses.""" + result = {"available": 0, "total": 0, "currency": "USDT"} + if not raw: + return result + try: + if isinstance(raw, dict): + # Binance futures + if "availableBalance" in raw: + result["available"] = float(raw.get("availableBalance") or 0) + result["total"] = float(raw.get("totalWalletBalance") or raw.get("totalMarginBalance") or 0) + return result + # Binance spot + if "balances" in raw: + for b in raw.get("balances", []): + if str(b.get("asset") or "").upper() == "USDT": + result["available"] = float(b.get("free") or 0) + result["total"] = float(b.get("free") or 0) + float(b.get("locked") or 0) + return result + return result + # OKX + data = raw.get("data") + if isinstance(data, list) and data: + first = data[0] if isinstance(data[0], dict) else {} + # Account balance + details = first.get("details", []) + if isinstance(details, list): + for d in details: + if str(d.get("ccy") or "").upper() == "USDT": + result["available"] = float(d.get("availBal") or d.get("availEq") or 0) + result["total"] = float(d.get("eq") or d.get("cashBal") or 0) + return result + # Fallback + result["available"] = float(first.get("availBal") or first.get("totalEq") or 0) + result["total"] = float(first.get("totalEq") or 0) + return result + # Bybit + if "result" in raw: + res = raw["result"] + if isinstance(res, dict): + coin_list = res.get("list", []) + if isinstance(coin_list, list): + for acc in coin_list: + coins = acc.get("coin", []) if isinstance(acc, dict) else [] + for c in coins: + if str(c.get("coin") or "").upper() == "USDT": + result["available"] = float(c.get("availableToWithdraw") or c.get("walletBalance") or 0) + result["total"] = float(c.get("walletBalance") or 0) + return result + # Fallback: try to find any USDT-like values + if isinstance(raw, dict): + for k, v in raw.items(): + if "avail" in str(k).lower() and isinstance(v, (int, float)): + result["available"] = float(v) + if "total" in str(k).lower() and isinstance(v, (int, float)): + result["total"] = float(v) + except Exception as e: + logger.warning(f"_parse_balance error: {e}") + return result + + +@quick_trade_bp.route('/position', methods=['GET']) +@login_required +def get_position(): + """ + Get current position for a symbol from exchange. + + Query: credential_id (int), symbol (str), market_type (str) + """ + try: + user_id = g.user_id + credential_id = request.args.get("credential_id", type=int) + symbol = request.args.get("symbol", "").strip() + market_type = request.args.get("market_type", "swap").strip().lower() + + if not credential_id or not symbol: + return jsonify({"code": 0, "msg": "Missing credential_id or symbol"}), 400 + + exchange_config = _build_exchange_config(credential_id, user_id, {"market_type": market_type}) + client = _create_client(exchange_config, market_type=market_type) + + positions = [] + try: + if hasattr(client, "get_positions"): + raw = client.get_positions(symbol=symbol) + positions = _parse_positions(raw) + elif hasattr(client, "get_position"): + raw = client.get_position(symbol=symbol) + positions = _parse_positions(raw) + except Exception as pe: + logger.warning(f"Position fetch failed: {pe}") + + return jsonify({"code": 1, "msg": "success", "data": {"positions": positions}}) + except Exception as e: + logger.error(f"get_position failed: {e}") + return jsonify({"code": 0, "msg": str(e)}), 500 + + +def _parse_positions(raw: Any) -> list: + """Best-effort parse positions from exchange response.""" + result = [] + if not raw: + return result + try: + items = [] + if isinstance(raw, list): + items = raw + elif isinstance(raw, dict): + data = raw.get("data") or raw.get("result") or raw.get("positions") or [] + if isinstance(data, list): + items = data + elif isinstance(data, dict): + items = data.get("list", []) if "list" in data else [data] + + for item in items: + if not isinstance(item, dict): + continue + size = float(item.get("posAmt") or item.get("pos") or item.get("size") or item.get("contracts") or 0) + if abs(size) < 1e-10: + continue + result.append({ + "symbol": item.get("symbol") or item.get("instId") or "", + "side": "long" if size > 0 else "short", + "size": abs(size), + "entry_price": float(item.get("entryPrice") or item.get("avgCost") or item.get("avgPx") or 0), + "unrealized_pnl": float(item.get("unRealizedProfit") or item.get("upl") or item.get("unrealisedPnl") or 0), + "leverage": float(item.get("leverage") or 1), + "mark_price": float(item.get("markPrice") or item.get("markPx") or 0), + }) + except Exception as e: + logger.warning(f"_parse_positions error: {e}") + return result + + +@quick_trade_bp.route('/history', methods=['GET']) +@login_required +def get_history(): + """ + Get quick trade history for the current user. + + Query: limit (int, default 50), offset (int, default 0) + """ + try: + user_id = g.user_id + limit = min(int(request.args.get("limit") or 50), 200) + offset = int(request.args.get("offset") or 0) + + with get_db_connection() as db: + cur = db.cursor() + cur.execute( + """ + SELECT id, exchange_id, symbol, side, order_type, amount, price, + leverage, market_type, tp_price, sl_price, status, + exchange_order_id, filled_amount, avg_fill_price, + error_msg, source, created_at + FROM qd_quick_trades + WHERE user_id = %s + ORDER BY created_at DESC + LIMIT %s OFFSET %s + """, + (user_id, limit, offset), + ) + rows = cur.fetchall() or [] + cur.close() + + trades = [] + for r in rows: + trades.append({ + "id": r.get("id"), + "exchange_id": r.get("exchange_id") or "", + "symbol": r.get("symbol") or "", + "side": r.get("side") or "", + "order_type": r.get("order_type") or "market", + "amount": float(r.get("amount") or 0), + "price": float(r.get("price") or 0), + "leverage": int(r.get("leverage") or 1), + "market_type": r.get("market_type") or "swap", + "tp_price": float(r.get("tp_price") or 0), + "sl_price": float(r.get("sl_price") or 0), + "status": r.get("status") or "", + "exchange_order_id": r.get("exchange_order_id") or "", + "filled_amount": float(r.get("filled_amount") or 0), + "avg_fill_price": float(r.get("avg_fill_price") or 0), + "error_msg": r.get("error_msg") or "", + "source": r.get("source") or "", + "created_at": str(r.get("created_at") or ""), + }) + + return jsonify({"code": 1, "msg": "success", "data": {"trades": trades}}) + except Exception as e: + logger.error(f"get_history failed: {e}") + return jsonify({"code": 0, "msg": str(e)}), 500 diff --git a/backend_api_python/app/routes/strategy.py b/backend_api_python/app/routes/strategy.py index f1ae410..0150559 100644 --- a/backend_api_python/app/routes/strategy.py +++ b/backend_api_python/app/routes/strategy.py @@ -640,7 +640,7 @@ def test_connection(): Test exchange connection. Request body: - exchange_config: Exchange configuration + exchange_config: Exchange configuration (may contain credential_id or inline keys) """ try: data = request.get_json() or {} @@ -664,29 +664,38 @@ def test_connection(): logger.error(f"Invalid exchange_config type: {type(exchange_config)}, data: {str(exchange_config)[:200]}") # Frontend expects HTTP 200 with {code:0} for business failures. return jsonify({'code': 0, 'msg': 'Invalid exchange config format; please check your payload', 'data': None}) - - # ้ชŒ่ฏๅฟ…่ฆๅญ—ๆฎต - if not exchange_config.get('exchange_id'): + + # Resolve credential_id โ†’ full config (merges credential keys with any overrides). + # This allows the frontend to send just {credential_id: 5} without raw api_key/secret_key. + from app.services.exchange_execution import resolve_exchange_config + user_id = g.user_id if hasattr(g, 'user_id') else 1 + resolved = resolve_exchange_config(exchange_config, user_id=user_id) + + # ้ชŒ่ฏๅฟ…่ฆๅญ—ๆฎต (check resolved config after credential merge) + if not resolved.get('exchange_id'): return jsonify({'code': 0, 'msg': 'Please select an exchange', 'data': None}) - api_key = exchange_config.get('api_key', '') - secret_key = exchange_config.get('secret_key', '') + api_key = resolved.get('api_key', '') + secret_key = resolved.get('secret_key', '') # ่ฏฆ็ป†ๆ—ฅๅฟ—ๆŽ’ๆŸฅ - logger.info(f"Testing connection: exchange_id={exchange_config.get('exchange_id')}") - logger.info(f"API Key: {api_key[:5]}... (len={len(api_key)})") - logger.info(f"Secret Key: {secret_key[:5]}... (len={len(secret_key)})") + logger.info(f"Testing connection: exchange_id={resolved.get('exchange_id')}") + if api_key: + logger.info(f"API Key: {api_key[:5]}... (len={len(api_key)})") + if secret_key: + logger.info(f"Secret Key: {secret_key[:5]}... (len={len(secret_key)})") # ๆฃ€ๆŸฅๆ˜ฏๅฆๆœ‰็‰นๆฎŠๅญ—็ฌฆ - if api_key.strip() != api_key: + if api_key and api_key.strip() != api_key: logger.warning("API key contains leading/trailing whitespace") - if secret_key.strip() != secret_key: + if secret_key and secret_key.strip() != secret_key: logger.warning("Secret key contains leading/trailing whitespace") if not api_key or not secret_key: return jsonify({'code': 0, 'msg': 'Please provide API key and secret key', 'data': None}) - result = get_strategy_service().test_exchange_connection(exchange_config) + # Pass the resolved config (with actual keys) to the service + result = get_strategy_service().test_exchange_connection(resolved) if result['success']: return jsonify({'code': 1, 'msg': result.get('message') or 'Connection successful', 'data': result.get('data')}) diff --git a/backend_api_python/app/routes/user.py b/backend_api_python/app/routes/user.py index 2b3e322..4825638 100644 --- a/backend_api_python/app/routes/user.py +++ b/backend_api_python/app/routes/user.py @@ -1071,3 +1071,450 @@ def get_system_strategies(): import traceback logger.error(traceback.format_exc()) return jsonify({'code': 0, 'msg': str(e), 'data': None}), 500 + + +# ==================== Admin Orders ==================== + +@user_bp.route('/admin-orders', methods=['GET']) +@login_required +@admin_required +def get_admin_orders(): + """ + Get all orders across the system (admin only). + Merges qd_membership_orders and qd_usdt_orders into a unified list. + + Query params: + page: int (default 1) + page_size: int (default 20, max 100) + status: str (optional, filter by status: paid/pending/confirmed/expired/all) + search: str (optional, search by username/email) + """ + try: + page = request.args.get('page', 1, type=int) + page_size = request.args.get('page_size', 20, type=int) + status_filter = request.args.get('status', '', type=str).strip().lower() + search = request.args.get('search', '', type=str).strip() + page_size = min(100, max(1, page_size)) + offset = (page - 1) * page_size + + with get_db_connection() as db: + cur = db.cursor() + + # --- USDT Orders (primary) --- + usdt_conditions = [] + usdt_params = [] + + if status_filter and status_filter != 'all': + usdt_conditions.append("o.status = ?") + usdt_params.append(status_filter) + + if search: + usdt_conditions.append("(u.username ILIKE ? OR u.email ILIKE ? OR u.nickname ILIKE ?)") + like_val = f"%{search}%" + usdt_params.extend([like_val, like_val, like_val]) + + usdt_where = "" + if usdt_conditions: + usdt_where = "WHERE " + " AND ".join(usdt_conditions) + + # Count + cur.execute( + f"SELECT COUNT(*) as cnt FROM qd_usdt_orders o LEFT JOIN qd_users u ON u.id = o.user_id {usdt_where}", + tuple(usdt_params) + ) + usdt_total = cur.fetchone()['cnt'] + + # --- Membership Orders (mock) --- + mock_conditions = [] + mock_params = [] + + if status_filter and status_filter != 'all': + mock_conditions.append("m.status = ?") + mock_params.append(status_filter) + + if search: + mock_conditions.append("(u.username ILIKE ? OR u.email ILIKE ? OR u.nickname ILIKE ?)") + like_val = f"%{search}%" + mock_params.extend([like_val, like_val, like_val]) + + mock_where = "" + if mock_conditions: + mock_where = "WHERE " + " AND ".join(mock_conditions) + + cur.execute( + f"SELECT COUNT(*) as cnt FROM qd_membership_orders m LEFT JOIN qd_users u ON u.id = m.user_id {mock_where}", + tuple(mock_params) + ) + mock_total = cur.fetchone()['cnt'] + + total = usdt_total + mock_total + + # Use UNION ALL to merge both tables into one sorted list + # We select a unified schema + union_sql = f""" + SELECT * FROM ( + SELECT + o.id, + 'usdt' AS order_type, + o.user_id, + u.username, + u.nickname, + u.email AS user_email, + o.plan, + o.amount_usdt AS amount, + 'USDT' AS currency, + o.chain, + o.address, + o.tx_hash, + o.status, + o.created_at, + o.paid_at, + o.confirmed_at, + o.expires_at + FROM qd_usdt_orders o + LEFT JOIN qd_users u ON u.id = o.user_id + {usdt_where} + + UNION ALL + + SELECT + m.id, + 'mock' AS order_type, + m.user_id, + u.username, + u.nickname, + u.email AS user_email, + m.plan, + m.price_usd AS amount, + 'USD' AS currency, + '' AS chain, + '' AS address, + '' AS tx_hash, + m.status, + m.created_at, + m.paid_at, + NULL AS confirmed_at, + NULL AS expires_at + FROM qd_membership_orders m + LEFT JOIN qd_users u ON u.id = m.user_id + {mock_where} + ) AS combined + ORDER BY combined.created_at DESC + LIMIT ? OFFSET ? + """ + all_params = list(usdt_params) + list(mock_params) + [page_size, offset] + cur.execute(union_sql, tuple(all_params)) + rows = cur.fetchall() or [] + + # Summary stats + cur.execute( + f"""SELECT + COUNT(*) AS total_orders, + COALESCE(SUM(CASE WHEN status IN ('paid','confirmed') THEN 1 ELSE 0 END), 0) AS paid_orders, + COALESCE(SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END), 0) AS pending_orders, + COALESCE(SUM(CASE WHEN status IN ('expired','cancelled','failed') THEN 1 ELSE 0 END), 0) AS failed_orders, + COALESCE(SUM(CASE WHEN status IN ('paid','confirmed') THEN amount_usdt ELSE 0 END), 0) AS total_revenue + FROM qd_usdt_orders""" + ) + summary_row = cur.fetchone() or {} + + cur.close() + + items = [] + for row in rows: + created_at = row.get('created_at') + paid_at = row.get('paid_at') + confirmed_at = row.get('confirmed_at') + expires_at = row.get('expires_at') + if hasattr(created_at, 'isoformat'): + created_at = created_at.isoformat() + if hasattr(paid_at, 'isoformat'): + paid_at = paid_at.isoformat() + if hasattr(confirmed_at, 'isoformat'): + confirmed_at = confirmed_at.isoformat() + if hasattr(expires_at, 'isoformat'): + expires_at = expires_at.isoformat() + + items.append({ + 'id': row['id'], + 'order_type': row.get('order_type') or '', + 'user_id': row.get('user_id'), + 'username': row.get('username') or '', + 'nickname': row.get('nickname') or '', + 'user_email': row.get('user_email') or '', + 'plan': row.get('plan') or '', + 'amount': float(row.get('amount') or 0), + 'currency': row.get('currency') or '', + 'chain': row.get('chain') or '', + 'address': row.get('address') or '', + 'tx_hash': row.get('tx_hash') or '', + 'status': row.get('status') or '', + 'created_at': created_at, + 'paid_at': paid_at, + 'confirmed_at': confirmed_at, + 'expires_at': expires_at + }) + + return jsonify({ + 'code': 1, + 'msg': 'success', + 'data': { + 'items': items, + 'total': total, + 'page': page, + 'page_size': page_size, + 'summary': { + 'total_orders': int(summary_row.get('total_orders') or 0), + 'paid_orders': int(summary_row.get('paid_orders') or 0), + 'pending_orders': int(summary_row.get('pending_orders') or 0), + 'failed_orders': int(summary_row.get('failed_orders') or 0), + 'total_revenue': round(float(summary_row.get('total_revenue') or 0), 2) + } + } + }) + except Exception as e: + logger.error(f"get_admin_orders failed: {e}") + import traceback + logger.error(traceback.format_exc()) + return jsonify({'code': 0, 'msg': str(e), 'data': None}), 500 + + +# ==================== Admin AI Analysis Stats ==================== + +@user_bp.route('/admin-ai-stats', methods=['GET']) +@login_required +@admin_required +def get_admin_ai_stats(): + """ + Get AI analysis usage statistics across the system (admin only). + Does NOT expose analysis results, only aggregated counts/stats. + + Query params: + page: int (default 1) + page_size: int (default 20, max 100) + search: str (optional, search by username) + """ + try: + page = request.args.get('page', 1, type=int) + page_size = request.args.get('page_size', 20, type=int) + search = request.args.get('search', '', type=str).strip() + page_size = min(100, max(1, page_size)) + offset = (page - 1) * page_size + + with get_db_connection() as db: + cur = db.cursor() + + # --- Overall summary (from qd_analysis_tasks + qd_analysis_memory) --- + cur.execute(""" + SELECT + COUNT(*) AS total_tasks, + COUNT(DISTINCT user_id) AS unique_users, + COUNT(DISTINCT symbol) AS unique_symbols, + COUNT(DISTINCT market) AS unique_markets + FROM qd_analysis_tasks + """) + task_summary = cur.fetchone() or {} + + memory_summary = {} + try: + cur.execute(""" + SELECT + COUNT(*) AS total_memory, + COALESCE(SUM(CASE WHEN was_correct = true THEN 1 ELSE 0 END), 0) AS correct_count, + COALESCE(SUM(CASE WHEN was_correct = false THEN 1 ELSE 0 END), 0) AS incorrect_count, + COALESCE(SUM(CASE WHEN user_feedback = 'helpful' THEN 1 ELSE 0 END), 0) AS helpful_count, + COALESCE(SUM(CASE WHEN user_feedback = 'not_helpful' THEN 1 ELSE 0 END), 0) AS not_helpful_count + FROM qd_analysis_memory + """) + memory_summary = cur.fetchone() or {} + except Exception as mem_err: + logger.warning(f"qd_analysis_memory query failed (table/column may not exist): {mem_err}") + db.rollback() + cur = db.cursor() # re-create cursor after rollback + memory_summary = {} + + # --- Per-user stats --- + user_conditions = [] + user_params = [] + if search: + user_conditions.append("(u.username ILIKE ? OR u.nickname ILIKE ? OR u.email ILIKE ?)") + like_val = f"%{search}%" + user_params.extend([like_val, like_val, like_val]) + + user_where = "" + if user_conditions: + user_where = "WHERE " + " AND ".join(user_conditions) + + # Count distinct users who have analysis records + cur.execute( + f""" + SELECT COUNT(DISTINCT t.user_id) AS cnt + FROM qd_analysis_tasks t + LEFT JOIN qd_users u ON u.id = t.user_id + {user_where} + """, + tuple(user_params) + ) + user_total = cur.fetchone()['cnt'] + + # Get per-user aggregated stats + cur.execute( + f""" + SELECT + t.user_id, + u.username, + u.nickname, + u.email, + COUNT(*) AS analysis_count, + COUNT(DISTINCT t.symbol) AS symbol_count, + COUNT(DISTINCT t.market) AS market_count, + MAX(t.created_at) AS last_analysis_at, + MIN(t.created_at) AS first_analysis_at + FROM qd_analysis_tasks t + LEFT JOIN qd_users u ON u.id = t.user_id + {user_where} + GROUP BY t.user_id, u.username, u.nickname, u.email + ORDER BY analysis_count DESC + LIMIT ? OFFSET ? + """, + tuple(user_params) + (page_size, offset) + ) + user_rows = cur.fetchall() or [] + + # Get per-user analysis_memory stats (correct/helpful counts) + user_ids = [r['user_id'] for r in user_rows if r.get('user_id')] + memory_stats_map = {} + if user_ids: + try: + placeholders = ','.join(['?'] * len(user_ids)) + cur.execute( + f""" + SELECT + user_id, + COUNT(*) AS memory_count, + COALESCE(SUM(CASE WHEN was_correct = true THEN 1 ELSE 0 END), 0) AS correct, + COALESCE(SUM(CASE WHEN was_correct = false THEN 1 ELSE 0 END), 0) AS incorrect, + COALESCE(SUM(CASE WHEN user_feedback = 'helpful' THEN 1 ELSE 0 END), 0) AS helpful, + COALESCE(SUM(CASE WHEN user_feedback = 'not_helpful' THEN 1 ELSE 0 END), 0) AS not_helpful + FROM qd_analysis_memory + WHERE user_id IN ({placeholders}) + GROUP BY user_id + """, + tuple(user_ids) + ) + for row in (cur.fetchall() or []): + memory_stats_map[row['user_id']] = { + 'memory_count': row['memory_count'], + 'correct': row['correct'], + 'incorrect': row['incorrect'], + 'helpful': row['helpful'], + 'not_helpful': row['not_helpful'] + } + except Exception as mem_err: + logger.warning(f"qd_analysis_memory per-user query failed: {mem_err}") + db.rollback() + cur = db.cursor() # re-create cursor after rollback + memory_stats_map = {} + + # Get recent analysis records (last 50) + cur.execute( + """ + SELECT + t.id, + t.user_id, + u.username, + u.nickname, + t.market, + t.symbol, + t.model, + t.status, + t.created_at, + t.completed_at + FROM qd_analysis_tasks t + LEFT JOIN qd_users u ON u.id = t.user_id + ORDER BY t.created_at DESC + LIMIT 50 + """ + ) + recent_rows = cur.fetchall() or [] + + cur.close() + + # Build per-user items + user_items = [] + for row in user_rows: + uid = row.get('user_id') + ms = memory_stats_map.get(uid, {}) + last_at = row.get('last_analysis_at') + first_at = row.get('first_analysis_at') + if hasattr(last_at, 'isoformat'): + last_at = last_at.isoformat() + if hasattr(first_at, 'isoformat'): + first_at = first_at.isoformat() + + user_items.append({ + 'user_id': uid, + 'username': row.get('username') or '', + 'nickname': row.get('nickname') or '', + 'email': row.get('email') or '', + 'analysis_count': row.get('analysis_count') or 0, + 'symbol_count': row.get('symbol_count') or 0, + 'market_count': row.get('market_count') or 0, + 'correct': ms.get('correct', 0), + 'incorrect': ms.get('incorrect', 0), + 'helpful': ms.get('helpful', 0), + 'not_helpful': ms.get('not_helpful', 0), + 'last_analysis_at': last_at, + 'first_analysis_at': first_at + }) + + # Build recent records + recent_items = [] + for row in recent_rows: + created_at = row.get('created_at') + completed_at = row.get('completed_at') + if hasattr(created_at, 'isoformat'): + created_at = created_at.isoformat() + if hasattr(completed_at, 'isoformat'): + completed_at = completed_at.isoformat() + + recent_items.append({ + 'id': row['id'], + 'user_id': row.get('user_id'), + 'username': row.get('username') or '', + 'nickname': row.get('nickname') or '', + 'market': row.get('market') or '', + 'symbol': row.get('symbol') or '', + 'model': row.get('model') or '', + 'status': row.get('status') or '', + 'created_at': created_at, + 'completed_at': completed_at + }) + + return jsonify({ + 'code': 1, + 'msg': 'success', + 'data': { + 'user_stats': user_items, + 'user_total': user_total, + 'page': page, + 'page_size': page_size, + 'recent': recent_items, + 'summary': { + 'total_analyses': int(task_summary.get('total_tasks') or 0), + 'unique_users': int(task_summary.get('unique_users') or 0), + 'unique_symbols': int(task_summary.get('unique_symbols') or 0), + 'unique_markets': int(task_summary.get('unique_markets') or 0), + 'total_memory': int(memory_summary.get('total_memory') or 0), + 'correct_count': int(memory_summary.get('correct_count') or 0), + 'incorrect_count': int(memory_summary.get('incorrect_count') or 0), + 'helpful_count': int(memory_summary.get('helpful_count') or 0), + 'not_helpful_count': int(memory_summary.get('not_helpful_count') or 0) + } + } + }) + except Exception as e: + logger.error(f"get_admin_ai_stats failed: {e}") + import traceback + logger.error(traceback.format_exc()) + return jsonify({'code': 0, 'msg': str(e), 'data': None}), 500 \ No newline at end of file diff --git a/backend_api_python/app/services/exchange_execution.py b/backend_api_python/app/services/exchange_execution.py index 439628a..ed3d87b 100644 --- a/backend_api_python/app/services/exchange_execution.py +++ b/backend_api_python/app/services/exchange_execution.py @@ -61,7 +61,7 @@ def load_strategy_configs(strategy_id: int) -> Dict[str, Any]: cur = db.cursor() cur.execute( """ - SELECT id, exchange_config, trading_config, market_type, leverage, execution_mode, market_category + SELECT id, user_id, exchange_config, trading_config, market_type, leverage, execution_mode, market_category FROM qd_strategies_trading WHERE id = %s """, @@ -77,9 +77,11 @@ def load_strategy_configs(strategy_id: int) -> Dict[str, Any]: leverage = float(row.get("leverage") or trading_config.get("leverage") or exchange_config.get("leverage") or 1.0) execution_mode = (row.get("execution_mode") or "signal").strip().lower() market_category = (row.get("market_category") or "Crypto").strip() + user_id = int(row.get("user_id") or 1) return { "strategy_id": int(strategy_id), + "user_id": user_id, "exchange_config": exchange_config if isinstance(exchange_config, dict) else {}, "trading_config": trading_config if isinstance(trading_config, dict) else {}, "market_type": market_type, diff --git a/backend_api_python/app/services/pending_order_worker.py b/backend_api_python/app/services/pending_order_worker.py index 57377c5..03998f1 100644 --- a/backend_api_python/app/services/pending_order_worker.py +++ b/backend_api_python/app/services/pending_order_worker.py @@ -207,7 +207,8 @@ class PendingOrderWorker: if exec_mode != "live": logger.debug(f"[PositionSync] Strategy {sid} skipped: execution_mode='{exec_mode}' (needs 'live')") continue - exchange_config = resolve_exchange_config(sc.get("exchange_config") or {}) + sync_user_id = int(sc.get("user_id") or 1) + exchange_config = resolve_exchange_config(sc.get("exchange_config") or {}, user_id=sync_user_id) safe_cfg = safe_exchange_config_for_log(exchange_config) market_type = (sc.get("market_type") or exchange_config.get("market_type") or "swap") market_type = str(market_type or "swap").strip().lower() @@ -832,7 +833,8 @@ class PendingOrderWorker: return cfg = load_strategy_configs(strategy_id) - exchange_config = resolve_exchange_config(cfg.get("exchange_config") or {}) + strategy_user_id = int(cfg.get("user_id") or 1) + exchange_config = resolve_exchange_config(cfg.get("exchange_config") or {}, user_id=strategy_user_id) safe_cfg = safe_exchange_config_for_log(exchange_config) exchange_id = str(exchange_config.get("exchange_id") or "").strip().lower() market_category = str(cfg.get("market_category") or "Crypto").strip() diff --git a/backend_api_python/app/services/strategy.py b/backend_api_python/app/services/strategy.py index 8172f8f..5c3bcd8 100644 --- a/backend_api_python/app/services/strategy.py +++ b/backend_api_python/app/services/strategy.py @@ -549,6 +549,12 @@ class StrategyService: trading_config = payload.get('trading_config') or {} exchange_config = payload.get('exchange_config') or {} + # When credential_id is present, strip raw API keys to avoid + # storing secrets in the strategy record โ€” they live in qd_exchange_credentials. + if isinstance(exchange_config, dict) and exchange_config.get('credential_id'): + for _secret_key in ('api_key', 'secret_key', 'passphrase', 'apiKey', 'secret', 'password'): + exchange_config.pop(_secret_key, None) + # Strategy group fields strategy_group_id = payload.get('strategy_group_id') or '' group_base_name = payload.get('group_base_name') or '' @@ -779,7 +785,13 @@ class StrategyService: trading_config = payload.get('trading_config') if payload.get('trading_config') is not None else (existing.get('trading_config') or {}) exchange_config = payload.get('exchange_config') if payload.get('exchange_config') is not None else (existing.get('exchange_config') or {}) ai_model_config = payload.get('ai_model_config') if payload.get('ai_model_config') is not None else (existing.get('ai_model_config') or {}) - + + # When credential_id is present, strip raw API keys to avoid + # storing secrets in the strategy record โ€” they live in qd_exchange_credentials. + if isinstance(exchange_config, dict) and exchange_config.get('credential_id'): + for _secret_key in ('api_key', 'secret_key', 'passphrase', 'apiKey', 'secret', 'password'): + exchange_config.pop(_secret_key, None) + # Handle cross-sectional strategy config updates if payload.get('cs_strategy_type') is not None: trading_config['cs_strategy_type'] = payload.get('cs_strategy_type') diff --git a/backend_api_python/app/services/usdt_payment_service.py b/backend_api_python/app/services/usdt_payment_service.py index b55a653..ee80749 100644 --- a/backend_api_python/app/services/usdt_payment_service.py +++ b/backend_api_python/app/services/usdt_payment_service.py @@ -4,14 +4,15 @@ USDT Payment Service (ๆ–นๆกˆB๏ผšๆฏๅ•็‹ฌ็ซ‹ๅœฐๅ€ + ่‡ชๅŠจๅฏน่ดฆ) MVP: - ๅชๆ”ฏๆŒ USDT-TRC20 - ไฝฟ็”จ XPUB ๆดพ็”Ÿๅœฐๅ€๏ผˆๆœๅŠก็ซฏๅชไฟๅญ˜ xpub๏ผŒไธไฟๅญ˜็ง้’ฅ๏ผ‰ -- ้€š่ฟ‡ TronGrid API ่ฝฎ่ฏขๅˆฐ่ดฆ๏ผˆๅ‰็ซฏ่ฝฎ่ฏข่ฎขๅ•็Šถๆ€ๆ—ถ่งฆๅ‘ๅˆทๆ–ฐ๏ผ‰ +- ๅŽๅฐ Worker ็บฟ็จ‹่‡ชๅŠจ่ฝฎ่ฏข้“พไธŠๅˆฐ่ดฆ + ๅ‰็ซฏ่ฝฎ่ฏขๅŒไฟ้™ฉ """ import os +import threading import time from datetime import datetime, timezone, timedelta from decimal import Decimal -from typing import Any, Dict, Optional, Tuple +from typing import Any, Dict, List, Optional, Tuple import requests @@ -233,10 +234,13 @@ class UsdtPaymentService: # -------------------- Chain check -------------------- def _refresh_order_in_tx(self, cur, row: Dict[str, Any]) -> None: + """Check chain status for a single order and update in the current transaction.""" cfg = self._get_cfg() status = (row.get("status") or "").lower() chain = (row.get("chain") or "").upper() + order_id = row.get("id") + # --- Expiry check (only for pending; paid orders should still be confirmed) --- expires_at = row.get("expires_at") now = datetime.now(timezone.utc) if expires_at and isinstance(expires_at, datetime): @@ -244,7 +248,7 @@ class UsdtPaymentService: if exp.tzinfo is None: exp = exp.replace(tzinfo=timezone.utc) if status == "pending" and exp <= now: - cur.execute("UPDATE qd_usdt_orders SET status = 'expired', updated_at = NOW() WHERE id = ?", (row["id"],)) + cur.execute("UPDATE qd_usdt_orders SET status = 'expired', updated_at = NOW() WHERE id = ?", (order_id,)) return if chain != "TRC20": @@ -257,6 +261,12 @@ class UsdtPaymentService: if not address or amount <= 0: return + # --- For 'paid' status, skip chain query and just check confirm delay --- + if status == "paid": + self._try_confirm_paid_order(cur, row, cfg, now) + return + + # --- For 'pending' status, query chain for incoming transfer --- tx = self._find_trc20_usdt_incoming(address, amount, row.get("created_at")) if not tx: return @@ -265,37 +275,60 @@ class UsdtPaymentService: paid_at = datetime.now(timezone.utc) cur.execute( "UPDATE qd_usdt_orders SET status = 'paid', tx_hash = ?, paid_at = ?, updated_at = NOW() WHERE id = ? AND status = 'pending'", - (tx_hash, paid_at, row["id"]), + (tx_hash, paid_at, order_id), ) - # Confirm after a short delay to reduce reorg/uncle risk (TRON usually stable) - # If already old enough, confirm now. + # Try to confirm immediately if delay is satisfied confirm_sec = int(cfg.get("confirm_seconds") or 30) try: - if confirm_sec <= 0: - confirm_sec = 0 - # If transaction timestamp is available, use it tx_ts = tx.get("block_timestamp") if tx_ts: tx_time = datetime.fromtimestamp(int(tx_ts) / 1000.0, tz=timezone.utc) if (now - tx_time).total_seconds() >= confirm_sec: - self._confirm_and_activate_in_tx(cur, row["id"], row.get("user_id"), row.get("plan"), tx_hash) - else: - # no timestamp -> confirm immediately - self._confirm_and_activate_in_tx(cur, row["id"], row.get("user_id"), row.get("plan"), tx_hash) + self._confirm_and_activate_in_tx(cur, order_id, row.get("user_id"), row.get("plan"), tx_hash) + elif confirm_sec <= 0: + self._confirm_and_activate_in_tx(cur, order_id, row.get("user_id"), row.get("plan"), tx_hash) except Exception: - # do not block pass + def _try_confirm_paid_order(self, cur, row: Dict[str, Any], cfg: Dict[str, Any], now: datetime) -> None: + """For orders already in 'paid' status, check if confirm delay is met and activate.""" + confirm_sec = int(cfg.get("confirm_seconds") or 30) + paid_at = row.get("paid_at") + if paid_at: + if isinstance(paid_at, str): + try: + paid_at = datetime.fromisoformat(paid_at.replace("Z", "+00:00")) + except Exception: + paid_at = None + if paid_at and paid_at.tzinfo is None: + paid_at = paid_at.replace(tzinfo=timezone.utc) + if paid_at and (now - paid_at).total_seconds() >= confirm_sec: + self._confirm_and_activate_in_tx(cur, row["id"], row.get("user_id"), row.get("plan"), row.get("tx_hash") or "") + return + # Fallback: if paid_at missing but confirm_sec <= 0, confirm now + if confirm_sec <= 0: + self._confirm_and_activate_in_tx(cur, row["id"], row.get("user_id"), row.get("plan"), row.get("tx_hash") or "") + def _confirm_and_activate_in_tx(self, cur, order_id: int, user_id: int, plan: str, tx_hash: str) -> None: - # Mark confirmed if not already + """Mark order as confirmed and activate membership. Idempotent: skips if already confirmed.""" + # --- Idempotency check: re-read current status --- + try: + cur.execute("SELECT status FROM qd_usdt_orders WHERE id = ?", (order_id,)) + current = cur.fetchone() + if current and (current.get("status") or "").lower() == "confirmed": + logger.debug(f"USDT order {order_id} already confirmed, skipping activation.") + return + except Exception: + pass + + # Mark confirmed cur.execute( "UPDATE qd_usdt_orders SET status='confirmed', confirmed_at = NOW(), updated_at = NOW() WHERE id = ? AND status IN ('paid','pending')", (order_id,), ) - # Activate membership (idempotent-ish: billing_service stacks vip) + # Activate membership try: - # We use existing membership activation (writes qd_membership_orders + credits logs). ok, msg, data = self.billing.purchase_membership(int(user_id), str(plan)) logger.info(f"USDT activate membership: order={order_id} user={user_id} plan={plan} ok={ok} msg={msg}") except Exception as e: @@ -340,13 +373,9 @@ class UsdtPaymentService: if min_ts and int(it.get("block_timestamp") or 0) < min_ts: continue val = int(it.get("value") or 0) - if val != target: + # Accept payments >= order amount (tolerance for overpayment) + if val < target: continue - # basic checks - token = it.get("token_info") or {} - if str(token.get("symbol") or "").upper() != "USDT": - # some APIs omit symbol; contract filter should already ensure - pass return it except Exception: continue @@ -354,8 +383,114 @@ class UsdtPaymentService: return None return None + # -------------------- Batch refresh (for worker) -------------------- + + def refresh_all_active_orders(self) -> int: + """ + Scan all pending/paid USDT orders and refresh their chain status. + Called by the background UsdtOrderWorker. + + Returns the number of orders that were updated to 'confirmed' or 'expired'. + """ + updated = 0 + try: + with get_db_connection() as db: + cur = db.cursor() + self._ensure_schema_best_effort(cur) + + cur.execute( + """ + SELECT id, user_id, plan, chain, amount_usdt, address_index, address, status, tx_hash, + paid_at, confirmed_at, expires_at, created_at, updated_at + FROM qd_usdt_orders + WHERE status IN ('pending', 'paid') + ORDER BY created_at ASC + LIMIT 100 + """ + ) + rows = cur.fetchall() or [] + + for row in rows: + old_status = (row.get("status") or "").lower() + try: + self._refresh_order_in_tx(cur, row) + except Exception as e: + logger.debug(f"refresh_all: order {row.get('id')} error: {e}") + continue + + # Check if status changed + try: + cur.execute("SELECT status FROM qd_usdt_orders WHERE id = ?", (row["id"],)) + new_row = cur.fetchone() + new_status = (new_row.get("status") or "").lower() if new_row else old_status + if new_status != old_status: + updated += 1 + logger.info(f"USDT order {row['id']}: {old_status} -> {new_status}") + except Exception: + pass + + db.commit() + cur.close() + except Exception as e: + logger.error(f"refresh_all_active_orders error: {e}", exc_info=True) + return updated + + +# ==================== Background Worker ==================== + +class UsdtOrderWorker: + """ + Background thread that periodically scans pending/paid USDT orders + and checks on-chain status via TronGrid API. + + This ensures that even if the user closes the browser after payment, + the order will still be confirmed and membership activated. + """ + + def __init__(self, poll_interval_sec: float = 30.0): + self.poll_interval_sec = float(poll_interval_sec) + self._stop_event = threading.Event() + self._thread: Optional[threading.Thread] = None + self._lock = threading.Lock() + + def start(self) -> bool: + with self._lock: + if self._thread and self._thread.is_alive(): + return True + self._stop_event.clear() + self._thread = threading.Thread(target=self._run_loop, name="UsdtOrderWorker", daemon=True) + self._thread.start() + logger.info("UsdtOrderWorker started (interval=%ss)", self.poll_interval_sec) + return True + + def stop(self): + self._stop_event.set() + if self._thread: + self._thread.join(timeout=5) + logger.info("UsdtOrderWorker stopped") + + def _run_loop(self): + # Wait a bit on startup to let the app fully initialize + self._stop_event.wait(timeout=10) + + while not self._stop_event.is_set(): + try: + svc = get_usdt_payment_service() + cfg = svc._get_cfg() + if cfg["enabled"]: + updated = svc.refresh_all_active_orders() + if updated > 0: + logger.info(f"UsdtOrderWorker: refreshed {updated} orders") + except Exception as e: + logger.error(f"UsdtOrderWorker loop error: {e}", exc_info=True) + + self._stop_event.wait(timeout=self.poll_interval_sec) + + +# ==================== Singletons ==================== _svc = None +_worker = None def get_usdt_payment_service() -> UsdtPaymentService: @@ -364,3 +499,10 @@ def get_usdt_payment_service() -> UsdtPaymentService: _svc = UsdtPaymentService() return _svc + +def get_usdt_order_worker() -> UsdtOrderWorker: + global _worker + if _worker is None: + interval = float(os.getenv("USDT_WORKER_POLL_INTERVAL", "30")) + _worker = UsdtOrderWorker(poll_interval_sec=interval) + return _worker diff --git a/backend_api_python/env.example b/backend_api_python/env.example index 9c0c7ca..5243982 100644 --- a/backend_api_python/env.example +++ b/backend_api_python/env.example @@ -347,6 +347,8 @@ TRONGRID_API_KEY= # Order confirmation delay and expiration USDT_PAY_CONFIRM_SECONDS=30 USDT_PAY_EXPIRE_MINUTES=30 +# Background worker poll interval (seconds) for checking pending USDT orders +USDT_WORKER_POLL_INTERVAL=30 # New user registration bonus credits (ๆ–ฐ็”จๆˆทๆณจๅ†Œ่ต ้€็งฏๅˆ†) CREDITS_REGISTER_BONUS=100 diff --git a/backend_api_python/migrations/init.sql b/backend_api_python/migrations/init.sql index 7156521..d7ab0d5 100644 --- a/backend_api_python/migrations/init.sql +++ b/backend_api_python/migrations/init.sql @@ -802,6 +802,36 @@ BEGIN END IF; END $$; +-- ============================================================================= +-- Quick Trades (manual / discretionary orders from Quick Trade Panel) +-- ============================================================================= +CREATE TABLE IF NOT EXISTS qd_quick_trades ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES qd_users(id) ON DELETE CASCADE, + credential_id INTEGER DEFAULT 0, + exchange_id VARCHAR(40) NOT NULL DEFAULT '', + symbol VARCHAR(60) NOT NULL DEFAULT '', + side VARCHAR(10) NOT NULL DEFAULT '', -- buy / sell + order_type VARCHAR(20) NOT NULL DEFAULT 'market', -- market / limit + amount DECIMAL(24, 8) DEFAULT 0, + price DECIMAL(24, 8) DEFAULT 0, + leverage INTEGER DEFAULT 1, + market_type VARCHAR(20) DEFAULT 'swap', -- swap / spot + tp_price DECIMAL(24, 8) DEFAULT 0, + sl_price DECIMAL(24, 8) DEFAULT 0, + status VARCHAR(20) DEFAULT 'submitted', -- submitted / filled / failed / cancelled + exchange_order_id VARCHAR(120) DEFAULT '', + filled_amount DECIMAL(24, 8) DEFAULT 0, + avg_fill_price DECIMAL(24, 8) DEFAULT 0, + error_msg TEXT DEFAULT '', + source VARCHAR(40) DEFAULT 'manual', -- ai_radar / ai_analysis / indicator / manual + raw_result JSONB, + created_at TIMESTAMP DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_quick_trades_user ON qd_quick_trades(user_id); +CREATE INDEX IF NOT EXISTS idx_quick_trades_created ON qd_quick_trades(created_at DESC); + -- ============================================================================= -- Completion Notice -- ============================================================================= diff --git a/docker-compose.yml b/docker-compose.yml index 2a62a60..cbda9f2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +1,15 @@ -# QuantDinger Docker Compose -# Quick start: docker-compose up -d +# QuantDinger Docker Compose - One-Click Deployment +# Usage: +# 1. Copy .env.example to .env and edit your settings +# 2. docker-compose up -d +# 3. Open http://localhost:8888 version: '3.8' services: + # ======================== # PostgreSQL Database + # ======================== postgres: image: postgres:16-alpine container_name: quantdinger-db @@ -13,22 +18,23 @@ services: POSTGRES_DB: ${POSTGRES_DB:-quantdinger} POSTGRES_USER: ${POSTGRES_USER:-quantdinger} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-quantdinger123} - TZ: Asia/Shanghai + TZ: ${TZ:-Asia/Shanghai} volumes: - postgres_data:/var/lib/postgresql/data - ./backend_api_python/migrations/init.sql:/docker-entrypoint-initdb.d/01-init.sql - - ./backend_api_python/migrations:/migrations ports: - - "127.0.0.1:5432:5432" + - "${DB_PORT:-127.0.0.1:5432}:5432" networks: - quantdinger-network healthcheck: - test: ["CMD-SHELL", "pg_isready -U quantdinger -d quantdinger"] + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-quantdinger} -d ${POSTGRES_DB:-quantdinger}"] interval: 10s timeout: 5s retries: 5 - # Backend API Service + # ======================== + # Backend API (Python/Flask) + # ======================== backend: build: context: ./backend_api_python @@ -39,18 +45,16 @@ services: postgres: condition: service_healthy ports: - - "127.0.0.1:5000:5000" + - "${BACKEND_PORT:-127.0.0.1:5000}:5000" volumes: - # Persistent logs - - ./backend_api_python/logs:/app/logs - - ./backend_api_python/data:/app/data - # Configuration file (optional, for development) - - ./backend_api_python/.env:/app/.env + - backend_logs:/app/logs + - backend_data:/app/data + # Mount .env for runtime config + - ./backend_api_python/.env:/app/.env:ro environment: - PYTHON_API_HOST=0.0.0.0 - PYTHON_API_PORT=5000 - - TZ=Asia/Shanghai - # Database connection + - TZ=${TZ:-Asia/Shanghai} - DATABASE_URL=postgresql://${POSTGRES_USER:-quantdinger}:${POSTGRES_PASSWORD:-quantdinger123}@postgres:5432/${POSTGRES_DB:-quantdinger} - DB_TYPE=postgresql networks: @@ -61,17 +65,17 @@ services: timeout: 10s retries: 3 - # Frontend Web Service + # ======================== + # Frontend (Nginx + Pre-built) + # ======================== frontend: build: - context: ./quantdinger_vue + context: ./frontend dockerfile: Dockerfile - # Force pull from official registry to avoid mirror issues - pull: true container_name: quantdinger-frontend restart: unless-stopped ports: - - "8888:80" + - "${FRONTEND_PORT:-8888}:80" depends_on: - backend networks: @@ -85,6 +89,10 @@ services: volumes: postgres_data: driver: local + backend_logs: + driver: local + backend_data: + driver: local networks: quantdinger-network: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e075ab4..79cab6e 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -42,11 +42,27 @@ This document records version updates, new features, bug fixes, and database mig - **Market Order Default**: Changed default order mode to market order for reliable execution - **Billing Config i18n**: All billing configuration items fully multi-language supported +#### Quick Trade Panel (้—ช็”ตไบคๆ˜“) ๐Ÿ†• +- **Side-Sliding Drawer**: Professional trading panel slides in from the right, allowing instant order placement without leaving the analysis page +- **Multi-Exchange Support**: Select from saved exchange credentials (Binance, OKX, Bitget, Bybit, etc.) with real-time balance display +- **Long/Short Toggle**: Color-coded direction buttons with one-click switching +- **Market / Limit Orders**: Toggle between market and limit order types; limit orders accept a specific price +- **Leverage Slider**: Interactive 1xโ€“125x leverage control for futures trading +- **TP/SL Price Setting**: Optional take-profit and stop-loss by **absolute price** (not percentage) +- **Current Position Display**: Shows open position with side, size, entry price, unrealized PnL, and one-click close button +- **Recent Trade History**: Displays last 5 quick trades with status tags +- **AI Radar Integration**: "Trade Now" button on each AI Trading Opportunities card pre-fills symbol, direction, and price +- **Indicator Analysis Integration**: Quick Trade button in chart header and floating โšก button pre-fills current symbol and price +- **Auto-Polling**: Balance and position data refresh every 10 seconds +- **Full Dark Theme**: Complete dark mode support for all panel elements +- **Multi-Language**: All labels and messages fully internationalized (zh-CN / en-US) + #### Indicator Market Performance Tracking - **Live Performance Data**: Fixed aggregation to correctly parse backtest `result_json` and include live trade data - **Combined Metrics**: Backtest return, live PnL, and win rate now properly displayed on indicator cards ### ๐Ÿ› Bug Fixes +- Fixed `quick_trade.py` importing from non-existent `auth_utils` module (corrected to `auth`) - Fixed "Live Performance" data showing all zeros in Indicator Market (incorrect SQL query referencing non-existent columns) - Fixed incorrect entry price display in Position Records (was falling back to current price) - Fixed inaccurate System Overview statistics for running strategies, total capital, and total PnL @@ -148,6 +164,34 @@ CREATE UNIQUE INDEX IF NOT EXISTS idx_usdt_orders_address_unique ON qd_usdt_orde CREATE INDEX IF NOT EXISTS idx_usdt_orders_user_id ON qd_usdt_orders(user_id); CREATE INDEX IF NOT EXISTS idx_usdt_orders_status ON qd_usdt_orders(status); +-- 5. Quick Trades table (manual / discretionary orders from Quick Trade Panel) +CREATE TABLE IF NOT EXISTS qd_quick_trades ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES qd_users(id) ON DELETE CASCADE, + credential_id INTEGER DEFAULT 0, + exchange_id VARCHAR(40) NOT NULL DEFAULT '', + symbol VARCHAR(60) NOT NULL DEFAULT '', + side VARCHAR(10) NOT NULL DEFAULT '', -- buy / sell + order_type VARCHAR(20) NOT NULL DEFAULT 'market', -- market / limit + amount DECIMAL(24, 8) DEFAULT 0, + price DECIMAL(24, 8) DEFAULT 0, + leverage INTEGER DEFAULT 1, + market_type VARCHAR(20) DEFAULT 'swap', -- swap / spot + tp_price DECIMAL(24, 8) DEFAULT 0, + sl_price DECIMAL(24, 8) DEFAULT 0, + status VARCHAR(20) DEFAULT 'submitted', -- submitted / filled / failed / cancelled + exchange_order_id VARCHAR(120) DEFAULT '', + filled_amount DECIMAL(24, 8) DEFAULT 0, + avg_fill_price DECIMAL(24, 8) DEFAULT 0, + error_msg TEXT DEFAULT '', + source VARCHAR(40) DEFAULT 'manual', -- ai_radar / ai_analysis / indicator / manual + raw_result JSONB, + created_at TIMESTAMP DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_quick_trades_user ON qd_quick_trades(user_id); +CREATE INDEX IF NOT EXISTS idx_quick_trades_created ON qd_quick_trades(created_at DESC); + -- Migration Complete DO $$ BEGIN diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..8e1e3bc --- /dev/null +++ b/frontend/Dockerfile @@ -0,0 +1,13 @@ +# QuantDinger Frontend - Pre-built Static Files +# No build step needed - dist/ is already compiled. +FROM nginx:1.25-alpine + +# Copy pre-built frontend files +COPY dist/ /usr/share/nginx/html/ + +# Copy nginx configuration +COPY nginx.conf /etc/nginx/conf.d/default.conf + +EXPOSE 80 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/frontend/VERSION b/frontend/VERSION new file mode 100644 index 0000000..c043eea --- /dev/null +++ b/frontend/VERSION @@ -0,0 +1 @@ +2.2.1 diff --git a/quantdinger_vue/deploy/nginx-docker.conf b/frontend/nginx.conf similarity index 67% rename from quantdinger_vue/deploy/nginx-docker.conf rename to frontend/nginx.conf index 891ded4..2f90e4c 100644 --- a/quantdinger_vue/deploy/nginx-docker.conf +++ b/frontend/nginx.conf @@ -4,15 +4,23 @@ server { root /usr/share/nginx/html; index index.html; + # Security headers + add_header X-Frame-Options "SAMEORIGIN" always; + add_header X-Content-Type-Options "nosniff" always; + add_header X-XSS-Protection "1; mode=block" always; + # Gzip compression gzip on; - gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + gzip_vary on; gzip_min_length 1000; + gzip_comp_level 6; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/svg+xml; - # Static asset caching - location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { + # Static asset caching (hashed filenames = immutable) + location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|map)$ { expires 1y; add_header Cache-Control "public, immutable"; + access_log off; } # API proxy to backend @@ -28,16 +36,19 @@ server { proxy_cache_bypass $http_upgrade; proxy_read_timeout 300s; proxy_connect_timeout 75s; + # Allow large file uploads (e.g. indicator import) + client_max_body_size 10m; } - # SPA routing support + # SPA routing support (all routes fall back to index.html) location / { try_files $uri $uri/ /index.html; } - # Health check + # Health check endpoint location /health { return 200 'OK'; add_header Content-Type text/plain; + access_log off; } } diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 3db414e..0000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "QuantDinger", - "lockfileVersion": 3, - "requires": true, - "packages": {} -} diff --git a/quantdinger_vue/.browserslistrc b/quantdinger_vue/.browserslistrc deleted file mode 100644 index 8f96043..0000000 --- a/quantdinger_vue/.browserslistrc +++ /dev/null @@ -1,3 +0,0 @@ -> 1% -last 2 versions -not ie <= 10 diff --git a/quantdinger_vue/.dockerignore b/quantdinger_vue/.dockerignore deleted file mode 100644 index ac8548e..0000000 --- a/quantdinger_vue/.dockerignore +++ /dev/null @@ -1,41 +0,0 @@ -# Dependencies -node_modules/ - -# Build output (ไผšๅœจๅฎนๅ™จๅ†…ๆž„ๅปบ) -dist/ - -# IDE -.idea/ -.vscode/ -*.swp -*.swo - -# Logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Environment -.env -.env.local -.env.*.local - -# Git -.git/ -.gitignore - -# Tests -tests/ -coverage/ -.nyc_output/ - -# Documentation -*.md -!README.md - -# OS -.DS_Store -Thumbs.db - diff --git a/quantdinger_vue/.editorconfig b/quantdinger_vue/.editorconfig deleted file mode 100644 index 6f77dff..0000000 --- a/quantdinger_vue/.editorconfig +++ /dev/null @@ -1,39 +0,0 @@ -[*] -charset=utf-8 -end_of_line=lf -insert_final_newline=false -indent_style=space -indent_size=2 - -[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}] -indent_style=space -indent_size=2 - -[{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}] -indent_style=space -indent_size=2 - -[{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}] -indent_style=space -indent_size=2 - -[*.svg] -indent_style=space -indent_size=2 - -[*.js.map] -indent_style=space -indent_size=2 - -[*.less] -indent_style=space -indent_size=2 - -[*.vue] -indent_style=space -indent_size=2 - -[{.analysis_options,*.yml,*.yaml}] -indent_style=space -indent_size=2 - diff --git a/quantdinger_vue/.env b/quantdinger_vue/.env deleted file mode 100644 index 5a5c073..0000000 --- a/quantdinger_vue/.env +++ /dev/null @@ -1,3 +0,0 @@ -๏ปฟNODE_ENV=production -VUE_APP_PREVIEW=false -VUE_APP_API_BASE_URL=/api \ No newline at end of file diff --git a/quantdinger_vue/.env.development b/quantdinger_vue/.env.development deleted file mode 100644 index 166c0bc..0000000 --- a/quantdinger_vue/.env.development +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV=development -VUE_APP_PREVIEW=true -VUE_APP_API_BASE_URL=/api \ No newline at end of file diff --git a/quantdinger_vue/.env.preview b/quantdinger_vue/.env.preview deleted file mode 100644 index a9e44c8..0000000 --- a/quantdinger_vue/.env.preview +++ /dev/null @@ -1,3 +0,0 @@ -NODE_ENV=production -VUE_APP_PREVIEW=true -VUE_APP_API_BASE_URL=/api \ No newline at end of file diff --git a/quantdinger_vue/.eslintrc.js b/quantdinger_vue/.eslintrc.js deleted file mode 100644 index 5bece06..0000000 --- a/quantdinger_vue/.eslintrc.js +++ /dev/null @@ -1,75 +0,0 @@ -module.exports = { - root: true, - env: { - node: true - }, - 'extends': [ - 'plugin:vue/strongly-recommended', - '@vue/standard' - ], - rules: { - 'no-console': 'off', - 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', - 'generator-star-spacing': 'off', - 'no-mixed-operators': 0, - 'vue/max-attributes-per-line': [ - 2, - { - 'singleline': 5, - 'multiline': { - 'max': 1, - 'allowFirstLine': false - } - } - ], - 'vue/attribute-hyphenation': 0, - 'vue/html-self-closing': 0, - 'vue/component-name-in-template-casing': 0, - 'vue/html-closing-bracket-spacing': 0, - 'vue/singleline-html-element-content-newline': 0, - 'vue/no-unused-components': 0, - 'vue/multiline-html-element-content-newline': 0, - 'vue/no-use-v-if-with-v-for': 0, - 'vue/html-closing-bracket-newline': 0, - 'vue/no-parsing-error': 0, - 'no-tabs': 0, - 'quotes': [ - 2, - 'single', - { - 'avoidEscape': true, - 'allowTemplateLiterals': true - } - ], - 'semi': [ - 2, - 'never', - { - 'beforeStatementContinuationChars': 'never' - } - ], - 'no-delete-var': 2, - 'prefer-const': [ - 2, - { - 'ignoreReadBeforeAssign': false - } - ], - 'template-curly-spacing': 'off', - 'indent': 'off' - }, - parserOptions: { - parser: 'babel-eslint' - }, - overrides: [ - { - files: [ - '**/__tests__/*.{j,t}s?(x)', - '**/tests/unit/**/*.spec.{j,t}s?(x)' - ], - env: { - jest: true - } - } - ] -} diff --git a/quantdinger_vue/.eslintrc.json b/quantdinger_vue/.eslintrc.json deleted file mode 100644 index ed223c7..0000000 --- a/quantdinger_vue/.eslintrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "space-before-function-paren": 0 - } -} diff --git a/quantdinger_vue/.gitattributes b/quantdinger_vue/.gitattributes deleted file mode 100644 index a801add..0000000 --- a/quantdinger_vue/.gitattributes +++ /dev/null @@ -1,11 +0,0 @@ -public/* linguist-vendored - -# Automatically normalize line endings (to LF) for all text-based files. -* text=auto eol=lf - -# Declare files that will always have CRLF line endings on checkout. -*.{cmd,[cC][mM][dD]} text eol=crlf -*.{bat,[bB][aA][tT]} text eol=crlf - -# Denote all files that are truly binary and should not be modified. -*.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary \ No newline at end of file diff --git a/quantdinger_vue/.gitignore b/quantdinger_vue/.gitignore deleted file mode 100644 index 5815c9a..0000000 --- a/quantdinger_vue/.gitignore +++ /dev/null @@ -1,21 +0,0 @@ -.DS_Store -node_modules -/dist -# local env files -.env.local -.env.*.local - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw* -package-lock.json diff --git a/quantdinger_vue/.husky/.gitignore b/quantdinger_vue/.husky/.gitignore deleted file mode 100644 index 31354ec..0000000 --- a/quantdinger_vue/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/quantdinger_vue/.lintstagedrc.json b/quantdinger_vue/.lintstagedrc.json deleted file mode 100644 index bcffb34..0000000 --- a/quantdinger_vue/.lintstagedrc.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "*.js": "eslint --fix", - "*.{css,less}": "stylelint --fix" -} \ No newline at end of file diff --git a/quantdinger_vue/.prettierrc b/quantdinger_vue/.prettierrc deleted file mode 100644 index b0e80f7..0000000 --- a/quantdinger_vue/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "printWidth": 120, - "semi": false, - "singleQuote": true, - "prettier.spaceBeforeFunctionParen": true -} diff --git a/quantdinger_vue/.stylelintrc.js b/quantdinger_vue/.stylelintrc.js deleted file mode 100644 index 412e214..0000000 --- a/quantdinger_vue/.stylelintrc.js +++ /dev/null @@ -1,102 +0,0 @@ -module.exports = { - processors: [], - plugins: ['stylelint-order'], - extends: [ - 'stylelint-config-standard', - 'stylelint-config-css-modules' - ], - rules: { - 'selector-class-pattern': null, - 'string-quotes': 'single', // ๅ•ๅผ•ๅท - 'at-rule-empty-line-before': null, - 'at-rule-no-unknown': null, - 'at-rule-name-case': 'lower', // ๆŒ‡ๅฎš@่ง„ๅˆ™ๅ็š„ๅคงๅฐๅ†™ - 'length-zero-no-unit': true, // ็ฆๆญข้›ถ้•ฟๅบฆ็š„ๅ•ไฝ๏ผˆๅฏ่‡ชๅŠจไฟฎๅค๏ผ‰ - 'shorthand-property-no-redundant-values': true, // ็ฎ€ๅ†™ๅฑžๆ€ง - 'number-leading-zero': 'never', // ๅฐๆ•ฐไธๅธฆ0 - 'declaration-block-no-duplicate-properties': null, // ็ฆๆญขๅฃฐๆ˜Žๅฟซ้‡ๅคๅฑžๆ€ง - 'no-descending-specificity': null, // ็ฆๆญขๅœจๅ…ทๆœ‰่พƒ้ซ˜ไผ˜ๅ…ˆ็บง็š„้€‰ๆ‹ฉๅ™จๅŽๅ‡บ็Žฐ่ขซๅ…ถ่ฆ†็›–็š„่พƒไฝŽไผ˜ๅ…ˆ็บง็š„้€‰ๆ‹ฉๅ™จใ€‚ - 'selector-max-id': 3, // ้™ๅˆถไธ€ไธช้€‰ๆ‹ฉๅ™จไธญ ID ้€‰ๆ‹ฉๅ™จ็š„ๆ•ฐ้‡ - 'max-nesting-depth': 4, - 'indentation': [2, { // ๆŒ‡ๅฎš็ผฉ่ฟ› warning ๆ้†’ - 'severity': 'warning' - }], - 'order/properties-order': [ // ่ง„ๅˆ™้กบๅบ - 'position', - 'top', - 'right', - 'bottom', - 'left', - 'z-index', - 'display', - 'float', - 'width', - 'height', - 'max-width', - 'max-height', - 'min-width', - 'min-height', - 'padding', - 'padding-top', - 'padding-right', - 'padding-bottom', - 'padding-left', - 'margin', - 'margin-top', - 'margin-right', - 'margin-bottom', - 'margin-left', - 'margin-collapse', - 'margin-top-collapse', - 'margin-right-collapse', - 'margin-bottom-collapse', - 'margin-left-collapse', - 'overflow', - 'overflow-x', - 'overflow-y', - 'clip', - 'clear', - 'font', - 'font-family', - 'font-size', - 'font-smoothing', - 'osx-font-smoothing', - 'font-style', - 'font-weight', - 'line-height', - 'letter-spacing', - 'word-spacing', - 'color', - 'text-align', - 'text-decoration', - 'text-indent', - 'text-overflow', - 'text-rendering', - 'text-size-adjust', - 'text-shadow', - 'text-transform', - 'word-break', - 'word-wrap', - 'white-space', - 'vertical-align', - 'list-style', - 'list-style-type', - 'list-style-position', - 'list-style-image', - 'pointer-events', - 'cursor', - 'background', - 'background-color', - 'border', - 'border-radius', - 'content', - 'outline', - 'outline-offset', - 'opacity', - 'filter', - 'visibility', - 'size', - 'transform' - ] - } -} diff --git a/quantdinger_vue/.travis.yml b/quantdinger_vue/.travis.yml deleted file mode 100644 index a08bfcb..0000000 --- a/quantdinger_vue/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: - - 10.15.0 -cache: yarn -script: - - yarn - - yarn run lint --no-fix && yarn run build diff --git a/quantdinger_vue/Dockerfile b/quantdinger_vue/Dockerfile deleted file mode 100644 index 659385a..0000000 --- a/quantdinger_vue/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -# QuantDinger Frontend Dockerfile -# Stage 1: Build -FROM node:18-alpine as builder - -WORKDIR /app - -# Copy package files -COPY package*.json ./ - -# Install dependencies (prefer npm) -RUN npm install --legacy-peer-deps - -# Copy source code -COPY . . - -# Build production version -RUN npm run build - -# Stage 2: Production image (using nginx) -# Use specific version to avoid mirror registry issues -FROM nginx:1.25-alpine - -# Copy build artifacts -COPY --from=builder /app/dist /usr/share/nginx/html - -# Copy nginx configuration -COPY deploy/nginx-docker.conf /etc/nginx/conf.d/default.conf - -# Expose port -EXPOSE 80 - -CMD ["nginx", "-g", "daemon off;"] diff --git a/quantdinger_vue/README.md b/quantdinger_vue/README.md deleted file mode 100644 index d3ac37c..0000000 --- a/quantdinger_vue/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# QuantDinger Web UI (Vue 2) - -This is the QuantDinger frontend web UI built with **Vue 2** + **Ant Design Vue**. It connects to the Python backend (`backend_api_python/`) through HTTP APIs to provide charts, indicators, backtests, AI analysis, and strategy management. - -> This UI is based on the open-source `ant-design-vue-pro` ecosystem, heavily adapted for QuantDinger. - -## What you get - -- **Dashboards**: summary views and operational panels -- **Indicator analysis**: Kline charts + indicator editing + backtest history -- **AI analysis**: multi-agent reports (optional LLM/search, configured on backend) -- **Trading assistant**: strategy lifecycle + positions/records (depending on backend capability) -- **Local auth**: login with backend-configured admin credentials - -## Quick start (local development) - -### Prerequisites - -- Node.js 16+ recommended -- Backend running at `http://localhost:5000` (see `backend_api_python/README.md`) - -### 1) Install dependencies - -```bash -cd quantdinger_vue -npm install -``` - -### 2) Start dev server - -```bash -npm run serve -``` - -Dev server runs at `http://localhost:8000`. - -### 3) API proxy (important) - -In dev mode, this project proxies `/api/*` to the backend: - -- Proxy config: `quantdinger_vue/vue.config.js` -- Default target: `http://localhost:5000` - -If your backend runs on a different host/port, update `vue.config.js` accordingly. - -## Production build - -```bash -npm run build -``` - -The output will be generated under `quantdinger_vue/dist/`. - -## Notes - -- **CORS**: when using the dev proxy, you typically donโ€™t need extra CORS config. -- **Login**: use the credentials defined in `backend_api_python/.env` (`ADMIN_USER` / `ADMIN_PASSWORD`). - -## License - -Apache License 2.0. See repository root `LICENSE`. - diff --git a/quantdinger_vue/babel.config.js b/quantdinger_vue/babel.config.js deleted file mode 100644 index 4fe6229..0000000 --- a/quantdinger_vue/babel.config.js +++ /dev/null @@ -1,30 +0,0 @@ -const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV) -const IS_PREVIEW = process.env.VUE_APP_PREVIEW === 'true' - -const plugins = [] -if (IS_PROD && !IS_PREVIEW) { - // ๅŽป้™คๆ—ฅๅฟ—็š„ๆ’ไปถ๏ผŒ - plugins.push('transform-remove-console') -} - -// lazy load ant-design-vue -// if your use import on Demand, Use this code -plugins.push(['import', { - 'libraryName': 'ant-design-vue', - 'libraryDirectory': 'es', - 'style': true // `style: true` ไผšๅŠ ่ฝฝ less ๆ–‡ไปถ -}]) - -module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset', - [ - '@babel/preset-env', - { - 'useBuiltIns': 'entry', - 'corejs': 3 - } - ] - ], - plugins -} diff --git a/quantdinger_vue/build-docker.ps1 b/quantdinger_vue/build-docker.ps1 deleted file mode 100644 index 7c4f4a5..0000000 --- a/quantdinger_vue/build-docker.ps1 +++ /dev/null @@ -1,27 +0,0 @@ -# PowerShell script for building Docker image with registry fallback - -Write-Host "Building frontend Docker image..." -ForegroundColor Green - -# Try to build with --pull flag to force pull from official registry -$buildResult = docker build ` - --pull ` - --platform linux/amd64 ` - -t quantdinger-frontend:latest ` - -f Dockerfile ` - . - -if ($LASTEXITCODE -ne 0) { - Write-Host "Build failed, trying with no-cache..." -ForegroundColor Yellow - docker build ` - --no-cache ` - --platform linux/amd64 ` - -t quantdinger-frontend:latest ` - -f Dockerfile ` - . -} - -if ($LASTEXITCODE -eq 0) { - Write-Host "Build successful!" -ForegroundColor Green -} else { - Write-Host "Build failed. Please check Docker registry configuration." -ForegroundColor Red -} diff --git a/quantdinger_vue/build-docker.sh b/quantdinger_vue/build-docker.sh deleted file mode 100644 index d7131a6..0000000 --- a/quantdinger_vue/build-docker.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# Docker build script with registry fallback - -# Try to build with --pull flag to force pull from official registry -echo "Building frontend Docker image..." -docker build \ - --pull \ - --platform linux/amd64 \ - -t quantdinger-frontend:latest \ - -f Dockerfile \ - . - -if [ $? -ne 0 ]; then - echo "Build failed, trying with no-cache..." - docker build \ - --no-cache \ - --platform linux/amd64 \ - -t quantdinger-frontend:latest \ - -f Dockerfile \ - . -fi diff --git a/quantdinger_vue/commitlint.config.js b/quantdinger_vue/commitlint.config.js deleted file mode 100644 index 7197cc6..0000000 --- a/quantdinger_vue/commitlint.config.js +++ /dev/null @@ -1,26 +0,0 @@ -/** - * feat๏ผšๆ–ฐๅขžๅŠŸ่ƒฝ - * fix๏ผšbug ไฟฎๅค - * docs๏ผšๆ–‡ๆกฃๆ›ดๆ–ฐ - * style๏ผšไธๅฝฑๅ“็จ‹ๅบ้€ป่พ‘็š„ไปฃ็ ไฟฎๆ”น(ไฟฎๆ”น็ฉบ็™ฝๅญ—็ฌฆ๏ผŒๆ ผๅผ็ผฉ่ฟ›๏ผŒ่กฅๅ…จ็ผบๅคฑ็š„ๅˆ†ๅท็ญ‰๏ผŒๆฒกๆœ‰ๆ”นๅ˜ไปฃ็ ้€ป่พ‘) - * refactor๏ผš้‡ๆž„ไปฃ็ (ๆ—ขๆฒกๆœ‰ๆ–ฐๅขžๅŠŸ่ƒฝ๏ผŒไนŸๆฒกๆœ‰ไฟฎๅค bug) - * perf๏ผšๆ€ง่ƒฝ, ไฝ“้ชŒไผ˜ๅŒ– - * test๏ผšๆ–ฐๅขžๆต‹่ฏ•็”จไพ‹ๆˆ–ๆ˜ฏๆ›ดๆ–ฐ็Žฐๆœ‰ๆต‹่ฏ• - * build๏ผšไธป่ฆ็›ฎ็š„ๆ˜ฏไฟฎๆ”น้กน็›ฎๆž„ๅปบ็ณป็ปŸ(ไพ‹ๅฆ‚ glup๏ผŒwebpack๏ผŒrollup ็š„้…็ฝฎ็ญ‰)็š„ๆไบค - * ci๏ผšไธป่ฆ็›ฎ็š„ๆ˜ฏไฟฎๆ”น้กน็›ฎ็ปง็ปญ้›†ๆˆๆต็จ‹(ไพ‹ๅฆ‚ Travis๏ผŒJenkins๏ผŒGitLab CI๏ผŒCircle็ญ‰)็š„ๆไบค - * chore๏ผšไธๅฑžไบŽไปฅไธŠ็ฑปๅž‹็š„ๅ…ถไป–็ฑปๅž‹๏ผŒๆฏ”ๅฆ‚ๆž„ๅปบๆต็จ‹, ไพ่ต–็ฎก็† - * revert๏ผšๅ›žๆปšๆŸไธชๆ›ดๆ—ฉไน‹ๅ‰็š„ๆไบค - */ - -module.exports = { - extends: ['@commitlint/config-conventional'], - rules: { - 'type-enum': [ - 2, - 'always', - ['feat', 'fix', 'docs', 'style', 'refactor', 'test', 'chore', 'revert'] - ], - 'subject-full-stop': [0, 'never'], - 'subject-case': [0, 'never'] - } -} diff --git a/quantdinger_vue/config/plugin.config.js b/quantdinger_vue/config/plugin.config.js deleted file mode 100644 index bb51b98..0000000 --- a/quantdinger_vue/config/plugin.config.js +++ /dev/null @@ -1,49 +0,0 @@ -const ThemeColorReplacer = require('webpack-theme-color-replacer') -const generate = require('@ant-design/colors/lib/generate').default - -const getAntdSerials = (color) => { - // ๆทกๅŒ–๏ผˆๅณless็š„tint๏ผ‰ - const lightens = new Array(9).fill().map((t, i) => { - return ThemeColorReplacer.varyColor.lighten(color, i / 10) - }) - const colorPalettes = generate(color) - const rgb = ThemeColorReplacer.varyColor.toNum3(color.replace('#', '')).join(',') - return lightens.concat(colorPalettes).concat(rgb) -} - -const themePluginOption = { - fileName: 'css/theme-colors-[contenthash:8].css', - matchColors: getAntdSerials('#1890ff'), // ไธป่‰ฒ็ณปๅˆ— - // ๆ”นๅ˜ๆ ทๅผ้€‰ๆ‹ฉๅ™จ๏ผŒ่งฃๅ†ณๆ ทๅผ่ฆ†็›–้—ฎ้ข˜ - changeSelector (selector) { - switch (selector) { - case '.ant-calendar-today .ant-calendar-date': - return ':not(.ant-calendar-selected-date):not(.ant-calendar-selected-day)' + selector - case '.ant-btn:focus,.ant-btn:hover': - return '.ant-btn:focus:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:hover:not(.ant-btn-primary):not(.ant-btn-danger)' - case '.ant-btn.active,.ant-btn:active': - return '.ant-btn.active:not(.ant-btn-primary):not(.ant-btn-danger),.ant-btn:active:not(.ant-btn-primary):not(.ant-btn-danger)' - case '.ant-steps-item-process .ant-steps-item-icon > .ant-steps-icon': - case '.ant-steps-item-process .ant-steps-item-icon>.ant-steps-icon': - return ':not(.ant-steps-item-process)' + selector - // fixed https://github.com/vueComponent/ant-design-vue-pro/issues/876 - case '.ant-steps-item-process .ant-steps-item-icon': - return ':not(.ant-steps-item-custom)' + selector - case '.ant-menu-horizontal>.ant-menu-item-active,.ant-menu-horizontal>.ant-menu-item-open,.ant-menu-horizontal>.ant-menu-item-selected,.ant-menu-horizontal>.ant-menu-item:hover,.ant-menu-horizontal>.ant-menu-submenu-active,.ant-menu-horizontal>.ant-menu-submenu-open,.ant-menu-horizontal>.ant-menu-submenu-selected,.ant-menu-horizontal>.ant-menu-submenu:hover': - case '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal > .ant-menu-submenu-selected,.ant-menu-horizontal > .ant-menu-submenu:hover': - return '.ant-menu-horizontal > .ant-menu-item-active,.ant-menu-horizontal > .ant-menu-item-open,.ant-menu-horizontal > .ant-menu-item-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-item:hover,.ant-menu-horizontal > .ant-menu-submenu-active,.ant-menu-horizontal > .ant-menu-submenu-open,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu-selected,.ant-menu-horizontal:not(.ant-menu-dark) > .ant-menu-submenu:hover' - case '.ant-menu-horizontal > .ant-menu-item-selected > a': - case '.ant-menu-horizontal>.ant-menu-item-selected>a': - return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item-selected > a' - case '.ant-menu-horizontal > .ant-menu-item > a:hover': - case '.ant-menu-horizontal>.ant-menu-item>a:hover': - return '.ant-menu-horizontal:not(ant-menu-light):not(.ant-menu-dark) > .ant-menu-item > a:hover' - default : - return selector - } - } -} - -const createThemeColorReplacerPlugin = () => new ThemeColorReplacer(themePluginOption) - -module.exports = createThemeColorReplacerPlugin diff --git a/quantdinger_vue/config/themePluginConfig.js b/quantdinger_vue/config/themePluginConfig.js deleted file mode 100644 index d35ef8b..0000000 --- a/quantdinger_vue/config/themePluginConfig.js +++ /dev/null @@ -1,115 +0,0 @@ -export default { - theme: [ - { - key: 'dark', - fileName: 'dark.css', - theme: 'dark' - }, - { - key: '#F5222D', - fileName: '#F5222D.css', - modifyVars: { - '@primary-color': '#F5222D' - } - }, - { - key: '#FA541C', - fileName: '#FA541C.css', - modifyVars: { - '@primary-color': '#FA541C' - } - }, - { - key: '#FAAD14', - fileName: '#FAAD14.css', - modifyVars: { - '@primary-color': '#FAAD14' - } - }, - { - key: '#13C2C2', - fileName: '#13C2C2.css', - modifyVars: { - '@primary-color': '#13C2C2' - } - }, - { - key: '#52C41A', - fileName: '#52C41A.css', - modifyVars: { - '@primary-color': '#52C41A' - } - }, - { - key: '#2F54EB', - fileName: '#2F54EB.css', - modifyVars: { - '@primary-color': '#2F54EB' - } - }, - { - key: '#722ED1', - fileName: '#722ED1.css', - modifyVars: { - '@primary-color': '#722ED1' - } - }, - - { - key: '#F5222D', - theme: 'dark', - fileName: 'dark-#F5222D.css', - modifyVars: { - '@primary-color': '#F5222D' - } - }, - { - key: '#FA541C', - theme: 'dark', - fileName: 'dark-#FA541C.css', - modifyVars: { - '@primary-color': '#FA541C' - } - }, - { - key: '#FAAD14', - theme: 'dark', - fileName: 'dark-#FAAD14.css', - modifyVars: { - '@primary-color': '#FAAD14' - } - }, - { - key: '#13C2C2', - theme: 'dark', - fileName: 'dark-#13C2C2.css', - modifyVars: { - '@primary-color': '#13C2C2' - } - }, - { - key: '#52C41A', - theme: 'dark', - fileName: 'dark-#52C41A.css', - modifyVars: { - '@primary-color': '#52C41A' - } - }, - { - key: '#2F54EB', - theme: 'dark', - fileName: 'dark-#2F54EB.css', - modifyVars: { - '@primary-color': '#2F54EB' - } - }, - { - key: '#722ED1', - theme: 'dark', - fileName: 'dark-#722ED1.css', - modifyVars: { - '@primary-color': '#722ED1' - } - } - ] -} diff --git a/quantdinger_vue/deploy/caddy.conf b/quantdinger_vue/deploy/caddy.conf deleted file mode 100644 index acd5c0e..0000000 --- a/quantdinger_vue/deploy/caddy.conf +++ /dev/null @@ -1,9 +0,0 @@ -0.0.0.0:80 { - gzip - root /usr/share/nginx/html - - rewrite { - r .* - to {path} / - } -} \ No newline at end of file diff --git a/quantdinger_vue/deploy/nginx.conf b/quantdinger_vue/deploy/nginx.conf deleted file mode 100644 index 5ddb66d..0000000 --- a/quantdinger_vue/deploy/nginx.conf +++ /dev/null @@ -1,24 +0,0 @@ -server { - listen 80; - server_name _; - # gzip config - gzip on; - gzip_min_length 1k; - gzip_comp_level 6; - gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml; - gzip_vary on; - gzip_disable "MSIE [1-6]\."; - - root /usr/share/nginx/html; - include /etc/nginx/mime.types; - - location / { - try_files $uri $uri/ /index.html; - } - -# location /api { -# proxy_pass https://preview.pro.antdv.com/api; -# proxy_set_header X-Forwarded-Proto $scheme; -# proxy_set_header X-Real-IP $remote_addr; -# } -} diff --git a/quantdinger_vue/jest.config.js b/quantdinger_vue/jest.config.js deleted file mode 100644 index 29fee32..0000000 --- a/quantdinger_vue/jest.config.js +++ /dev/null @@ -1,23 +0,0 @@ -module.exports = { - moduleFileExtensions: [ - 'js', - 'jsx', - 'json', - 'vue' - ], - transform: { - '^.+\\.vue$': 'vue-jest', - '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', - '^.+\\.jsx?$': 'babel-jest' - }, - moduleNameMapper: { - '^@/(.*)$': '/src/$1' - }, - snapshotSerializers: [ - 'jest-serializer-vue' - ], - testMatch: [ - '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' - ], - testURL: 'http://localhost/' -} diff --git a/quantdinger_vue/jsconfig.json b/quantdinger_vue/jsconfig.json deleted file mode 100644 index 68fb8a4..0000000 --- a/quantdinger_vue/jsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es6", - "baseUrl": ".", - "paths": { - "@/*": ["src/*"] - } - }, - "exclude": ["node_modules", "dist"], - "include": ["src/**/*"] -} \ No newline at end of file diff --git a/quantdinger_vue/package.json b/quantdinger_vue/package.json deleted file mode 100644 index 95c0190..0000000 --- a/quantdinger_vue/package.json +++ /dev/null @@ -1,83 +0,0 @@ -{ - "name": "vue-antd-pro", - "version": "3.0.4", - "private": true, - "scripts": { - "serve": "vue-cli-service serve --no-lint", - "build": "vue-cli-service build --no-lint", - "test:unit": "vue-cli-service test:unit", - "lint": "vue-cli-service lint", - "build:preview": "vue-cli-service build --no-module --mode preview", - "lint:nofix": "vue-cli-service lint --no-fix", - "lint:js": "eslint src/**/*.js --fix", - "lint:css": "stylelint src/**/*.*ss --fix --custom-syntax postcss-less" - }, - "dependencies": { - "@ant-design-vue/pro-layout": "^1.0.12", - "@antv/data-set": "^0.10.2", - "@iconify/vue2": "^2.1.0", - "ant-design-vue": "^1.7.8", - "axios": "^0.26.1", - "babel-loader": "8", - "codemirror": "^5.65.16", - "core-js": "^3.21.1", - "crypto-js": "^4.2.0", - "echarts": "^6.0.0", - "enquire.js": "^2.1.6", - "klinecharts": "^9.8.0", - "lightweight-charts": "^5.0.8", - "lodash.clonedeep": "^4.5.0", - "lodash.get": "^4.4.2", - "lodash.pick": "^4.4.0", - "md5": "^2.3.0", - "mockjs2": "1.0.8", - "moment": "^2.29.2", - "nprogress": "^0.2.0", - "store": "^2.0.12", - "viser-vue": "^2.4.8", - "vue": "^2.6.14", - "vue-clipboard2": "^0.2.1", - "vue-cropper": "0.4.9", - "vue-i18n": "^8.27.1", - "vue-quill-editor": "^3.0.6", - "vue-router": "^3.5.3", - "vue-svg-component-runtime": "^1.0.1", - "vue-template-compiler": "^2.6.14", - "vuex": "^3.6.2", - "wangeditor": "^3.1.1" - }, - "devDependencies": { - "@ant-design/colors": "^3.2.2", - "@vue/babel-helper-vue-jsx-merge-props": "^1.2.1", - "@vue/cli-plugin-babel": "~5.0.8", - "@vue/cli-plugin-eslint": "~5.0.8", - "@vue/cli-plugin-router": "~5.0.8", - "@vue/cli-plugin-unit-jest": "~5.0.8", - "@vue/cli-plugin-vuex": "~5.0.8", - "@vue/cli-service": "~5.0.8", - "@vue/eslint-config-standard": "^4.0.0", - "@vue/test-utils": "^1.3.0", - "babel-eslint": "^10.1.0", - "babel-plugin-import": "^1.13.3", - "babel-plugin-transform-remove-console": "^6.9.4", - "eslint": "^7.32.0", - "eslint-plugin-html": "^6.2.0", - "eslint-plugin-vue": "^7.20.0", - "file-loader": "^6.2.0", - "git-revision-webpack-plugin": "^3.0.6", - "less": "^3.13.1", - "less-loader": "^5.0.0", - "postcss": "^8.3.5", - "postcss-less": "^6.0.0", - "regenerator-runtime": "^0.13.9", - "stylelint": "^14.8.5", - "stylelint-config-css-modules": "^4.1.0", - "stylelint-config-recess-order": "^3.0.0", - "stylelint-config-recommended": "^7.0.0", - "stylelint-config-standard": "^25.0.0", - "stylelint-order": "^5.0.0", - "vue-svg-icon-loader": "^2.1.1", - "vue-svg-loader": "0.16.0", - "webpack-theme-color-replacer": "^1.3.26" - } -} diff --git a/quantdinger_vue/postcss.config.js b/quantdinger_vue/postcss.config.js deleted file mode 100644 index 961986e..0000000 --- a/quantdinger_vue/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - plugins: { - autoprefixer: {} - } -} diff --git a/quantdinger_vue/public/avatar2.jpg b/quantdinger_vue/public/avatar2.jpg deleted file mode 100644 index 59dc7ffb6a47a43dd81dc165b5f1fa1e842c5702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133769 zcmeFacT`i&_BTE!0YVQ5B0V4=vCt7|Awg8cMid*MB0VU*cOobX(y<~XhzRzE2r9h< zP#^+|BGQ#6NT{Lz2K9OFbHDel^_KPi{xdFDa*{c7W_I77y+@ZnE_VTeT{}#600aR5 zfq%gA@ErFpGD;AvT!Xo)Q$8*>@Ut|0x3g7uw+4bhfC|7}pnbyw{qqX|wB~=0GX6En z<=;p7c)IGYjMUY%-)w86ZfmWiYOiUpq^Y5!p`@*Cqpq~s+TKo6Ym3HadriBQ=a&7R zZvC(6tiAr@p~}`?UiO~ePHwJV@CNYp-)^vR^ZYM2*!~=??5nw>&x&g zhhLwZSC*-4>uGQ8ZExq|<>uh+XYFZk=xFciU1H~I?PBj>Og^Zj>9*`)=j7<*ZS8F4 z=HqE=e=xw^-hT(h+uL1NMa9-v*~#78R@u$dQN`8X&&$@$&fZJq_js?Lm># zCs%trLuW@fPbY7Ri<9kMdpjrV%->6K{k0S~S6{eK`xUa>`@Kp0PpbUaO;W7AD9U!$ z-qtI73|iS^_9=URTW24y6-u4CY47E2?ddJ-;B4>e=uHvZqV#i9t}7Ee$hcU$Iyt}* zw${#$4qg;%_03v#D-#}-aYxe^dgKbF2$(U~tp)oY?`2@^f-b7e9LX|dUJAH{vURt% zGg*1$?-w%qd#Q>)m#S{-{Ga@=b+&eL`Na*SWM!qdPdT~5<+*Qpo z>!7Kot!AUDqhw?6utiDJc8i*l%@%DeU2^S3Nn{YzfMZ`%5JI{R<<$8&zN`d=e{&GB0{A&Gu- zA%0)h2BnmDQEfH^6GL^<;#AxE!j!}E;!k3)SgQ-^KmRrF`v29uf6K`4X@~G0#SN@`Ar$Tm>yY<0bzyq)b&Ik{Ln+AE)Ow|D%9hyb9z z_?z3m1XJDizo_fq1c4HwUcbWbrnBalvYW^{QQ2^F^cK}{w1#RpN`i()At;ov>qC6j zXjMVq2CX@%Z-%QM+K5Q#sq%4fZHU|%Im3q_yzD@Amzub$C30D$KKUTO+b}@<&v8hbI{Yr-rdPojYpMhpsFgiux2~#rt0Am9j|6 zmVvA@jjCtfs`A1`NC_dxG8;-2sNzRt}cjT{I&I|f163{{D$gukv;kw~@Q_RZH?+4~m_p+dQ+*q^eowN`QWv2k{?^|QB8 zfhz3n*cO0wema#HW5|fzve-+{ryS)*U$WHB5cBSCxnzYNo>C9VzYg(h7r5X z_hi2mjIG&}9Ws41x%~;oYB(7Z$j_%4}V=jd4|Y{S?Mbsd;8D zr+J*vEjWnkF&1x5oS>Xozc^GM9DQPBcn5Cmo8hj)cC^#oM^zR^pSHgNk76g=Pd(au zQ7PsI$k1qx7%oy8JbHV}n&cmuCmbuWMz?%x56PHtbUqP}O?j~fB_4tf47S6)+#g9> zN;_jy+}y*Vufl?@9R-D?wE{g5u9J6kG~(W(_@eM9=mb7>ia|JtVg?x zPO)xnh&Ywp@XbEvc$6&9=F85B+V1Z5O4;@=N2_Vg%0C_!JtXYlF0x`r%i^46oes?I2SW%?ToGnx}oGlP)j?Hh)aau^Id>cg$*Okt-Y6@S* zzh6vF_#c#0CH^JAXkLy3Zf@THSL&jsrmm_3)kWvGy1+~ApO;Ww{$HwQII{Mi>qpoD zqu0(=^H$VOQOlF4N&hDd}fyeFz8qP;X z>LQt=w>>*#Zhk4x-M=|4=IT99Z}nNB8#m@&nJ>0{JhG?e!H-N2+&O1l|3|5@q78kT z4i}2A3q1~b(rN8dU+nr}qH{oFjoF4}w9l2Sl+XPl8xo~N>AUmMf(JiLT(9=Hm|X0B zpm5dK>T@9!(K6IiHxwF%ZCSRe)~eXQb)8)m4b|q~)cxp7=ACiA{_PyxkJsl|TvZ)X zB=G!00spHtSTUJ@DfSzgmG8(a+49W}R_+-?^cQu^PhXnEr$#s~=khCu-Ry-=Q2H+)g*u zQxuL)O*)Mn58sF}e)Ep)F!5fCk%Y3Q$WW6R<0c>X*VwCTw(*O-TK;4m$x$A(*U}=4 z-^1KW`~9+ScU))MdJU4zkV015y48njzXp?4Gl{!03%(=hh;Ee`GM00*7uEC+NX)-p%q(aP7g=bm={%$5K{>9r|+iW-93#CHkw=a^KTeHVDN66QMnYxpGgR++E6U>8xw1+VVm_>Z8H4 zhYcofdz@=`1`SW_kL!$SZ4L$ur)%ojm(;FYD_hqu%Oxe=|H8sutLy#xRT;O+-J+{p zdS7v^Uk;D~+O zXJvRc#uFYggNLA2h$?EU?nS9{a_`VEON&j$9hp3^-Gd!|FKpvrX9Iqo_EA|m?E}9$ zN3(IVvswPfc|p`)=LJiFASW`3OrjA%fD%N|g2?h`U<5eW*g4qQI5^ljFc=O_ZUJs? zE-r3iek`xR8evh`qfu;Vc6K&4 z_-hFK9k2af_@G6%$ujr-)y_ zL36X#7Hu6}qix%F81FRMWp?n;;Uh=QEo|-V9ULi6r@XvpAwXZh73(qs4 z1kr+k2RJ~Q%$L~smL95X$gX|9H)8_(7-+tQexfSoBbm)5fVeP4qzZ!!r)$gL&EbUs znBiRg6XXSyUPZ={@N!81)==Ko`t_YA#lAUu8v>ZM}DsQCnXTRfA9nDhVa)7f6YMS zv@eX-AN9yEtOp0KnkgMZN9?S_1%jvdAJsjU`^Z4&{#uO&iQ_+(_YW~NgWTq({My`q6;Z(phZHUV zpLNvrdvn*OJyD(*W{}yrTpg~ZHISAD21x>sa91q=f8ZPg74dnsE}#R&AKvB{kw@edhi1DXD~a4Px(b&bxC zDxmyrE4K!E2#;#FxJZ+x@DhxLkxafyuaN3~#ux=<@s|w!WXgY8H~R<)^BnvZ?G80Usu<0I|Upc09olvAOx~SXOIMFfH%$rF36ye z#(n~iP!P3+T!ciJ^Mfl-Zvld3+QOh{JCLcyBb+tEBxJC8iU!8A=E&$*y#3=e5XXT> z3i`Oges~*y5CcU9g&6&CJgQ~Q(`xr+pgTW>iv>Sd-#creNdC2DfSnWU8t^}a0 z{Ku}*&*4qn;DMKaqWzI?VUJK$_5Ku-jD8|@kR)i^LPmA@3Il9d9TjTls~y_J75YIn z?Txnp-1FWvv|IBS4Z}`DOU^S;%$ms`Bwn{+5;sN)k9ahW(>QWxdLdt=g2>3{%pNK- zOyV@Q01`PUDtdB|#An?Q#trni!Qnnn3KE+>33&U+Xoh55eYH*%I379sF8u8l#hF*j zU}^xp-Tb(rSpo%V`5z4V*A}^K;AvA_>zEcr-o- zGV>iRfEGeQEOVNuf?lmfK$#ujhoI_|(ExgoggFI5byLYG8>%EbkcMVPV6ukBkwBDg z0g{&nN!)=*G%!pko&;HPYz$Ol0-=b4XeHr+44krn#%>*VjmDu`jSU0`bjK+OCyni- z7iskmHy7_=hr*J=@DE=MCZ82-#~tveaf@T3^Hc<8v$nne?$#kUabIYo`h4$0!W@~S z@c7FjE(Pe z5cYN0C#%Y6Fm9=WWzlX9FG)NivFhJc>$j6bkx>kU#0kajA7&AcdhoUF zbC<1GdN@^|-VFQlI8GXuCk7HVV~+z>y2OaYT@=Vb*=96R*GR@pLNlV)L|q*iL`LNjo{>1!gO(ua zd)HDW({$~=QF(bC@6gZ%r8M>p04n6nH!9GUuBNVO@gO0R-d)h@Ob^d8(5BE#utC-$ zl7UdqRki!6A$TN~(VGoU`d3t?Y&om>EaYJa-9-%ZX5Z6YrH-fYeHjct8uogyEz_)u zxN0=+e0PwJ_o4wQxTZT4fmSOJTwkw6v>rWm_O^r_@ zro@+1H!aoZ)@j8)qQtSTtZ!lpq~Cq>q-5>ISq6sj06LD;WEKO(juf8)FP!`t2}ySJ z&xOLs{rgfz>)E8w{$%Js)d`gXTq#IJHjw={9s?Tp)fYD4kWMo0GO*Qgkbj~8wTE?; zu6x7(UeELskI*d@?3D?0F&&h4)FIrSm<&$}YO3VI$4c4PPr`#d-f<2XoR0=6$2XS0 z?6W3`hrIDtTexO$ZT>b@%&mJFi23hbde=2_>U&jM)yW%mm}dOG4~rCZ{uq4(bI-|( zp2OG8RH@i5Q5*z6e0dOZ43%}4DSF=3=- zok?#Z2`h#XqhSOil1cp4hSh2#B+eb2lTaYKbZBU&sks!e1EZLJ3A_qu@P~nrwp`A0 z0J?l>?7foSG>&n@rAq*saP9zTkjda6^aLkJ@?_L>1GH`0{ls1p-}Eqxfuu(i0a+;y zbyGu**9!f zsPUy?Jb$0Mztu@SGW%K+R|>khn0p9uQ*q`J^EPiC(WeP6>OR_lz87jwwZQ0 zNSpL=0V_8~<9*eMHa{*~H1_b;yL~yH@-glPF&syxXnaNJo|1S2oUR2cQs{1*TJOly ztDYL~9N3l$=g62>ETLZP*##?kk+I{1xNMna5WhP!FL~h6jA?(yDKKdh0ByT|s6GP) zcJ{(}1A3$4fI0QX<=R`dKj`k@w1)}4UJw$MP@?t zz?MA`B)*Y)u+dgB5UQd;IuJ(EdZcVk$CeTe?%Y3?{ooSM)x>ABKu7T-8B=E^WS}}+ ztY5NJITn4)-09)hBX2yD+vBHev=1!<$BA{+wPW$r$xdu#%A+WSxS$Kwy+U|Omcc@B zWvJDOJVY`2wTnlt+KZ-+-9f6V$LxIp4GyLho7PE#zc1qJ$PQbrESNKkE13jlHRkDQniycP>PBdh^*#rHxZN7_Zqy5 zOwP|;EEhbs3?457@2M_H+$k^xN^LXhs8Su&)yC4xzyj=Vq6&KpgXX~&GQgPb0y`Q{ zK=)I#h)2RAL}}q?wrtlaMk1TtlU@=9fO>tpcF9ND^3h| z-gcN$9Z)ErTC4aNLY<7|w1B0egYZwo!dYVX#FLv`dC+f>>5!dJDMLH?B)&e4OwRn{FZcJ`d2xWmm#?9<~lcN;zp#J*bwMk6HYgi3%%hTNgoxg;jF z>$yiuDw)H+p(M*Vac@Z#-8eF`y@e7i$!@hQ(m_W5svnvJ5u7 zQycL=KPwI#7dADrVP{h&ZHU8z6r^+P>1&}g@gkH0{V;l4SS&EXRbnxYZ252;id*41o8pbZB9~vqF zyWY%^o!I@X)CzN!27AvqLsJN6n-;qaGR05&l{`&jy<#1kE-MS#IBWa4eIvUE{r!z` z8rF7yToLqciH#=~7-&%#Y0B}&y`H9V;QMuIG=Wy2164EcQ?2yDvmP^{>6ehuzeE=K zZ3HjLl;wk*f*+baLD?LWfpzczB>0U1IAtuY}oal z{gHp;XfD$DMzEB|p^Ww-;oKI`sitEWD`JR|>*ba~vAxgIC1gMtqzxb*RlwaqmvyB3 zk;wh0?G`+Q?c>|O6tsPsvX|V_OTrOYpSyCRUTa$PG!REFBFW#{)=vnBJ;zzi_phbu ze{_415Px0XtTQ}^*g(~F(WshHLyO!jaXu5-Bq2thTA-lvA9Nqb9E;hVxmW7k8{TVA z#)U=;XTz{{R838{s0@Jxb{D0z_Sjr=wog3m@tbYwTc7fK#8oaGMA%9sLKTLR)Xj%b zgfAjI_^5@t6p-W5(-|!uwUKyX^Uer&-!GepHw8&z$t=rCi<>`Mo}WvVE)Hp~U6>%T z5&1_+#KGwr-Gy8_M47g;g1$sN=tXuu!sNvo~8=g;YFmf7d=qIMa4&qd)X2Eg8x20b)4X?Fapvi)=dqX!)k&+9#0OyS-QiWoaxU}R#%K0F0Jc+- z{n{|0qc@LNf%Ud=uNkQIY<&=$U{`8{K*vTG7!Wd>(_z-jOchK`4Ps#K`6EgTz->t4#w!iQ!%;;6q+U!^Mo(+L{RAuS{&k=aNz4f8jZIa*xfb zeLtXIjZ2uK@ls*rin&8$rz>($rJ5sJ7?}0Uy$dDhLuF3}h`7Pnv8NHUa3}Z^eH8jN z)Z^J$piv-&M}Lq16y0|$Snf%@j@HZ;L7ZF1v#{?i$j~J8?ht6;rl2F3o#l;u{>6#` zBkWgb0hXV)bIw91&K1j;S81hJ3N?K7$GA0Qlhk0w-<7 zPB9uMPFp$;kx(0KZlm&R8x-e(CYa+%6bgeb&m1|nKyDCw%oQf}*R-p(>j6RisLwLs z22;d{7f99Ab?2m784M!^*M~=^E~Yyym9qv?f*T+2p1#3>DFg{bkr*=O6JJ?%pa+So zMI0Q@Dgvr;6htDGfs&??(H@QYc$8(p>nJ1Nfq*LDyq=d9XDB8N^8PX|g)}zdzk)18 zEc}j*J7yhK)m6c1lqWsyJdMVtpGe{i(ZxLg8yM)~G(0+nRo!hM<{w)!`0o4=9^Grj zh1Z(N(LYH>+tqkMJR(&@Dohv5y_()pFrkm!Gt8J0zn_t8EJnk6{+;lzcw=pxbnyDI z&X_HGHy1u`;Wusj{(e6MlJnIfaVJ6s(EV;w!Lm%1vu|fMt{Sq~WB2%F{(N1@2t75v zLau|V|20m?GZn^ca%s`M`hGO7L(>!Qa=}C#YFZfZM0Uod&|Ctj916O+!=tXdKB2Fi?<^E&WE7B^YZ0>9koI zT0e0m)hDw>XisZ`Tz9WlVdQhLV$nSD;?1q@&$iaadxR4&0|)+a6D{I*Nxu_DuL zW4(;aD$T7}63#VDu(n?l(0mLofe-R$YH1vCUL>y4VG>tFLdXE33nACWw;D}U6{n;a z(W4XZDX7K2lu>0R{{4;J^DZ6^$+VWTOrE6ic6_P_dUvL2z=y_O&DBE{_J{`Ep*l$! zT(5UkEQPd$^+LY%sjxq>Jlzg}6X~Bm-^Ps!vAQ!CXh8K@XCrkAV`Z zkut~ww60KLaJP~hxV!31PSVhR1Pzk-((2dqYoas<%Sz1|YSW6C*%Z*aNW1TQ`lSOc zBC1O@iLn3KLORvpbdF|@Y zA6KV;nfR!K#(eCd>S)=VmxNiW>`B`%aTI`-OUEN0xjC>fvM!H*WJ}_-)M@-c6<8`7 zKnzPIXJ~A;iIBav>7Ht^vd|0B>?eKRC@OE?JU2KtrVb$_&L1S~zM@9X?Qxaai=-+i$ejz$?R++fD)Q~tzA21b(HznD#_Nni#EM z28i*&tIjs69O0h6MPm(36R0yuNVP^Z=vva97>lo@c`U`{ zEQ7U5AoxsI?^3+i(hL*{*&>+EU!7yH=`>2^qQ8XM1!ZDmrY_n96h1qEnSW@yR8PVk z`B~~owO)Gh$KklaW^)nIQ1uKPejgaP& zy7LTlSw8{lqN>i|GWbBl01XI%U+eSS4%|DXI6_ykuHj~0O<$X*UTHrZNwwwIF&oOcn*j|b539do#$Yw`ME1@0@X$BwIXgRJ#$#D` zIH;;y7H*MI*kcSdRoQjuNml9 zHq_OIHPza%aF_xx$H*8Oiz~MO{AMLWp<-ayWW~ev$h%OwU-6Nc%_D@*P6bcRxAxzO zWiH&(M5es>cWPIu3Op(TI|ApSoe~Cu6An}%2(nqvckTjCRX{U6D+YpAO6ufy*BU#F z=E&@IfF0WNm7*~>BzYur;gu8Ta11oe)^}r85?-W?xQBsm&dCPaw%U!D4^&~#eL=sf zWBUwe>VXGN;;LVHm=L<7l@Qh@j4(68XV=KJi-W6V(ZbM6$j*oS&{w};DR@j~6qIR@s-B>?M(ByL?YMy)qPgm~^d?}xc{5AGimyc}8mB{i({hNxA`JQ;I# zI1H!n!}g$$wcc6oyYk4W+modZ8gIZg2EeSK!+-a5661$& zRga57@2+d9V%CcbR%S7(3$Y;R#Q6tKfm2Ce23n_EKh!tvl;_1fp&LOkfJ8<*ekNBV zP(6cd=a2gP-2C8O6e@49_wBkS2Rdron{}agEth6#*mUOSR5A$tv4?>)=ny7IJn8O4 zNM9WS1;H8)lDJx>Jn=wI5mtAWyhvzVH8g!>l*&q7Kq^K$5B}4ISbbj_e{;EoNXCPz zD0%w?Nr4<(Ht_9`8cTgCouxrnNpn$08p(zMx9!y*s%7#WF!2$}f7)cAf9uT*0;*wOn4I!N2}Nkrjnq~4|eNQu3` z1v(<+rx{vdbi;eQuX4lf40dcOL|o38kX@A?D3{yRtkEnsB4l*VlVU0-5M4YopMpHo5G5wvxmKrgN3HBHK7e1 ztKTO%d7HcD1>OECqBS9lS*&OFQ z%PnM#Qx~xf)l)tyCD*h4Z2nb=e2Ha%r@vTwS#2!+HS9-XJqQuwjnZGgN%@gbuD!hu zFIFa^os9k+Zc479tMHdZg^CSLGs5WaU-Hz1w5i;{MUPrlQw?M`XoaiAy@s(LZWP8D zuo}bG+XAT$Lqm30tJH@1`eaQNkX=U=%78^3MF^%DPRWpwBCi?h0tGn^i-rO;9$nX* zbvN9fS?)SO3XEH7L59=CS&6sWNl%8n9^Cr!X0e&Yzz}-hNa;=-im#Gh&E!av&Oyvm zu8qiI2v@^!Wi3I-zWE@*9;v z-1lMf!I3l-vnNHOjdPpJcb{1X$U3TuV2fk=B)B#k-}(fW`HS$#t#SWjaWLp?^7;(p z+f63JB*8=|x8eNmAr!Qy7FPW6zz*1{@w=S@_D~>E{_~@^=6a}d=oJ9H&mE7@pU|PC z@g~y;N!U_J*!V!!8SbF2dGQ>0S*;Q<=~4Rgkq}89zn}vQ1Y3-g$GlrqMRFLs9pgqi324~hUX(Gn^Uyl{v;XHq! z@SWRQ$+PJ@Z{ZSYJY%QYwpQQa$UG@WUVTV$4>ABW5m&u8=EV2yTbIFTfhM9V6BCg* z@>5&H)^55`Hzamcz;G0go|vx|-&TxcYTdiFTSD>U!xO6;y&K3&8xF!}MK!}1pDzKA zq?a^N`E!IpQ=P#qjgL=b`-jaoC7;9%GDEpawWb?o7D_dd)#)1JXU8V50$)KnR+vQ?cL#$=L2y2rvQPTS}| z!c>36jW;>EeXFJ_Z_o1Q-xLta(ZnUm_f9TsGmR&qqFcMs_%*VZ)bpWz=wkx35_y zU0+Nr!Z?-sBVTV9{o>@uS9#5Nq`H^xs!BndcE!hTCV28$R&*%&NGrZ`P}`dzcsrgJ z>{r&6pi`H=Kn)D&gS{!@z?PHPo1Z2O#NT*RxLas@g=yi z`RdTHCHji@Ei8hy7(RquLlTx&-`_aNr#N!nyViO~--pJ(WYvY4EuKQlHZN#&*L;5760d&`*5#7&kgfgYOWFlG??aW0 zPnj+}d-fz2wa9srf;va9sPNAAAx0OkE3oQ0ddnU&R!if(ZXm$Y-5UC($8B}TGAL5F zow5K&m#_sL&!7|$CEis8&aPyYF-AgD@S)hpJkC6R<7b1`oeP= zFzbK>EPa-DoG+iTI@eyZ;7Q$3Ki1lP?9(!clFk;Jvb;^KuLovC&SFtL*9*hb4~CLe zSmNLbraYc&hgXh&YtXV-C7396o>^5QZnKdVF08B^uRj^)UsUJ?rMP4;(f`KH< z>sc@IV_uIxKD579KAjzeD2;vYJ`(v_Evw=_s~ov^>Il%(YNDy-4j0G{Pr0haz}zE1 z-)WNvr}yy2APU)9Z$!HEBsZYHWOCdy2!1n2B_w=@4%%V2r@=y#E3w13ae~G>Tp~0u zz4v0#z7HA$O)*R6G~SCPQPL9U&lYQB?96h2;Axsl6`#K2_c_;WExikmiDsnLj;ypT zM_&`YcW7KqP?@B0(ko+4O5P7_Tn4C@R%0}FqQLXlT@>;%=z@Q_0k%@=bn!)3gBMmg zUuc+|%H!6eZew!=le;rBYNElg{+iw(qQG%NmZ4JiP{@D+Oy~=v+SadTEYx`txk0Z& zb;i79Idkk~apILS`p(8FDlApIK)8$R1s{ozPJp4geSb1ZkO>=0QZrx~wi+hdmQ9~m zy%cJ39EYW52FGO}L&G>g&Ef|4a#Jl5he$Nu)QK4WJg^X=77g6dGGtVOHf$3M>Xn=) zqq-cSHW5?1{AlQh6trR$b2eT0eR5$QRI5m;0sEMj;N4xIuRQD;jqmsocX!i3Q141h zYzzc(TI$E>yn?SMUb*bNdEhOb0a>yPxUMg_oObQdZBaa5VStO)tL z&~ccQ;m<<`J616jDo*X?NOW<#<>bp$i>|8;E||ex4N82I&!t0vmiGCk=7!2f&8N8O z_7@X0%vN@AxVY8(fu>MMuBBo8j~aGhyO+sRA($F=s=RZQ!+B{db;FCwcx=X$Sv@S* z+H@E#;!zq*xt&X#Zk>b9%b=SixTP|7OYYN_3sduIG>)+Hx~AIM`_B!Rfh!&Qdu*kP zRN=hAEra}Os$i%*%X@61U3M9q`T})~s$Gy4pkHS}Rg8uxa!AD@}X#tn%XzHhr75i|)ddE(9)O2T79l{bik; z?fOwpy-F61yVS2|HJ9?s+P1oO({uKu@+L=v-EI*X{13)lecS|2r1u8q5|g+=Q+zkQ zyoSV=HDo5(vHK1&D;k6?KoLA=chWy_EbQ~!6$7B;6e>A}IiGzx4O{WB_3TN)+lDgZ z{G(7P=E!WVej1&}t~>fB?dS>$1bWz&s;F(xC-0zI%|+d+hi*4zcG>C4#mmVl7M4kJ zgYMDi@vBZbE-D^Ay`3PJhj_3cPJFt;S|agIXT8TdorxSrw>K~`^C7GfoG-977WJX^x|eRB~%-HM6Yy|!KD279J6Uq*R@VQu3v{>l(My7hjr zM&>8HFm``C^Hy?dTq#vTgtmVr9iA0`kgIynB(G>k^df1!HE z_r*TB1pa*(2l_tx6b;LxHjaTEgG|^i2wNgKClA=LE@tYc2Aq5Mq?#lK7?|SqY_PS5 ze`B?xg-YI!^{W zxM=Lp6w@}XKZKwVN*7O|zdZdOW-CNu2V5h@QkcGZUg`w0oey&>Bc&kyh>RH~I z{YMmToPoWM{VMuL?Cx%V?X{<)Ywa?~D5t8+Gd0gWy;4_v-IIb2gN|%EJ|@`Q`lh)N zH{ng%xQ3*$c=+)WfNkj_V_H)D%2jwQ*e6cDe3if}lF}U+#$HO}*+S%ASg$@JvT7Ug zY)m}c~O9~0IMM;$lpLg8*OiU`8>)sJY4DcY~X%AIr#%s5)WL}NI3hY z#?Z~p!A4yn#63dB()Vs}&3|T@9Dc~(cz?S9X5V>YH2Qt%w`*8=q!t7+FzDW8Aoa=V z$`%m|?N#AqE@DxP|Upov&ni8&|g-Bq90&=>0LZEaytpOLAD%MI^%pdO8k&~Jb4W|9f55M zjBR8P0P9Cn(6@c$g*c6Bpf7}hel$YVjgB6y2gYeRa!=UE94sAS02|{RVWP=E+NkPN zM%T+H${FlNEnN&WOeA>DBqr7fg9U-TKp%;Jv~5Q0~sskWYW>87Qb1Zw}7+Qg2bFKc+>Bj|OYz41R)$n^J6( znv>`=>01*iASN8Ui{zP(@`*Uq>SEd<)15AMghTOT_v4+~ z4R~~Wu!892DNbVlgL{w0VM*WWe6{yIAD#B7yovTz#B4yhxr%Pnzp!)(z%pIk!dGMG zu(@2sY>)P0-*p4%tQDD}7YSM&oF7LE5`Hw!9ONgewoflN;GQXdO{fgMvhRR?4 zmOlPgx4bm+zy*wim!P90@hSsSOz_ZP7S|v z=x4Hp?E({TA$&##`zRpJ_}on8Xzb8^<8c~)XZMe&sj1e?7kk~zMCK*b79Z}V**E%gBw>kRa(xVClXFiQk}L znudAkiAO33rm#T7+y5K{|CqNLx*BFb_Tl_#xlKoscFX7L>Kr&jTwBTDK;LX@v;4GH z4MorKQsc=qNv9od|dQV25&<2!$|VZ@OXq0t&RK4_+&K&weuNF zx@eDKv9sT5H9F*OY3ld!PTaAWB?2COP8h~khy^IQIc$-B-fuchdTFS-S7OhVraWik zOqp>)F1o20=f4c9=F;!^u=ii^(aE&*bf4iXYcI|?fJfghOfivnlJ|8I{dzraH|_uh zEwbIRWR1UTt5|()TEX`SO=NgG>|W%*8qi}E<3~1cd*0pjU9OGB_eAfpOJzDz0pVCe z&~Dag-!dz5Nu+GctzF0B>1Rk%@>bZq%VcTG7Y46dpqSme6HLgX9Q}A~&of&YlW?xd zE^aUz)|2*(6-3u{&3=5}>rt{A-A7wzrp#&{;xS&^isxOT^)fmh)xky<2q`Ho?9NL* zzzWM6O5khE`Xbsd$FdH)lu^+~!zwV3ClpKj0xZ0GW;w&t644}UfA8Nq<;~iKI>bhf&7$%HA5H{ZtlCTol1bP9i z?M<#5&>09LBcW@;Sh<_LmH~m7N#nPg_Fro%wP1Eb=gU1LWBxP&1YHBEy$^sgY<&_n zfn5<=iaPxe%7Fjpl{A#VYB5c~2poqswdqdg4_p&<9c_Q*~h-;>;8tb-89j zUWp`lcIF#Z$4b!uE`678wA}Q)#IkMLJX4xTe@f>Cx2Y@ki3_hh{m*IdpMqiJtr$NY z7!SFYJ3K9ZQE2#fpTxK(GTE`ZTOm-rkBm9pEm73$^ej2PLpe-e987ddSV|D1($}Aj zpGr1{&fpBq7WUr0Y4HC6n=M3>fBa|_2H#U{s5-<8A5;Re70N?~4=Yy`H&ac!&p^ET z8W}o9eKL9{EQw?WD?d$?Eh^FGk`>4t^{8FCgtWhDoQ24i8?WV!A2_l1#+P%68NXFXt(5WIbKEmdj-d|sU2!7>|Z zJKq24Qo!pIRrJGTKm1%c6uYh^(bGNC)nD2dK8`DhEy*&L^r0jF-XXoy?ZI;?5#|%O zJD*=eIMgRP0SgZsR6UY=`Sf+c<6;Rn=RVcl5evHl`x&s`2Hg;BNvpN@Q21J);dU%@SL*2$8V=6V@64bZQ_exty+Gpgs0J@M7& zx(chhQ1YJfE52r(3Dh;c=N=}8U3!a0e`zJm&5@CJxroMu2T5?=7s@Z!2#HT@z<6IC z_)xtgh=Ep{u!ap<@AF{E&2A3n1lJ&%4Ua+TkvWuV7Z-B!hrp@$UBI7i05PH?MSw^( z)|OfZ8-P`h;*%K~Msl>Yhbp+^s2!}=XoP;KH12tXd6V%<^7?|j(IN%Kb3U50!zt~6 z0{iuNQDNlki4DwbcsvdokKw|&-um|ldG|IJcNQou9GU+04T@A!H4{O zA^+0{ui`eper%HJ&Gs_m{S_*qx$I^5(1|t8uEL}1R_|B_0Xse{LO`Eh-jwLfjF{NI zE-aD88LDZq$w0aJxpphhT?@gC!=w_}%F^9JYp2ejXdR81vyU3Y^ZQx2|YT5~e&;!A9CUKki)Fp#W@02e0#Sv8wMXD5Q z#YBP8gLb$>^lT82j#7#VTmpN)7G*smWNmFzHH0=EedHSOA3e?ai*yV1QCq} z@Sst~fhw?){GY6KO@-1GQwYODbVeY=WMBY+5|LZbq4DkJy(N7YAIQ-9U9JPlW ziV4!M;wM(xbFS+Q!~P?ouX4mlJi=m&fy$U1xeSKM=$bz1P76R*i+8gCv(KjKPd(E` ziVx`tw{Lxm*)wYwwvNV+rt3x!!(~#m=xy8VdKs~uO;l|a?(+MJm!@#|Mprzl? zMz@#V3wG4DbA#{2QiEZieV1gLCL##eHiWeuVGAvw@!#mGAG`Yh5%=CW({=oZ|QG`%K^{%-0 z_x<+oJNMr6Jm=o$oImy^LXx+v_0Bctm}87}zOvYIukDO5^CoS5ut_)KInHB;{qfVq zbHr@@LmkL7``Ay^HIhr7{oDQCg|)OK|3?X*CSLSy077i8yg8fhwRq$mz`WetCDWMw zJOzqa36R9FD9&U zDfEbK^u)6Gs5)zGBCC)PtYNP{6j4+vE?p}Zpi=g=q>?r?NogkutZAu|>%XD+On{&L z&_l$MSekCI2NG9*RVl~pdCcWVS!u^-Zp*hI-7ws(Qwc{+aCe1?=h~Sc9lJQj8himm zmrp`qh*VA6wQK{y#c%S?Xbb<+lU7O)fb+zEhyofkaVwJ1%*~N)p{JviT7mMb*aTgK}DDa%BEI!1@&a&vRuSJ=l5w}2LMbe-Ci0&;#GLGQU^REjN z0GqDukma?|lgllNj8#Ks1R27W>45>SSu;7g_5B@SF-ST(Na znL?D9U07_kN4x3SGjabUqJb$vJcJGps9eprv{QL7B0aSxA!6j;@`j~SYSt1Q4~IEsOqqk8WE2lGLI z&Ml*^KTyi50d9)|D*BL#TW(eLX-WOZ0*c9xb(GlZR@>9;FZnD@Nr1$b_q=66iIe`G+P>%XW&^qEW;uIz?E z-2NRsPM6ZeAa(2pfvy}^OGA3J_SUM;i%0iY`-fu9$wrVxEsE7Jr%KAT+&v4Ddf&ZWD(n0zC$MeXDV+_q4!iE zO;l(Nt`*)WXOAAvf`MeAo2sG~Md}$m#83rKe7F~UMjDWF*?qpY?uV6-z$7o+0{K%w z0pSSZ;{tcY*nxLlg8HTPw$c|7)6*hIoS z9%%-eTa^J^Q>hX9>CRrS7Bg1#GCl2#Nt(s6FcRpukHv!=PHpd+9r8th@rTNh$Wm6` zstZGj&ty?1FM^psE`JsRD_!t6*~8w(X|E15lSU_w#o~P5Oy1;Lso1Q2J;dO9Qbc2K z6H%woPB>P!xOCKqZ~X-#YX1hwE6*o>_;M%j(zqp3+|>9Jzl5LgV~>=>+kTtS+7C3d zgDTRiZ{N~ZxX1NWbqqsAAeMnN2{KoUTvF@B{=~qvt9ZHX(=H-)e6fejun#W5bmq^S zG#94v!YaG5!MS1w+Zd+WJcPFB^u84Zo+s@_Ut+-S{fq-!z2GO1jR~n$t<+_FDfJs_ z)M?@qUdlO0faE+OUzu?SJ)fxw+QJe=K@vAb)w8la&Tb~&XNGmy2cPiz@xtOx*;Y~( zqKz$L+5^lQTrE)}k8QA&E@~2?M3#%6Xy@;u0oc*cE@CuYWS0xEdSKJx^gZ0BlL>LXk)qS zoKTrsF*O-N;fG#O*ktX4lK7-zr&D=@};!5ye1@ zr=+jcm~Q*n;@#D@u^>&heNBB*G&ENF)tT2EJ7F3hVMk!N8F2e$OGScSwV91O&}HVu z$q?lGXZJyC`#vO18obRV0~!mp$M*$6etxgZQ~|X49v{*I{X2zRj7&MJlkUu_BZ#Yc z9)%MoZXSW4MY!@w2eLM?-;(_%$5PhgU-J^3PN09)#kp`2_jxy$QFFC9{RrT8(}OQ3 za-7Z!lQxdxPb#BJPo87j;F8+x>h4BV?DLWgT&ALKG_mhTTqRmfz8}-h#L%?#b5+d9 zcUgoqL+Zqw8HVyk|Bl;=A`&Z`9FORi=(9}R-b@pcLv^*3VI%njBs74=b#aeZ2R;Zy z>t5(K9uDUtCVN4?tuX<&-;ipTII@|Ru1;L0O^K~~`IB;XQVkTn`Zx-M_s<}kX#xbdz<+!P6*08_@D;*+wpK=4_ zv#p!Ip-@Anwx)##`CYpm+N?#hM_K{dIYeU7DtKk$^eL=?&Npr?ql}m^t;Ra_@^wi^&>AD5*n6#r>O1l0d3A%(XN5 zRsblcly$wn9UGr9PB1rleUXaN73u5`RKRAvbEF-w++lk^ujaYVxX+iRMT_i55@W+k zEB7TZ$FouUF5T1z2Ab7X_k*^xpZ_um{%{oa1+N013T}--pKwUcpe}!L`T5fNgUC;J zo7OCqTz$`DR`ERor4r8Cj-?Xtq)4J84wVs0%Dae2f%;(__=|o zAtq=b>U+RB4fuiSb2{5YIL~1TKvC~$EHiITYnWzZi3G~8y!8wiwgP-B;H{ij0KkP4 z33>gniTENae;#F9eIBcOWH?v@Fypr4l!be=wuk+k@5h_Upj@~4hVjZj4Esc6gbd62 zopLHe>O$4KRCD?YzT=hWZ;%WugbUAP2dX^FOpJYY-7Jsi(5jnCW)&S(nC6rgrKQ#_ z{XlF%3Iq4CZN<59SJEBWpugf^d5wVU)6Y}dpoZVPU88^ z7)XonzdN{{Q8|t7!BJRD)}8!RncdW^`K-y|oy`R`N0I}s3;Ir5f#nHUD5{|6i#TJR*5R{T|*ag%((HLfk-CP4JjmJs^ z*Ps>6RW6`MuTH3CK$~6PA};p-sui`9>%N8Ex_nAF?Ktx({VTdT0;6w1P!@y;)E&(3 z1xEU}u{Lag3ZjF&7A4nSM4 z8uD&wbo8X2pbU~HAmvEOtD236A}K{B%T=l`wMB%P;GC^r`{IL#DN&$?_?#uTs!=^z zsQI&MtSE)!-Az%;4s})PAj4J@Z+X>zSVxMmA5fviKi;c;*#1iaQ2L(}QBSD5iH9|A zi)$Is?!@GK7LxYV)gj9*N(5hDH1xAX;&lkvOa#%(ctE*^11dYopq`z zei|>DwC?Xspj2(aALXw5f;M%aGm1@E zNBVg2XJuhuXaIf-^86*j5hT125}e$Q?#lywhZA{TJ*IV5HKW1)Lpr`8kdgYQFTUwMUd0S$Xgc@+mKEa?I$uq2I% zN@yNBh*VjC|7;7!i9s>OUfBi}{&{f$Z8^mc6PxH0s>8aT5*Qx)FCT9{SL84?<_8^| zN!GI{TZgR_rVLalX2W*6U>t+*r3job0aeyeUg+NZH#y8!@*D6s&0lEmGq*_uIR-mIVpFMB)eJ5x*R z+j){x)!H`!$eRe8Ox=y!%nW%^c1%$9(SbT-LPSLw-0CYN+~gLB+ZGpQ6y17#aWX&*JzzaVL>x3Ku3m%vw0f^DCU&CpA0dQ5>9<}O^{~z>zk7uk0tmTY`=HA2)QE%<86ql7Chqk6!xYC)(BbM% z1kiN{a7;dqoc>T{G^>@vU=b(>W}V4I2f> zB&=s~{fdY3hv3O;_;=jt&biL?AjRMWDaRgS%OpXkg5<`WbknFc*w#y=wqZX8k|3J@RkKyyny39VKAw?gHW~ z@;M}V(TFLjU-E6^SvE>PCJag-z?#}BCvR0ipwX&Ow!0oUetyv`4p&eQ? zJF;LmT^CiQ5k0fb!g7}Rxdt+|PAa=i4ix;Fp#5YM%rJfgrPlAoAZhTR;EX_I5P|^| zf9%lYjVq+eRZp4bSG74gVI{eagWi*j_gY+gHkKfek-rIGC3RZNEDm1k7Xeky=A5C& zG0;i$62$V%yv+XGjVL50^^@IZE_4L}kDftlJX<1CUbO^jnImIU&%Q4PRuUK_Fmw~c zc#dQ+uvC!j^@-zR`2>1*E&0W)63DX^%!C%7?|9Bud0+{INXBbAKZI7M0MI)40syE_ z-~3!@0ldRFdw&Uv`8QcI2- zOU;8d&ABVc7o`m6J9HyD>#EC2BRy(;4P{VK(y&ir&1g#1SJaPDQJ#y=-xJl@o6l?t z>q4WdrhxaSWcrXiE&lR{xdm{fOMlG~^7H_(_1}LWD`Xh{5C>1Cq{y)f`W$7yY(n zik|d@Z5jmn5GWVF;3yKdR8y-S_21AfW{;;mc#X+&rkS5_0e8Iu+X?W4NR6o$pv&+@ zWNDT{7k9o$g)Cxd`~kB5J`cL3xr|4k=7;fO-H;;CLj7%iVSQV4B$cZw8cJ}cVO<%< zbA=vR0v*B@w~5tGNSg#&E5@~gFqU{V;3mLrM7%t84WuIbM$gCWZ_OqyoJ?|Zph=z= z)gEoAqL0hr=e&bgGDDEi=U4A1m9GAJaw4Nlxz#Lvw$ToJ`U;~t%rR9Hyk6* zmbJ{|79>B%2OqluB+KHf%M&9dLwWqZ5khB_#6blftOzCCC|wWoLWzUu8+0cz^;p$Y z)VMr>e#c8Naa!d|USN9g;MTzpNQkA7hDWA3XmHiU0`hA6N(SWOEU5!s{0;f59OT2VeiBa{_GOd+8f0UWj!kO#l*m7h@s!#i+}*AYv6q#!vWaSsV=?=0P(WH0f+r8 zAJ6VCkXRuSAwU4_V#XN;omt&_nq#lUKD>4&uA<%GTWf_p->4pL}(}KDb3#NNs2NR!Lmv9tmTNl^l((j&S^i}BsAe6EA&z|8o zUrpIfbFzO|BpCp=E!9EGL8jd4C6eEkJa70S1Cu50(Kb{TU%@kXY$}hfcr`m?e^j zhOA(01^=%(kAgLifU2PZrCA8S0G(&OAX4xm4luo zDFD|#KKxXN%-Fjc%>F~aGW?`a-cI(~z=g!M^?pW-YA%4U`t#y}9EKvk4oF}cRNRBR zNP2Kq&NVUv5;!s)SC|Fq2t_%UM;4Iz2{2+2pj)plx==R`#ISe>0zMk#2}BMT$V=dd z)ne^QE@Crem06@bBMrT317(L+7(xXj4OOyn0*5Z$8ld-SUyg>ZcnlVi`*x=T3|6=C zd`$LIGA+4n+)AtpNe@@)xT96`!2AvX(_`8!>NmtLdO879TJgR|ZEaY|h~98A{+YHe z9k<2}^eQ`~Y`3Rk4_3w`a-$l}Ca$zfF@?>Y`h|tZGY3)NRr~vXE|-ib`75#Vm6e82 zx~U&qzNSCK_z{0b#T5kTFTmxn4Uu4qgH^JvBxB%iec2uu`o(pzTaeAK-w^0`f7A%x z-GJF*b$V@!_wEuHXdx=H2*C-6I*)df2anSmlHl$1r!ZFSyhC}On=UF zM=z!W^yY2|Xx9|c+b7v~FS{4G<6X`NZ3AL_S}I5JH9cyB`nFjoo;@Pwg!7%95H0|V z{mh2d@&?;{sJmbK?Yc0(lIKoaeYD1%E6%}HP5XK8W-96tJrZs1YADGpHD+jebbgfp z|2#|$##+IdM!ygA4k;TsxkvRVJ7l%yi3G$>j<~lQYxmV=DK+87@&0~zv zVP2)c102P+Jpd27HVKri3V^SsQmhgONkk|UHwdtJiID8|MGU>cIyek#R^S2!i*h&h z^JvEqZB~&kX&8_bkR3BYiO~P2Kmay_mSWsDR>Y)XkKTl3#HayD1DeOXYX(Dutsqc$aeAEZxe~*F_3RBp=oP$yk~?P@uWCiATcw>7 zogY+&7p(>gKc#6Bhn;?v4L0#}NLD&WJDQ$o&fT4G8~kVHJRT0;}MGuyueUa-2AThr6}Ub8kQ#ZzK|0nW2qJ)-BMJ zKOivfcT*e?%)P$jncirE1%}xKM2nURC@C`ovNQ=j0z~%y@rr;aji}^Fu0Xb~5@@(5 zGwHJ`x$W-_lW%a{+oa~Jk?1ML2n4+O~rArf$Ybq)hGuXP|zVblQFxb&(osKr1c5Ca~3 ztO7HPjgLzKl>J;TsK?@*GYSBtcr^@S$6t9U6#)W7ED#-Oq0TI{=y?eB6Ex8Z2nbI; z%1r`dJqzT958ZzHFZa(_egKlwh=_@m4E%=F z)043LjMomS@roko7BfK|jgh;rnp*(^VLy1i*O}$)U0Ny2Q(qcE@fWSm`EJVSbS$xf zo<{vk^p`2&bEgfxAhx1E=xyoV%$GBXbzqM;gTspcQrmXVJpskz%F9H zxYR`{Ens_3n3hNZ3qiINSdZ;GUtkN+rAPMp&E`?!XEK?-!wr} zdd=8QeLG@4QJbIN=4=FK!6BlabB~dRfP7oSHC>2m9+tk96?T`ai9W|~em?5mC(ze8 z0{qo@@p5&FkY+Qaaqt!tfs8rNAql*KK#?DGVblXdgRBJw@QmA70+8F62XJPU!2DVy z-=#XvRRP^}m;GNA4?S7Y?59WZC;d|Mew;J5e;KgOvp)cC5>nw84(8DYL^RhjXJ>)g z;ISgaZ>SIhzy{zMI{~;6X)F@AM%vvxc-1K{nQD5J>SNmZw?JaFb73a9Rl%#Nx?7p2 zg+V--dHYA>*ctKbYHZgPlsEaht&Sq;-c^>D%{GnO9ZDilmoP@_C$AKjt@xSCgabao z>MLY5u!Oy4^-Z+b73l|MYRXiHho8@TqnCtXKk5^96OY`;^Ww_YYXtgI`2ZJpORW`Q z;a}HT<=f6(kI>*;1v&HGL(~DmD^B`eRf*#LI(SF*<4({X_Pzoxp*BVj;q>CL$B(Lw zE`Oowd3Ftwa|taO0emUV^7hSFMV8*kth|38%<%cxDU?AdAlyv6B^HH?wFn1j=6o6@ zZnZTAT?7(!r*vmmbFYWo;j#?-`4o-KqH?T}t%132n4_U;V3l`hZ&3ud`Z!vd2xhT1 zM9+j_y!u&^c|H#~&*f@|8nJ?oJKJE@z+?00MP3{nUR+noX~|_i`Yw^LVXJj}{B&O= z=i#plKq=Ddf#H1dp4joxJKb1YtQ4M=y6S{_oI+r{tatE?>2`Sb)bhlb!{gVey*W_h zDMC#jNO?qLlRb5m9?U(NN9!qOh$VO&Z{2@KDJle`AKrQ$zB5A85?2Kw;B?X?r za>}B&L}}!k7hJk*wIur0$)5VItDqN*MEAMsw?m13-PHH&D)F3I0K|(?(#b3r#=(uv zx(7{rk9WZL3|Y6EyClW(X7(50QuTg6S(xM^0x%)Vxu^Bo_XYOyi2DVwS2;`UT@6Jn ztuO5&mNTqoI#N(`Mri`Gj-D3nU{v0m4cQV4Q^s0MuP_Y#@Vk86!M$?$H{>VFDJiQI zmPFE{?(oxi6&VbIN@$d(jc3>PDS?{vm%K9S5@hW2xtK~I z{smsf4X|x>{;KmR;z8O8fra@m5a3H?j8&cBjuu#LnKGyG6ut+(gd_5-?cjk|Dwrt; z-pCgrCET>jRF$trsse)Js&qPCXFi0Is7F^!6q`w&|?dTjo*CuG*`Ey zxSU*Ml%7Z#*bKi@eAOzpmy1{Xv6j5C1udT@DJhmYmgavbA9gypo=@>=UzX_fcEqmm z{0Tp&$_(_ZAceqcM3WZw*Je8w)$sBP`VoO9`vU1<4TJmsOyBk7k#RgT&g?j&=GGU2 ze{h@rZwO$9;~b>Ki61gCJz2{I?Z6&FEG)oRo;#>gvf$VDS}8EHN&c9o$W^5?ZN`*n z^`$L2pjS&n3a_=vnT+9N4K*4nk$5laW3!PW+W{j2xHgo2>khEr zotk_iR?ogqwP8$W^a4ZIsF<3h`m*WJGQrQ>k2-tuc?`n~oc=|{Fs|afA0ZeH!$Zce z&!-BT%!%vblX}$6+4xx~@Y$R}KTjv5K7&Rq4vfV@hKH_Cwo1Q`^^Rm7{oJJK*{lIVx$bR>aoH3cq(pB^rTqDr2mz6r? zn$bmB&H2Qio=ewcZMBGoW+c$jGT(|U%c8%?8l>t**SmU*y^jaxXhA3I%7`uzbG*v4>AZ(6=3Gah{yr}h)6vFsZ3g)iC7g2v8pZx zoge$#6=kIi`}At3iHD!U65LgA@EIM(10`xsy?i$MVGgPLCj=ZJ(7H9ku!!u_d6jP$e|#M%iKAHaIVyK-EP+I; zM}=ZuP?QT-mdkfgOd0)7CwS#Gb@$EqX!#{wGDh3NUYm1w`h$I-fx$xSkz>j4m_4s= zaevq$&<%JWGf`AOHuo5xQ_7<#ugqJ7TFE;%pRb<;k|p}GTScKV`K5u>i_0rKs&}e9 zt$)${lApse!!}(SP%++SM?I(P{O*(x>FLr7(@vc>IUudKbLZsmns*~!_CW-s3Td-2 z*djoXNI97xIgJFYACI#`!RN747!>Ee(vGvs;}=Ki4?SV8?pmIhb(k09OR;E#FMU>L9TN(fiDJiy_3 zU44Ufg48WYGSPCJuz|zasgKs>t#$**;#|%rLEuF2JU+ zs4l}ntTJs>4`#0d%EIay{sRfnLO+-iVsAm1 z0!rAq_zjp;K%(G`7;qc_hB(M_1OEIccY)3>Nbq*~D-Vcc`eWu@U_e}O`IU8&+Hm7j zEJyug-JJMUOZf6>QdQXXaA{+-@_C2z94`eDL4#ERdTl`+PUL>N9k~CI6GVL^pranna)5zFR*&P>$nu1Ph=fXwhI%<`OjZT?Bn< zY1b$Vf4*~XhmSL~k(vF?ONT6}bm9F0^5;KQ+Lmt4KdBv`NP(0z2AJWPZ8=h-~K$a+R&dPpop>x@p4dbz6V`QCW7nC9997XQS)AVm7 zjSHcxJ!U@#J%+EielS1-j+6A84r|yiJ(|^Z{&-TuTYuxT+L!|J83c|t%etM?Y zt-Qy8qeaCAMCHyLW}pDH)9}*%-KAqf=>d%`qv2hX9vH5Rw*q$kPE^J2bgfq>Kl!Pl z-8B;p`4w>iz^Te6$L+;u)8h|aY9n%jvu{CnqXSf2ij2x$<>a&6924eyW$xL!UBRjX z{3wD>?wb=eL)nDi?xse#92U1Yey8kG;&|!q$C+Rc?atSuj_xbX_|v@TDVpBX*XcFV zYOsymrt%M2k|!`$^D)C318j&dNi6kgRk=P6i|C%8-C6I&i9=$J&(6^_UF z=acSpe_y%Tamj|i?Blm~mAeu53)hT33i==M}{+|Hi5QA zi4!Iz*@2d(d}bEg@k$U_e2|oHIz=@PH?pU$FlI_-x8P-{Eqc0{!jyB@$20+%=iCK8 z{^*Xzf=RHW#f{jKo0~WJ`U{CJuLRq?Al_b*%PSk&4_GfA|0a2t4ho)QZmIH+jgLi(f{jGB(ck=A1k6@7 zw^T+8ww7663ni~BQwBtE4+)Wwx1cTE3vK{A(v=7HEaH}Ugo-$@#oW7jQ9t$o*yvF9 z|JgF**56$La%!VT@$VL$AdHcQ2V@iHzn?ljPXetJvPWc8tt6?S#*KJxs_r{io^weU z;?!5peGu|_gN5}FD%FmTGo)JmO#-d3FJC#ppUUcQJlrDpCB)qWgMdZgj68vX(nUa* zCsVp`H#iA%B5?-L?X8zao@H>9m^^eut&`ZHMaOUKGUl3}VPF@VppWX&&c7;Lw(mm* z#{`t{&5#W#V~u9IbWQegxz2Nzm+N?dT`{08?{Vsgw2yfLK%eiIUqVqKL2obl=hH~ig%+*9MWG@mRBMrmr)>EO%{0 zc45xba7fd&AGVHax^3l$0E>B-8NSxWP47fhf)!c1mKCZ5!U|<$&s16WIa25Z4zzkgY!bwvHA7Fhes~-b=_HX}}h50Dy&{ zn56;>%Rk-jVQd%98bV?fT!yE5)(Sd4%iQcwQT)6Ei56J0`V@?pmz^+Kdr%7Mk+6ij~n|AD}=Lh<0$0o z;okve2-tRs1a-QH8XGRhS@ju;l>&}{m_bF4Y?v6ATeZTBt$9n#X9tIRVD_IEieaMdry5sZlqtNm( z58g2TOSd^Hq+zQoaUJMpl`GudCroRTM4*cnf^u79819_O8{t2I{N*9yO5!I?JwOE< z#IOa^D_?e7Et)p4OLLxBja@2^9P!{veAmJcC$wPDKQp(OVOu<)V{g58k(5iaoO-fT zp4k{2r2f3pAe^d}h*D?h0*-5^Ya&PNXbSObZ{2}oONnI6R0z)-D z)|Vn)&0Gsr2w`993iR8!Hsc+UjQ|cjX4ha_7jk6hu61n~NW?iKnmE>_eCaw&wCfJx zS%`T++jVGs7jrYUkChrN95Omn1T4J12i$t0P?*;$(H!1o8zLtkQ{Q(O3r-^oo+y*Dx*K+pFThqjaQQA}kSmEJ<=Z?;sc{sq-+cbrsvsZ@omyfAKF@l0RFo2S zaH9tRp?ZlIFUi>oH2gIh&zi~^ga*oK#>d!{tJj6)(PCi5++8M|xhR15^Ydee8cM1j zV>1iBE6=0)fj;c{QtED|M6>T1;}GVth7Ff>fS{y_e<+FL49g?-xOT8yC>ccW zHD;ug$JU&19q4Nrd7-s4l4&c{U2u4+ZA1dnpvmU*mm|IaymAv z_PJkzTPNiA0d$~rr5(WBypn-eWh7qktz#~IpHMA@Y=dFgnHs-e{1MhRjaMv+=yR+{ zL26=kL8(KEdUoNJ-Oo!wtFhFrV;0-kb!xnd)RrabzSlIvnfXTc^@L?7t`m1`(8}HM z3hi?bCy$RF4Fo-kiPmgZbll$K%6#a)k@ z!*Ho*+Pz%7I;5pLK&8?`CV{C1eO9F&sNtJZY9&Hzw+_9sgd|mQcoS!r^P_GiyU3o%utl`;+*S``drYfb0FQMZAR07Ru21ym7L=U95gC z+>m>+8_`zBa)`9&KAIYc)k6ACt*IeaE;}>&xGLtij_=ywm1|Gn2oIcFXHmDH*AjqX z?W%Z{V)tE)jz#w;pIrlrNY#F5me2JEhP`iECSLUZjSOi1S6j@j@?=7y`Qc3hLmTS} zKCoDM@qL$ePpIZaf)1m_xUq0_E2p0x^)<<^yenLcdYfEvkav}8B~@os^o*o>0*Tpn zUyx#~iGkJ75P2MMQP`mu-zFLWec`>WugL4iiSZh2{^HvNI?2WppLJ9oWQvKgcx~S6M;2vIvK>Q zhe-BG-JQ8GAbsGVS>bS7TTb9n1bvW+?HYd&FJ7voI=J{7#g5b!Ia&W;fIQK6>iJfc zzP3EbOdzqKKY;+-^Z+<+%giMI9F}cp)SXw@V1``?x)}|*L=`bUe){Zu!|m2b8tBN? zx;$yvXObTuLxnd=Izp8M%sKQDl?!;36~izmysY-rUnYYkjrZ)18*tuWF0bl;9{=&< z5mD#4WJi4s$sKjnZYvMl zC$GB=hy`y23wsifkH3c+`&xxh%SGcx9C8W_uPTNjfs757>lNqsuH`Judz<1~Bq~*= zS^Qk48(2(+^3pxnXZREpfN2i$yNQ-ZQZ=-@MWDYOXcQ2INAm>(xa~RQP!A-33ZRE1 zfwtnwPUnmVosp-`l?2+}k8kqMG5RIkf;y|hFLNZwPACP^ba6)v;}x+;QpEO|GqgPt z2eS+lV>r0!5*6;S$9~)jv2Iof8H}xgZYqty1Gcc1&#&cY!1f_Ms@IoN%WtRgrN#!c zR1j!2p``9G0Kdhj-9J*{a%>)tkd$*Pa6?vX zn`JdsLx7p_v*@Dm1MW+QB`_fQJ;pt~ggK$cpA{_#57jol)t_7QM5`<&vOB&u><4&W zi~0al`()qtIIj)oYao08b;>1z6{Koe4-6u;mVKrSIqv9HYy&b@>FZ#-s`yi1+YFX5 zoDpT5n^fO0n;RT~J>LPxqP zEUEbGAvz9EtumHQG59WTzH(1GWfMK;8}Ef`$|G`et3&QrRd?7vXcK6#?+A3mmOqbQ zUU&q8UK|JI-PRwNqYg<$Ti0SIf6c;Jo6kL4QA`p^Yz85U$3rgQ0RfJs_`=sYiK?PlNXDPPiI@E*Z z&Brd#YSN6b)6+uQUyk#y0^+u{kFWcn93|&_^I$ZXxCMRvGOdp$+$HMPmN85nQkR9Q z-6~Rf@w^qax6#{kn6U)5MeuvR_i8P@}@cT zeWx#oraymY#FxODWij}4FD8CITWuV#n$hj)gjVaF>f4CXS{9xH{hfCz+5!&(0o~;( z2tnjk&IS+pfO&B8U!@2os7uI|$zSBC|GpRk_Ygsf7X>fAEtOsUw&eYG?A9mQ8Ur3{ zz6Bh79vOvxe=t|GW=i5ec=@f}=3UCi8ebKr1bUUIE-sKk$Q-0J-ybb2A6Oe1Z5pwP zzJBggAdPY~l&mD&12tGybW@(goWb)AL^>%8&Omb0S_JCFCJvg)Lw3kdZdVH^&nP5+ z3ac!@2wA?;utMC_MgfL1heD7dwvEeG!{-NvP0ri6pBVNn0-zH^OUH*U6-YS36KC=P zYfzu+vtp+Ct7l*QnCgRz0626SNq?W8Qe2)Fe+EN4r`-i|63TYBqw#l6ng?$WYkowz$rX~J~Jf)gG{04ISw!?;*?ir2u5 zTmNhB+RqpB4`dTs@En8}ohrHt?#BDT|GF0KmN)x=+W@G*qoI6$Mhqu#MBTsO2KERn z1+$2t1geCnIh%He~d}*(%d!?<1draDzEQKt4ZY58&wD7oae)*KdAh zzb}_9?W>iLi*r}}4Kd9FoL1!u{l8+wU(`OZ>2CMmcqjSCSpsF}zmlQZkxs~c zTz(Z5v2SNL`@{QEpV(++%xt>iMzHQ5_-|)^8c`qUuk9;Zqc~&O*CRC-dU6WGx&HyR zIt#`nUdKiHxUy6W@k*WpfAsZ-yGMPQVc47Kip=11fdm68(Q%N` z!~M?qdp3AJt|K7Y%3gU*v|Kq8%!E0b3L3#Ih-fHuw_Y3f0G3n{3S5YeN)KF3y*K9{ z4+0U#mfz>Q@Az5x=+QBxw0(8xHcw+HjkR((7Xu`(*ruzx4P>P^L#NmbIT9}+s~TT+ zQ{|@KR`g2J-B7mT29^|JF&lI7`mcs88N$wO&DW8-sjW*s;u?#B#v=eQ^#~C)_*IK= zMA}3(0WOB*jI9LxEN8lVHL?68qlW=+OJ2GR{PqST`Rl^2~}Qcprn?g(~y-&KatQh=vlu`hd&S@MBf@Ynur zcQ2*&a0gt}O_rhTn%@uskZb)*%0j=4EBR|#hSKz((`3JYog2?c1%Y7rALEB8{KqfA z_MDggMWg>$$@Y&F>^doW#_C3D87&82_>uWa08$~;)Z|7^sxPty`KqlMC{nx#V`!b5#V^sGG^z-wxntSwtf0o>@I%>FZs(c z(lPH-Pz`Xc&0Fd-`hK=$Rz(ePzN|{zc~W~iPW|))Aa)zS2_ruo&>Npt`xL*H6Cj=< z(3QRC6%xHWg1)Z2EYR- zC_O>=w}9iTVvSX7;qyi!ugwJHQ@rbuC14&;UIf|hfXHO@ICJ6YqHFa8oKdcwe zPc}aO&&TV(uv7AY!2gGF{O|7vENrmBHC!NEDbgz3r&lYN>NeK}A>?_0+pdc-?bEMn z6u;?STw6@e-m$Yhs|J+zoNrX|dWeUlge}*BLY|}&72Q7lYaRRsaQavksZYs3jl9lq zV`@8QBR1|rV@8JH(jqKHbN`4W8kjfE+$gJ7PdDOc_*Bt=0?yvIHD{|W;%TVyyoh+k zZmL(p($BF(u+w%mLygm{D~>`I7EVK;9Zm_&kBj*Hx{~`DUb5$naCQK_+XR3%*a!S# z<>2%erFK2(fwi6KM2%DOT=F}><2c{8e+;xtN(@DGzrOyJ@HuEoCBYFa`sEP;V$%*g zroDq|Uq!uLxrH>X_v>3!fST&kYD7Jn)&8!5iCL>tu5sH-DbF2`ux~8r0zhjIVn4`I zMq5P>Z!V7)$gy2hy=azrx{kO6ZPd|&4IQ&iBKF|w#qZq3dz)F;S^dF=lhZgj;qN8! zztZ)8JRtx0r8L010Ws?z!Slb55cn7Q@8CZWaoMWAgylN8?fA8%SqD71|C#QLYC1El z)d5XigM2xct#Pu~61HsZLnOh=0bU`xzU9>2ZfW~w$#tHP!k36_6M<~xeva{96&fKu z(M4*$Yh8PQ7aTkM!v5;>GBQ&5(z`G0h^uH`9L2r5_i0flB4cj!a{9f$ln0gtX=ode z|Fut-=s&?~8k)@RJjgzHfCqG?aGOCZ%kK^uxBOqWO?2x~#_S1=YkwXWEQ`#l7XJ2r zr-Hz6Ahl&x5~@;uc($g}#Fek~8sEZY8OU2vuHJ=u=v?3%r7`Wa51;omXG6eVyFE2b zQ*o@}eV$yh2rf>{^VWTuS&(ISgIh$Ful<#PfP3+u0qVcsHVQmYX8up#MgB|%IgpXb znB*mmn!FJt>))x(Nl;{w!`#aM>p}l9dgNjJYpb9CI`Tix_#ZF-ee$ROJi-sjhDm=B z^Zv&t`oF&G-=F&TgAEvcWD(`x9|CH{Ki5KLKK<+I2TWN*5C;CWTQ*t8@OQ)}zx?+% zf;$0zFa78L;PT1$8hm6K^Vg)kMV4}tPjZVu$+ZAbXfkdGW+dYGHwdCyu=jGh13{25 z_-SQ%$Hg6Df{x-L=p`io*bQze>1rWr=WOe4ZDnWe>?!Ik1>QS=d^O+PhlY+JWEMxVSr6cv_MF>E>sUD3*;spc=Gc08Sz20qc-+sivUIVs_TjR0w6JqBu(Nfx z@bq%G2B+j_1*%*)+bk^DkY+FHi)j-;i9 zh`6=1wTQHof|Q87{2fUV84GJGX<0cb8Ea{)KOYhG_}38}tbJS^Ex^&h^?Cg{IM2WT z#`EX=|2{L;|2VV1ug%)(|Kv%rS$KF@yOYmd6ldXqv$nc^Ra+F?eoNe+voihv<5vCq z5FUTsI`RmDxghE-`Okajqx#ng@OZh~@%%XhYb!;be;ohM4EulnuD|c{|Kx&h|Kkh) zm&g7;Pl9~nqF|a@{I}~-`Cqx7e}C1#Ce6Q(_2&RuaL`Uv|txhmS(St-iPTguto5f>McSCEnv zk+v3B5V5e4yCWhmAuS^zCoW?pD<%7%&-I__r~3bGv@9(gZEZYo7LqcuR^(H^$)l?D zb`6&(xl$vr@qe-R9$-y1Yuji-0trY7Rge}SQUybiUJ^vQbWjl~hAO@H4gyLCY0|5p zfFKCc1Vozj-kZ{U?|9<-zWd#KfBXB-f6jl-f1T?(m&riZWUb6RbIL_$4GIP} z=Sv)2-GN>OavuvPb1YZcU=hy#Lmq*DLFKo1c~(lFu^x>r4M^(?5?a|B%hr z&cwz9OXfxnM%E@yCJv6DE&u5y9R2?+5%>SBMF0E=*0KCm6anoNohNM!J@wh7Du{!q z$=gM-oyR#}nxTo1+;MKo&)CH;0Pp@P3;X}LEPq?vucCPUDoWln6E}>Nv*Rz4^3TRP z86yWL3R5c+8#5qv(|K%qQ%&@iNVB}=$VDQVJ zKmSoSv%BU-PI78muC@+lJQ!OWC#<_Ra&|K3`Bk9?4vr>B9_;(4#ouo3|IDKri8XyCe8UjQ}TaW)n6L^{$MOf1obnQ$fEfrl>7LhoS&haVAS_d1}oemfi78;f2Pav zKTG#-4gV`yY3U6;!EP?q+wawH)ezOzr5%e!GQUB)u(1|L+=Rj@Wh`R=$6$ z6u*DbdH{g$@-O}U)7JPfj{m8@e`^d@f%&?BDeyqhBS=#=kd>M#;1Ng&835u(2H?^WOstAB6`p3yI%DNCMG(TX97@bEdG%RfIR0s;xK>lG{V-au00fwaLO zLed8&Pw)Pt^@nAQyJ%h_7)_VMyX%Q367UmV>j2odt&X8WR84H+bYY z+L}m)>qLBaki5M7d`PUF2^f`3Qv=puFg?Q&ictSo<|hNp@pIkdt*lD|d>`OAWM z5lH4=mw*Uq|H=^lOAh#5Wd*o}4g9aGkdKh$co1x%dL(dwc+fu%KtKpc8UWUzcWdKR zBk|q>w^JOx&2{m7xjC4_A~BpV%|EWpfiKOAgev9Td9@Proo8nvCFdQGU<+qF%z$v1 zyOxJ4MQA0*zZdD>g(SoZK~D|@{siM70Z7JQF%~d2lFE-lm(kL6Fn;+xI?y|n(DTVx zMotzzS+hQE;ko3Ruy9uU3Qv4$w5cuyS#Gj{$!Bk+1PJMEoTeNqw zt)Jez&wm&9=|_wM+; zZ-CN>gQ;hw_g`{{zXoLR4+gH+bFV(k7rGv|ouzNqLUK3Pr9&I8fHzxqBO;~hI?fGm zkcXEsV~zUr%&Rp2rwvnup$c1#{THm2v=QVTmMRNKxtW8=A=2~f;_UANypTgP)rF@$j~G&dum26jFI`yd0r9$3qH`j_QcTtv5Yg{cLI zGQ2Su2>8i9d>I%0Uywse{X>C4gm@aZwod;`=EBR%hZMn@i^yN*f{hCQ5yhIz|C^>6 z0A&7G`GL6D9TtHk0Av7=0OywqG*OX#DNt)l>gusPiOk*o`s~ahA#@Cv|NO;9z@CZU zGCDP-W!{jo4ZOl`dDu2FL-2z6>}x^J5dr%Z1iJ#vH+**!cjAXB@!|=$Z$BNTdf4^i zO=72fG|r=SsNizx?L3Kd-?(kpvW688;S&l5nd@ri^QUHo*A)&w-|sv>s`JmvFqWTx z2=&l=>w!Lh{#+E8wUzHM1J9mrexrUTEj;n9gA?B=`RmtbwT~``#vUlQ7jI|TGX`5R zE|1ag)N}q2Fb!=;CV%f;HfvDOXLSOrwl^mEg7gopy=I@a5D2ke3R@S>F6kyerfdNUBlhwxfQ6Nc>F2G8I9=fJ*s^@Rc^=FE_WFl>Ll~*!Y`x^mO8BM-&l^{; zigZgI)yHaXG_zJ}I)iefUJ9A7_HNLtlle#KXoU zKa}(+*eY9f$a}8ut4Gd;j}CeP`Ye+8^5S_DlA2hTnegdvELZ8;3C<03kY(gH+rIc} z{k;~S<7dDNH|-LmFwR=f)r?EEpXqusPd`ovu&wrI{c6oV;;i^bTlV+oZv=iL@Ed{O z2>eFiHv+#A_>I7C1b!p%8-d>l{6^q60>2UXjlgdNek1T3f!_%HM&LIBzY+M2z;6V8 zBk&u6-w6Ch;5P!l5%`V3Zv=iL@Ed{O2>eFiHv+#A_>I8-UlI7Z4j5Hb!y(0%5Bu!d z+1J0GA^HEfxJM6BS$isenk-~R(T=dl<7)ZHA{5EYqQy~&UU8_XYH{NmKkCkf47$B- z%My8h?|Pa-`gbV#pE?B0Bksm# zm+w+t7m(4!G~c}EIB-W+D=;qS!-9!ZP&}KUwy|^YD{ShNz<fxpjn0`Dd`=#<$#QnTj5RJqn$4Jof{SF8({Sna6^-VNU~*v} zq2_BXT#RUB;uyHVf;t@$GCItK@ zSrFV@0g5l5|7ZQi{!ts)47fZ-<2jV;$V7$Md0=IgclcDfMeTemeD7JE*Yry6w?i_U z3BRnBCneSwA94n6uL#KBoSnW#JcsWXuE3Gn`-ol?{@Eo@YIyJ`z`RJczQh3vYUeUN z4N6^^lz1QD%%yFAy!P35=7N$8pJvK<--K`5Y1tUXPtNf91vIHuCN6a&7oT@sj1}FK z;V*CWp$1?m>zV5^d1dZ8F)3+6MC*cbG&bDIP#|Ms52rtyrv>?W9-`7JP=UL5(SWPh z1)szl0m>$<8TGVR<~KVLJzqq|a^7^1v9NIj@`B|O)Wloo0npEI;0T73N7igKLQP9bZYmL-> z?ZoPP$FBQcQ@^@jL@s6@9VcCt=PH}u3pf&f0Q{?tu@x_Z)y%&5Y&C(K?5IVuSeS@R zZV<5=_ES+U2#BrOc$*+NDZ4a|Iy+W5@}M|>XfQ}Vet?}Wi(MH`CX@9q`hu;|e+xk9 z-=~AE_4guZ!27~Z*BEurDm4kk1JA`S`b@a=G_px5+!&r{zp_>ap0oBQKkVnG`7lDa2A>g(q5vRjYS%tPaKapugR#}Hkp{AxD*B~JzNees? zCEMp;!O#a(s#?mBX8GYCenIBd$|@Kgy_q`Ca}FjW@_&CZu$neB32`icf;imrH+8)r z8p33EkNksnST~7sPK{e3GFWDFgGbw~Sq3YdXdFv%L zSpa1Bii6M*BW9%Brq{lCmOG!?43<-Fv7VO4XJZzNO=2V;P?f16&O9{&hSHmrKa4~C zP|g?Iis6&vXa)lo16-T&nYEr98@q6_yh#n^XU7LwNynKIwxy`1RfRW;lCoL%fxo>B zN}g~bFks|JWe->R5fn1f<10XDDj3XA8+cNf#LVVBkRg8&t%M_%RyVAuy{2(aNodxu zp4=+w$<*L^>K6#_mW%%?+a57dYCfg$j`elZ-r9TBS@?G;;?VH)Wr()M zZAmU7TrAQ@uWa%nCFq!NJ4tI`zu4jbS`dgPU-RRD!!s4K{(}eqrbT8oK0oD~P!wDF z$5LmNpulaZW7&0Ddv~1=q3OEb0ffO{4>@Hj7+fPG9-dV>7bV4xq(|r!`vLbav~u?j z`9zxmM|+GNDl+s<;~>PvJpF=dHZD#3q`SP8pm0V&0vdu@iOU5@%HzfI@rNJCAM8>0 zbj*dfBE{n(CsU2U-h+Hev^Mt9p)q0yjWRu_hwM}`GSR8z{_k5?xRWkjHH5{Sq7cw! z^Yr&I5XP>26v&)(81Gs*zGNt^ikVMs<`Lo)Ze?ev+C(cWc@H2NyN8aJ)?!G%1;(SekjvNOY}#~(Pc)DbwRgM z!z0t8S-`EQliA^Og$(sM3>JIofrISKGQ@%J$JvwH4^=Rwu_&2Scy*4ePAF_n#yhs0 z>UgNA(Wz`Yt*ZN}5UY4uL@a;|e;Ti?q5YwfXHEQ#83Xs%=(Tc}W2f~w&(h0*fO#nU zKmEm@j)UTFefgJz8&5Q)!7%LKzthX#Y=a|~9|VU5TRXZ;Jha8GiPi`&)yd)bsE@iv z>*#gdo-6Wrw5H!&NckIN>xaKIX|QX0(SY2stm}RWfGilt*S*SL^IjHY=t#Yb_Vu zg%%6rX&zXcJ7TTd0Y;eRG7| zJSjD5@FY_PATh{$BF%z_IAw*#KzfY0wuUd}Fab__}GFIb# zRW(^P0Gj96FXD)u#R~&pcIt5~i)aR<>wy})`ea=sKF0S1u^f9r_`1|-O zz{oT;Fb052?q3GL*NAeH_pg@!0YrL436QSi@FmT5!D+%o#0mx3*zp`4Dv|<&;R6b@ z39cJq#7RgJH9riPv`PW3KXR5scVkEY%g`2;&MO^lb4NNl@dW&Fkqnj2yz4b_mtUx_ zOz`XpMrL+jK`rY?8Dk#E|JR1zzv$_or)U%e;IJUL{QrPE@kN@7V^N@*0{bWN9Eo+C zgM|-0Ul+ZaM(lk=_Qzj;P*oziNDlg}x$@3Gkday`sk%v6L##1rBS6d=iEXKnkJ{sZ z$`tiQgs#${a@ZJ`Qf*{ZeV2`oPTEotdrBRVNkL>`V5jw^7*sO8^R4kpylh7;t=UvbfIC3j4)Gsum)dP(>&gM_=h#72OwtWHaQ=kc3hcfIk#AB(gqU#uTVEZ#6$@`Mq*cg)#qNA^dYTNQXEK z-jNter4tyxCfPl@{9NhP(YK(_b3}_nIjD8j$7VrVcaG=a2C7bq64e44al_o z5Hu5_V3?zWy_l1HU^IUpN3GAMpG!~<4TC)t0MFoG$(-ZE&<`8bi5;LAYXagu13z61 zJ%%SCF?N)iF;(vl)%Z|7UX7^8IoTD^?rFY?ESb{}P&qE(N7{D|Qe-X|hScE-s}5A0 zPvgnYDVfzMue9)6-r7Germa2&)3An7Z&fk~?vg)ui^NTnenW@KqqDsvZiyRxhSqUg?;rSI0ZwU}LH5zsmJtY*a-2;M%KAYRLZwJioh`w5b@YRM)bB9_Tu-M)y@n*bGENwblnXh-> zHht;*aNx4wvgZ?T_m2U)`Q5F+(Mh?BKKp3wkD;I{Hsv7is!)toy3xYt)b&2 zNd%YqHe+vW7&tj?#{)jbF=Qcu)(A#fkS~c+CY9Hkd_x$0cgg(p*X_rj zcO-xOhhiJ1Xj}ofyb8=;np{59{Ff!(``cUm+d=VG$s?5PwiuvLf93@b#cI|I2jASSSi0-*ujgM>%;F( zSSJFlEn=H|oqAlgt_Eq|)90&3>up}$J_+Ogi^TIk-rmHs_EZdT_k~_=&+y(v3Fc6mr(5l)5hJxnu z=;cqZ6k?KSTjqSsVe*pO7HIm0n|y@JG+Rk9v~b7z#XSFRU?3BiSP-6;xs^M%xwjHx zWqK_n#UA_Ax@KfUVdHoW-}0EDh2Qh(l2BMgWfeN~$5y ze=RH=7?JB^0dRlrBY(Y4+S^59e^^ySD!(s#!}T;%1^&&{tVio{0~=#Natv+bl#4nJ zvl?qe)1v=SVd?^W6B^h}G+T35LRJMvn(Ajytu7V_zF<-|B*SM#2G9peNwx#fVDC~y zXv|VBAD*OV^F#l>^vO(G;m{c-rYiUSX=2#eEUhzYn-33$@^ggK%(!TrS3^c~^X2M8 zBg+HE;jKFXaADiDdYC*29JiEYW9+PCg>I7%A`OhRj#rp+NgL`S!#D`-tEGmxuK9^| zF$P3_aRk`B_riRwVS}tbKR2j1sh4uo%moj<^W@DzTwUwbXLB1av3D!RgtOv#pT*2 z&Y#Wd)C}Jtc+N3s{sm$xU{rji*kLCWa+X2y>D8zE`H4sy{n^SNO+#1LYInB$b9SDm zE{$ng-}0GQ$~vB1T6WnR$IEGCAb+&loOVos_hbg;Xbnu!>OK1GcE#{Ea~DFknkr(^ z>#ZFQzb8s@H5h`T?en=NzhFxWC8_G0pnFR6trc=CxAx#pbJ;P=Vv&+#JDUT3=#Z`Gr|XGeGIRu@UmF zYWx8@;X|GEL(9vFm>tf2=MtEVA%NswOj!f*3uj~cz^ET;#%kDx>%RmXf?o{gpM_`! zyD0Dl1_AB^p``!GaM*7iUP_;6rfBI&NmOlL z3%lfSODK8Oq?2;5Sh{nfUSs0D@6datkd}m~dy~*OdQbP;+}=Fv`@1%Qw%w9FU$-N_ z4wLMlJ5I!ut7<>Jb@dvNoS9&XLXK7+?}3mt5*ehchpX2t~85JS6!+iRv3;lYF9PGkl^MQu)khAOeqfyWRQ2sV`B&r?+kvZXG^}4xIza>cv~N zOGsZ_Bk4+AVv;QNgK0*K{F_#~29&dE;*}{An|RRl2aGR>sDf>n=hlx#KNfoDPDK@NgHmg~6lbqMmT>I4>8Yxm%V7u(mXp7hs+d^3l$$71a{8lL#b zZGSEgcoo=?I<}6obcd=ccVDCecM&gRox6>fp?K<6Ddgl+D;?`2+2`5k-vkXO4DRdr zkCAT+&8c|?psZX_Y`N%Dp4&|Z@;o<2h&XRtil)%dvmCu*&BO6+;F}FSDfwD3Ju%yt zXOFR$-3n~0)rmkI!90bHaNC8uV4`t*8pL8g<}B0Pu_&>an!8!NP+GtBuq}sFq7JxI zXEZZ!dU_EzFE6dCUZxp&CtP+nD6^?mSMpg7iX3h|EJNjw$KrJneXsT?a!%3Sf4@Vv z)fJ$^d&0_8jYr}H{I=t(5R^|Si`~TXrU-n&^@1D#47>@ZQ*jM?{$zQrh;%#rdsi-) zI)HaZ(wyT8LBFVsYG+lkA0`v;20Z2V>6 z7qx8UokIKPp%=v=BY-J-nE^qvHplRPQ)-bP+^>;5np(k7g&!Vie* z@yv@f;swaSa-q!jgZ(&7Qp>0CSbQ?V)SwB^w-x8S4?Dr43?x{ z>F(y)HN;=a={Mw=n05f_I@~WuDok3ApnOq$P(&5IhxGgmr`vkI-E!q%wO0SIvpu)B z`%+b=x7?&_bem(pLll)b)*9+Y2Awn?DD^$Lb<6UzwcYGR84RYxj#ORI@ZMl&_Bmn^CF$s=0bg& zVIwNl^X&d$k-&exyv@j6ue1L}?{=D=Ra%vTR<>4h85UdUC5lV&tIeZFBO`FXw}-`(V>#N?aVIZxmTS@qjzDKc95MqNw` zBs$6025hVHN_Xl#$cVVsrN^ZvY^2Bn{Vr(_GgdOF1Zr&UDQqXs*~0wXgQ_l#bgl2;F+iVC9DJ!SyD$)_IVnQpql`Rv{5m%`CU%m#$wgidZ&_ zZ{nX;Hl#~FRG2kafx+Q8TOs&I@p4?maE$SDA<$?!w0hZI7}9~7Z-K#~VcLwTuDylw z_)Q{c&w?3YQk6Q{roq#91@}t!S`pD=&JT`+Op_^|rFxH2(EK+e0DVCOd;ux<0Oauq zwg2cyGs4kv9rfvYq1D^qDiOb35?n8AbtCee~x*nT1Sv40E zpl2^Ku4rfI)SCj8k?A6A-h&LJEKiuOTxoX!} zkMTr0g5w}}b|LV3Cb2#>7|8SHdxrW2DK7+kq}d;2mnVLiZ9hAs)8_Mr6LR-1S}I1< z@>Ev=fj>owie)=pi%UcJLQlYy={pPj6-hC;1{O8lN2&9Nirbb#KkSzvom6aT*>^)@ zGVW;yweoq$$MHHal)6%Sas7>6sdWnm#fX!`lM+*K zwGF0+;>}2*t!B#0nKqRT_S<)U0tmOwMTP|wH|z6+bN6U9`TAClf-xu!p9Y5O)!q_*2@ zM;~wumd#=y_~C}Vm}}pr@DE~ZvX^vsivw*e=xEnjpKCGL6qKFFWgkdg+vR!rRgkED zep)g3kSWnq$a7=Qllbv2`ZZVv_&GjnoLNeNL*O7I!~`yJk=Dn2Ee!&OZvceTBEKp# zoQS!i!K9%G<;-jK5?YbqxY0Q+e)tbE*Q8+K$Ut*6O>!$tCWeJR&SI5%k2d$Ic;pUD zmX6N{Qk9*+FS3&Bb#`hMz-OP-xD_B?kPltqWgnkO8!Uv7-RO^hPD?Y%PRF3m+dXuw zKK|YTlAXGxOkNY7>YVnGHZz(P`5n7sqCzv0*(IJ32QUdoILOE+uLQ`*B!n9pB2a;; zxXgWzCvj!ukYLqL7(Gi>mk|Ia`+fc_8y`TmJ%v(%)U%>cuh&5}stm!r+pc>_;@4RBk~t@0qq+4RAHFt{d-e@kmvkE!i* z8NF1U+YA>msHz2zb&dt zR28o%6u8R~_`%}6l?4B^M!%D{YM3*md^oC9yJxvrKPQYRZE6`il(dn`)a>C)RG~$5 z{YDso_C)}*2hs`KelZBRKsw)5*$%rI{^hmlmu<%F^mKn`vF^tz^Oq7?OKF?}uPNRP zT9N;_K~>ozu5DXz=fIkzsz#W_<^Acao|5g7JG2ElwMEbBCsh~eqfM(b!b&PTFS54s z%#JODN{?&b0iCL*#pdKp$X1#pHFC|yuN#6cE?}Cp9W25cE@tlOms$#&euicobB7rL z_~Ae?myOH|fSAvUrj;1KKMesZG-;bZp42cA?F9NHF`8A!QFk_ryBf)Aa4-L5y)I@i zc)7K!3DPOO(EypbzIy$r#Oa*#V$NMybty3LB(WfZKdN#aHKTK_pg!mP_HoFC()bl@ zE#&b|@AGZYY1*Nny1U46;d#gvoW>)2(Grc;`k)jkMjm)!QnDIsw z#Jj6n%gmu88El+TM=aupr=m=$`pn)D^0qaNrNZTgToK=v>nDttF@lx`l2tQb;s-RLI^{m*JsuWpO;g$ zpX$ma#BSrB6l;y{^1pbd+>`TAH7E2ErawkDL;Vqe;*N>BW4s@YVRP^7(5wq4*om#f;Bs1~^1KAELj$Fn6ytJ}SAPT!XUIyBDAnxbRc=+BD<1Ncte-#7 z&K^w!tN_}_03R+?=Mtfo=wWVa#yq`@&!+B=C9Q-n68Kl%s);pwSkn$RRNJ06UcG&v zxo1G_M$>Y}QlvfLe&;oBa<+&iaOunE##i5LZ@nF#lAPI#cqT;ATi03fjZQq2YX$jG z|K_~)^|0aydRvt&CuY#pn5P6CAIuHWCa!!cGtWA_$n8j{i$0cLsRywyblvWK~s=svX!pN@pvCPnc*msM!<9ZMEK8RN)>H5%O%aY`NvgvcYs(IXJ)jBM;yFYi}p6Do3>)9gbzc_ zkxJZEgq{7$sEwr5oh$;6W5~0vcWwF>t{akz&s1))^?xD0<}e^!r8XG&@R_%1_+?5m z_et?YuYTXji`liR2qQ{7b3H+{q`_i5r7&of*4cVvQ+TFty8m3tpu*f*=k(KSu_5#x zSHC##*BfjUk1lOP4!Jzf;ErPBVlxFlj#8@@uE)8(Zl3gLIy~|D{N77-cwO|NH+}U< z=Q7KgXW*TWI{D|_T2BkBc-UW-|r}oqT_nX~v)2 z<}`<6=$w`ft?QV#iGXlP7HjdY>^o^80qQaYFJoBo*sl&3voVtoPG}gwANuTKqfqkYR5jtqkX4J{2)1H4}j~9o>8WSyr7cBLWkwP=?&} zf?eGZvfU?-JD<<0@|e7DDufxVPVPUvucTe<4zP}LC{8Jfs&F= z0o;)^Ydu6QZx@QalSRimA`Y6RMP84-mrw&o-BOHu5=JJWVNYflOCNWofFou-pvHf* zF*GdPr_h76N_DwI@Vt?xXHQ6B8r*BK7Lds*YDzqObW9g1>5`Bp_YyT5b@C;J>O^bHMYIfItrUd}sG$#YaR20RuZw+a zo-qYH=LjZ2gtf{ffowXB9f_0D0&?dT@Mu$I6HeTD!tqKbhHQ&A2q7d03 zis7dXW#^|7Vi?aWIk&!$b9Sgav+?Gf>HlnHeL>|g^TD#;a&pvuEc4C3j$e{12>hDt zbWh;Lzt2e0@rY3`^lgF|eHlQ?AU6T5O*o4+p~3 zV1SJ9_-s{_kx0x(mbn=5`iqM`A+jeT8X~UgEzSNkfHOl@L-Mk=4v=|DG3~d+-d-4| zr@r`tXh!{;DaM}w>cs=HMBbu42lTb&5K5^Dd)e~++EU95?3o|5n#OjAIfioO=IQIO z)s9x7M_;;xJ;vz#??;Onniv{XUn=6NH-^rLQ550`@&5z}O!ZTXYoelC#>e28~72Qp@^#?IhTAyxi99SMR(&&-DtTuZ% zZ;hH*_wcqf^B#>k7y1cs{(|e-t-B^D=#iGE^h918ldY9LF0X}c_pQ-WpF;>iewbQ>fPvjU>^0lG9V5lmN=$*ux zwr|aD;0Xl@dg1Z3xajM&&CSL*l`Q@pvEq?Yy#e8Xp-Fv>?73aMnK>MiEWP)Jq@)3I ze9`s*+laboE3bR=-Zy%k^%<&~b_JWlF$@t^PfCp7!jcEJouvxI5)XA_K+IcayfRDz9|v?!FmiOx%SE5(CcU`-(TL zs%Hk*4v~Yt<^vDCW>sCzK6+oz6o^o1dpwxzn=_+UU*VRZU1jGc#n@L$X*okzb}{Uv zln^2(H2hX<&vo~-n6>m^#LrS!H19C**-ya3RxL+b%^!xDXY{T`t0SmOkE?+x!VJqt z;f!IrGdT;sV2kqG!UYOTc){;xyxH6w;-ZEQxb^2iwX-UzS2x`|6YKJwvF!gwh+voA6EPXoVZlH#_oTrC*&{SQkK{HsXcbB5nqDxu@6x{ zKDpI?tWmEBI=JvV8{=n4SSjTAk+RQyo$Xz-C_S^QS8JGoOvda<^Bte(B$vU@Av0_z zMVs>yM7cs|lK#otHAHMzl_wkXQxA%;`KVuz+rAX{_!7xAEO`fbNp&&0>0S5Cl{*c--y&d3x~mSO-IhyUqfmOO(ih-h2ZR~R8RO0UkV8>CG*sna zHIZ-7-Sn3N6J|Ksl1}pZZP{G8tH*_{)}Z$MS($L{++}5wdhgM<$7~(#Z)Ns+K*>)F zd--MN!h?vS=b#xkoz1lROI6-D`eOnoL1j7tc);Wn&Z#9Rf>0syjRbj7|BYVA?4;1l z+3@QLw!&L&->-E{iTGTygbLK(E1yVk)p~mx&=z=hTYZNr>#*edU=bOgF@Mhe!JrJ##;d1S_J&4tuo=Pwp3rJ=qxz zxt+TD=A2d29mjjgGi3MKr2eeuX*{4S`~o6FkL^J?QYPwXU#F)C4?~#XUXPNBRtJQ# zFc!U;Ge-4(MS-+-rHBlssGq{7ptTlV<_Af82Ap#&<*F;>AXm`sE} z&6ulF9Z6J*8+M&-!Z#sz3mowH-=kM-vxd!wgd6->-K~q{&W$|G`rVaQLJSfkt0Th~ z@-wiTl5Pw|T`CQ~0b}Q95{NP}#sU$8D8;J!47;lBLB%~5yW^1Efr4QETyNW`5jtMYLN#3Q^=sZe%$wroWuq zlkd1}4@I|bXK%CCZVK&Q^Rs_IWGT+!HmMIEEE<=XS!dW7EW8{IXY2-*jh1Zcj-20B z51e+?bATA?IM>uC6r%d;Fm%jBqJFS#WQCphk2q>!?N32lkoYSopGO<takI{6IdAhq^ z)2MpeJ~#KIy$R7}mPzozM&(E7QcP;b3!>0xxQ8K+$|C}?BhOrCzMad zIxLIDZ+Z3J(|y$iOv^Vk!JD*o>l^h>sM@5amr5@(-MJ36i($*fEo}IqK$ls|l7AU% zJqzbUEYmWy3x4;KNOeqqH2FDkDf|3Awfi&Y84Q=E^+Ct79kYzZCuF{jnsZ?iq@p z3!6sD&BL+7{I!yfNoXVhB3X3X(SaCpcM5@qFeIZ|QrmGH2v8)6*0ILafe}$oQwu_3 zUVZYL^t-brG{?10)0*xqDY9&(zKBn?8Ot>UC3c5x_XiOQO-bY{h2$dG0WxCZcD%=f zRVf6eFfnV9acO1a<%%VB^|?SEvCV0XL^6{B4-?!$D3Qf!bb((V82C~9vw+IXL(RBO ze8xycg49U?Qcy2vF|#f$z|86*Pi?710Y{XxB9w?OXnP!@zmvZ*)X&w&Ccs6?@JX+r z?Ha$u0_7rV%(|OX+kcxo@Fck24ef+i=xQywKE?@9*})v@7$|Uy^R3GaJ)DwEQ*ve8 zik?4>r#D+kE_}UB_;y@W2#{{gKkjTzr-!!{!#! z!Q5lb%6I14mY=+v-StfHEbwulF=hXJUH~{O5bbv#(T9uZ{A-dNuC3?eF*SsD&hxXk z!9fkBn_KkY1fgk|UBHOMo-BIJqo{7|0!RRGhzmb0gmSalud@ThE<&6bdZxCqGbC8R zE$AQs%!Me`NS?T0m_24xxD(<|yG`a_>!mE;%9pg*CS;Be3iM~$MX!0C8^T|9SkfuW zTSz7ui175@nRXl+vcFI~UKb}Z*Q$kPVWVf83w(b` zX@kp1wY3t4(~z(W>Dc5NgVm`YSXUo02v`78bv~9VU5;N~uk6HuXMxXhxXP?eCv3A~R;t-Z&2O|38oX9v8hmSU_+#(7pvBNW=A&z4sW+v` z+f|nvUn7*bb$Wsqi_zN}C5=lN{^&WJfu-KN5CFcG{>duorz?-!a`wmld#{sq_Weuh zgP&Ywx$Lc(bwu$!UNLqr0kw#-7JfMk`>;SH+K}P;;nAap^^1wkv>ohjCw)1owed}}&r=x^a$HatbjSHW4s3v{ndn&;UlL>@J3vnVs7sC$LUQdC- zNGC<`mGNRKdS-iIlzcZc9RV?})uwEp2OyBXmURJP)+-{BaCFI+Tm?W;(a8wBX}*cYKlx>tm7xHH0jM)x-}a8;N-~~781+CYk^if zGy7|GMy8{}&xb7w(>^f!-m7sty}O=D*x7AdGqM`B1Tl@)^+kTt4|6?{oJ=Y~Scq2Dsj=>%MqcUjTa3 zBWC2azjLfE`hafd@&w6l(C@w)X-6`rcy>eg#&LjgWIGKQxEF*1(1*y26_(}1;~2|& zD9W@)uVR@qAZcwt<*BDt7H_n2QRFO)0*WBYcil$`n9;R8jYqW@f?I+964GV`$_vVw zvf@7?nuEy3Sup+bezUw{5qnACIs6rwPH0PoA@ycWC<4tQwx}Ftz9IVNdkP+#J1SN6 zVb7|~*napX6dn~Ct4>|B8gtG5O^N5?V&O0?Xhr$x#ZYY;DZ zOz4_70e}}^l>{KZ^wwmV23s>Ct{IxqcS6P6YV3Idy>2VXlbQR|03bI@?=T!n9`h4` zIHt9VUgekQlT3>qF!Ua9Q5Z+~q1OjFo;UH6lc_y^)-2$SYFs?4H#i|U?c(#{T4{Zc z>aV2kdaOO=Ygn2_NMrj3-T$`6N}kpa*e=Fx`exCy>hV2P|J}q)n-&>v{j$ZPrLZQn zDni)^l@#r&(HI$mv*)NUi3Wm#x*%0W)9XxS#1wQCfZ2`AM!a zgLf_^jzote>JM{{u{|(fhFl~uoEL2D;>*}B{o!QK5G6V?9NJI&74 zlIKcwg_xoVowA0!n?qb5;@j+nS-Ng#D&c=k<;vbQOHQey--}Me4%laibl~ql^_Uv5w^h-Jox!GL-ZKDyYqVbgOb0>EIic zWMV7XX(RL!p+oYNG(H)^dKm~`FcXf5k|FKp1vn`S>apQ?5cT00$25q_eI=yknPOp9 z)vwn?0%PLJBBJG^?5NT+oqJqj)eLP_ zFil1`Go5?bxqc|CaxDhXk{RW}G`SJKycbUnHkE{uGGzikKU#?y>%tU?1ch69lezo| zWRo-pK%^4-@d?BJ4*=>w6~82z#@R?2$(R`P36gVzp4|{3ypjjOHxV$>0h}l~z%)aA z!izV~+wBM@Ne=g$@G0&ONgb6iW!VFLyQu;}B!eA*$_W!K0Kq4yK<|v0fz?EE-~o)3 zICYGCJ$ZSc`7ff}EvPqF;hiH;X$R|8RI2YXT)=-hUJLOm%j!IHt5X05zOS}y zc6bi`SFpa0m;V6L9uIKwbAye$DqEi8lB0khC_&MI5`Ey~fx299!2#{5t}o{{XZ$#`r+FPbh(&m_Y3_v}11Sa!*;DfeI}! zMsd;#1KpB#6W8-lFh^`;5~aR=7?Puy1Y$hULzkNb_s?~Z(`zNJEhjRh!3Id&?Xn3pNg#Cm5+D

cX4KI|AI_T3IV*qy{gAWbAlA~6O!DF92d43dy+%zDI1WBu67pa_Wo8BypqA~Vud z#!pRv5Ro0dP%|?y2pRtXnm|SbN16N+0%xj;#QEoa&|2#Q{{Um^1cDFMs{a7MSI&kX zeZHgfUq*F7&8FUnmpb02{{Y-8=ODw!k^N9~k^!T$OQX+j{{S_s+~TW=#(fsd^Zt!3 z#xdLlt=;0`;{?guC@8=~gpQ;MJ0&1@^-nT3Am;@H>?{3OSJN(MG%qMr9#HUC(f~t% zBV(2GUg}$J=Z)G!$H2<^IiuVQy&lHpq(y2J>I3S~P+g{p?1F%l6m>=r2tp7YQL+Zv zO#)65KLo-72too7npr?X5RQlfj;JU=ZWf)#z8rAh8_*+Ju>$R)Dc;ccE7SCMQRHMT z#Rxom;unJ4MZ&adU04IHX;jDcw)En)HurrozpH1^E=)jimh22iRrGCh4-xzt;qEYf zTg!HxD_3yM&AUe}L;nDn&5x*q=7Yx6S_V&P^(rNx9M34kt;>%*I^s?Ts7|Y9YS@De zzPAPRPp?*=Cl89$4rSnTVh|ueknBb`QV%4-!H$7ZA~qsIIkWDO`23JmbO?fH%L(%y zNI8+Rq~Z&S1jl~KwBmmx3}+eU-aL><0GY&gL3Uz9&T^s&_n?pmUo;XfB$$C6gy96q zz#CygBtYrux|dM{19S|TZae1~LHC?IyQE?Oi92@n^GM14;11-3 zJ8YkUGNC_rJhFE{oPF%apGfjdxZn{j5|jPY8xEmG$KDWej->>S0TYmVqygAWd7~pI zWddU)c@H!aBmuZH@Jwb*d%&K#NF1McrV|b!-3MdKhx(AOz?#0EOq*N&a5{$6U_YBmQ4Uv z5Rv&Ur|55}8hl5@I(IyKds=nc-sO*ieojH^fszt%%(#y;x;aP^BeY6*1nflaZ~_Q` z1Av^I4>bTrw*mo(kOGXbYz#WiNXy|9w zVm#$J5deddhv4844kO6``@5a;5Jmt!PU;T#h>$)iM+D^g`4pce(ja_LWHidTG>9Xp zSLI-+xKgOcgOFs;@mat@0E~ix^g?|SKqe9ipb{ye0E8g`l4T?U5QG%&Dhf0n^U!0} zU|S@TyKFdZ3eck2nb8N^QG(J;}Hyaqn6>| z833)0laJNd2{IZC{1yvP9M=vba%Ufk3mu{q_8)7=V`PXehZE_LpEiAVK}O}XLZ}^D zWqknfy6fxS9B|FVgU_eYljy)dMc`67m`3mjGQFwvZM*vCgFHM*mr-R(C;TrV2TcRE z$oQs||rj>IoE`1RohmY1g7aX$-D7WAl|d&?GmfYNhOgYL&sv}8i`vbNML z=;{_1Hg`-9x45S2RT_G=!Vl(y=WCuO2FIW>kT7vwsRC}aIfP9p5(oAj=e$A8o6W9~Wk1U{MlezTm=7&$&g99Q`4v1eud3GbnEEGCPdymP|}}$=L&tMmu^V034j-)hR9WDKyC; z*n|@V|vu5Cm=y&M>6YCm4gc{E$j;PET2t5F$7EqCf*^?K>s`cG(?*1-uC| zdMvjK-5Xvauzd2v`CUCH3l=H35wIavx0-dSRc;F$51!~cM~T!0&jwc{d(R{bpW9nJk3V)t;uj$B+fh1C zh#WV4x3a&YO!h7S{sgE#hD0_90}~yT54<|hRaN9Q+@oTC0Yn1cqjQBs2s=-gWQZi} zsuyA>ZL_k2zR8@Vi8zsqZ8xxML>-{8YJe zBdL=IWDNY{aDX%1Z_wc(v|@WoW?&ov+7x7gCq4fF=7KdNJCV@JL=gg9(~XV-ZrsOT zhx3FGM=29K0(zi<5C{YbGmkVlf_K3D5a$ia-cp}-L{F>)1Gj=>Y=M~Rm96?0)s>uobNqTh{W@D@<5q^)1n8`2{GDcLV=Npg9>BX8Ku=io z!3ZP(G5AkKC~OSpxk;aAd5*IZq~HJtp@BWn4bL=0?1Aq*0z`Ek6hugkwklJJG6)~e z5IE`}4$^^{KZ!_~GJYXQM!-gTAU1I6fz>9LNr9e_oA5~_{3B#QJ7#kTDcu4sE?d;n za6jyo^KQN>)F0YEn)**rb5VOn<&JJK(R|vxX>HYTdQ@=yN)C%`(CcbAFj@$AUB4xR zz6aZx$v=wES_Zn#k=zzH5#+F%lS6JxgnD#AVEl~0^7Bw44{udd5!t(_&vFnpIyzut zPfsQ5KcY47);uw}wj>u?YBiZ1gM(Z@HRP8OB!~lO3)24pLu}xdHYNHLvhuk$JT0Tx9lA&TXGZeVGE-0ztUq&ugOn| zv}=ne69%=Ty|X=eOgMfj8vg*%mc`-E;q7|ngZFJa%0i=m+H4=ea!xJqV~x0Yz3$Ro zsM|OFex7}(k2d|G@MT~4D9;6m&?3-p8HjR?}AuZHWEA^~++Wy434#vT44@j>i#)|tQ_Byisx(489e z3$}@=XIyetXZU)LF(GbU5CH`UKp`DafZU*>5zzpIAqSPdl)N_E4luIUXs`+zofAr_ zj0)8H{8~r*D}_D0jv{h8FKGQDv^Q&B7V322mRW^TBBWr(_Ti za|6D5ryWM%$n!yxNb>BY2;YBR{-_`cG2DI$kpvOG{{RGr`PlYBG7FEC_dz1;VB~Z^ znnaQe#B`C_B0-WTZrM?o1av?XC$DU$17RC(p+Aa!P7o8npF~JM!?I)Ki3NlB?0_47 zswJeEiOgX+B;qmM9VT(z0R}!f^g~1lAdb07(fG*1PB2dS$b=F&k=t|w-X%k(69>*Z zAdxtbPTQ!4i8&spvJTnmpEtTaB;f>rkTN|xq6GXlNxx))5}7{n@;&f@6C)=$_^Q^` z1760H?x-9YlkmhUQbxzrAnCk4q}b{-L!8FH8I_aN_yXSIlb>QuH^u?lS3TjaZmyMZ z*EqS5k^wwKkxAu)^BlEvWUU0h=H0@HT9_>qN z<~>^P@?N&(YmOp&uRHj+!*%p-B(HedWa;HSRU5G9jobFc@`Z)NbZN$12w+(8wTSr{5qAAfP0J@^V0Jr-<00`}o)po}I z@!RzDK^J42*9rgwunKP`068iH0zu3`><|acocSmpvnB>QsePFza5|L|AU6O`ZfDAzNK@%M!L}e&0mjNbXPgOmpWDcVWFhG|$bU{qc z1olnQ9KA?_q<4|D#{Cpb86@*G;s>r!QiGhp?w4YB9Y(?xM;3_OnNf7)bP@q3P({u6 zOydW27fX2v06~yKnIK3aPULQ)M%zfo!3K7V{iP;6brPl(j+F9fxrcV2&0io%geDLq zCWHbIgaSxH0b{ji$z?zBEQ-QjJU;2}ovF4pPBW1oiU-Th z0w>6zHx3c&)iLgjZicu>1^}4C1+o4@ncqJs=#eneagQlMGx>sgAWaY?XQaZA%*4(F zNZlY0eCa;jhjO_1f-Mkjt zU%rEy{0Zf(Be28%eb=G(M<|)Z_dz6(ngIwx1ccHk1R)41UR%<;w5@Gjq10|ZTPtQA~?0O#kP#|%* zkZ=${0~jFo%0%>nF*|I7xH+FL=m%zFev`659$e>9vk=ukHv<_~lbJHei*fG063 z4ye{{Kpg@J5g^A+lw+v*N{`lQ$5R;?RVX&K|6HWqPK| z=*`0R zL6z>>F5s(i%Wt9S>;v~S`eXE0boI_3qaMRgV`FYhb_5;^X{z(?(5mU^)|2`yu8VoA zY1aa+ovqB^Y;4U+eg=^-f+eB?KaVPtwOD4dn(ji4g`WhBfnmudM}0kliGW9+iHAEqusjw zjSa0{$;>Qy{ovOSMD|_Arm@4<4T|=3-VWjRt#JI7I=-90cd{;YJtgzGexAYj@}Sgo zzoZWU>IJmx-d^eMI3HTIaBs!U<_o3hy0)3FS_{n{`ri7{!xb&+hl%WCW8_wgsQ5wQ zmb}+CmX&L5Rl^Rltm-cK36H^XUOnI*BJe*}qr}`BsoYl4-0;eU<18fMm6|a29f9xI z!Vg&qorqCz4qz~Gx$d=(4EWZ|k9bDgSF~uQSQAd_g!38|K=+&G4&e4HX@U+wlPDrE z;zZA`Qgo5lKQzGvlhd~7+1u<;M8Fvt8wiqqN&+B9ToKaQrvCkKtq9vz>p9@v#=Q0#u6fA;2*&^0l$_KBg$iNI-rT}Fb`BXh{+Sw zLS#;6CuELWwl?pS7g~KlE;(TP?cDcSMT6!vYBr!E8sH!g=gnr&Fq%n8K_npv1R$j- z0)!z1YPd3+oJ;^EYvi73cdV6|)Lt8GLHouQA=v^5h}{Ed_jbyd8yE_hY47nWU3!3U zf?WxS>N=?bj05DL2bMdj44lA>?tnX(5!gy1Ts?bifxP@c>ZW6p-Q1nxI({f3(hpD5 z@KT%!ca{o^K`ofyKjfv*<{KMI08DITl^_TpfdKqa=JYt|AxKCw``GFbMj&LF?#MwEhWz3``({zyOYe5(3};k5$F5jT|`PfmGI`j zbB;ccoGqXlmijL~yL#CN*d9s^K6MWN0O17(X!S|&Z8ptEHLdRB3(E9(zs9c-Nq-L6 zyGhe(A9k%8O`yO(__Za@{{RSAwx37tF4oAc#r$USf9fjh#!IvKB^OW|FJ9@4^vcMi3$DpWr%WES^-NbUxp38(!lT#wzggXw=w0vc@;^3aH~sEdH-g zEgnw;^g+Z=(jSc~nYQ3omh|^79r-jVGsj;NYsc025vTtE*zTOWQ@Gs6yJhpK{z{qS zYTYcG{{Z0+@Il8v>x;#gL2m*K{{Z?n>-egl^|j**hBytQ{{Z#3Km5zCo;I)2&Y%AP zgeoVE?q)uxOZ~Egk$={|j3fU5sKfsN`IjI3$}aJH#mZT!z|8~y0P(j!{L8N%H@P48 zI$!OSf77btCd!w0CBnsnEFI!8FJCE*bf>uFg32 zr{1w|!m0iWY~$hgtPjGk`5@zTev^8mKkb|rMt5by$L7U*N9j$cu*L5S-qSzWxncak zU2FcGS~z~!PN;vx(x7;sLAd__wCN!K0D6NQgPhs@D0o(@fVt9jS`)b*&Hn)UmVVdi z5x{lG4!G24&+pl|$NMt2H{5VV*Sm3|*ul^3EEs#^A(|D_gd|Tj6 zUdKte2DQbb=~lC>IcrgIX^C%9F%A+Cc(SuYT`)O!03Pa)h&|z6RiyS?Qe|et=}jjH z$Sp8sSiV6y89^rF1RqV3aUrCL&M;IU!5|DkjHREwo|!=|(sR`}eW){qNyn#>B!hy2 zq;j5Nj-Yue6>9)U1DVHu$-U+0k+MeE8~QIpcmd&!5vWtuHM@3ItwJifwM4St64v(T zJD$M?fx!L?@s}4eoyoOsm!~{PxV@Hh4((v~kH!M*yg&43;p=K_cDt%-7xi~@D3L;+ z$A=M!;xRJ8rpo>u&V4A!6Fr-uAC8s_Nw zZ?tdTx^b-U_la4md_}|hQ$3!WL9Ay++gpll{TDruOzu=kk5n7oemZF%==Lr?bszi{ zgJnejnp{4 znFX4)5@+u=KSUk*j+I@4R|KKPyji4yS5TnKn^BWepFp~o0`YaX5zuL-K&cxb+uG5I z$y*H@YCKcJTAqWd0alHA4x~%6d0ZeLP+-rZz(UOMty51}rrCh@Ilr&ygU)|NjaKJG z@i$fB%I_kb-5RWO5B@a=VEV^6Ub1=X)4t2dHf=fw(#+GOLt5=^?egWU36J;JuuEaX z$n-%>A9op(-*pmTdKFM)83!lkltji5Cx8sQc$Emr5jpLTHBi714t*4U*QZ1faR5e0 z{QT5Ji4ZrK1ypbV9?B=|?-8EBpoIIgyofQG2_Lc~#&+2!kK_#VEQCI;yWCsaMLj-bO7m?&V5oW+~h{%qLW+G@aUNWPRFcH5Ih;rz#Y-e zh=Na40(|CwlABsfq|6_{AbiF{r#@;p$8EPvG`j#ExP>C`dS}dlPyl=ECj^kbcld(d zUOeI^oDrzk{{ZriUqiu%u=E58=)Qb-pgDX-;&J}~=_`-;$_%d!)M?PI#GFj}%D2>v zf=uUl>FBEPqj~g7Wa1u1c1EL4DIDYTL5U_^0%YYy7nXrB zB>;Chz*o8z^*twE(l6^fk(SrAE0eqiyb@#3EL{iO>K9G5({1Y4uKYAHyv{!ko~3OX zw}0V{st{uAJ@3hA<@r%jwq#Z42+=8t1;?!X)mQ!eycPlNj3{U6{fv89h^ zs_HjS6|Q3}q`(7O)7+Bddn;RwPf)uj>le2Vo}AiNhNoJQ}dwA`EZ8!@ZapE5m*K}HF zEu;y7?W$+=LD&n2l&BZ9bzEKiQ^s|H#f2Cj6Zn;HUsdAzjx(y;F_Hwan|=s8ajMVW z2^!4(;J95{yh`>G{vdGc?lvdOWoqhr^PB_titAu;Kg9=pb$Wli6g|B;`%8g7%U5xi zYxkwIlP>-$l}$GP0GFHkcKOm^4rgcaLFgk{hi3$HH0)QMKBImFoo4VH{p0@t%$sd> z2=_J1>FPP%{7`xs(dwhj3iJDDYOTdRdh`-@=Xdc_6?lq>aig!?@_{3oqon?5JNHqt zlVSqlR4=%^f^GGuRF0g|e-N+Ptnt0LKk4?hS^y)Tmp(%qpzQ;q2*Tsk__vK|&o!;3 zeqN$8_^XOuA@Lmm4d)M+H+iN{`Jn1=Z<4QLsa{xB545?fOpc9q52)F5Jv+rsKD|Ls z`rfUhjtOv(J}Y^#yrF+VwXJG4qX?WCLDDq-Bh$Eo#-^3Tme%j3UB1oYt3#<&2cZXI zxW63u6~r7juhG|hE4r%;cRMHw;gzT!&2huo|Tf#3A_02-=?!Jd*X8WqHty7-ijA(O=m=a)2pNhY=`Z@8%ep7LMqg#(U&v73n zF5g>?HEM<$>J|2_ZUH0p{sXo8X76s(E`^1yxP!IrjRIe^*T2Os!n#`q1 zf?W3)1LCs!9+^{Az7#2tA*Jpou>Sx!Tvx<;HMLGHzOuWxtMv;Cp2@Tsfaihl6Y;_f z)~(`(k7)k@XJXp7)i(W@uu+tw#@1d&94`r(fY~_p5H^$DYd+|e$%NhaWmwunQ3cG zo=Zv;r*X(8du3>qbt}raebr(oZgK*)FLSqZoO;PY(nUtW3~ew#@*JyS;Z6|MIKt%7 z(^?G*P6DmV%rcygq;7nMR}+%q0ekm=bQ?|@;Qc2{v8L8jr9qB)8@=uTxyQLAlp1#r z_%ESZQ>Jx$i=9fdcW*JJPtpcR_^rarfw*4Hpit0s@f}@AJpA1&V+uob7<0n<1KLCM zO*Dg#`!hd+!fO5)aIT^pMxXUcr|;UlvOXJr3v~fW2b}oZ!#n;Qw|(86Pp;{V%bwB8 zQjq@8?dBGO`h2CpfJ6fUdmgPeRHo{68Xm`j*EPaH2XI%EIHtyypTs(yl>szpTs@2% zzy|~Q?1Kl$49N1y>*}j9yr9Vi!>Kqw#RHT$^mg0fR4{(jZTrX~;S}~H5z1P2Rvr{{ zTJiPOqX}g$Vna?M5AZ7^P;4XKc5~HZ_yxYt#QMNDmjuUevV+jGg@2&Cmsqqv+mDzl z7!DQPrOhh=Q&PKmWu=WbT-JCK%Ek#e>QHbG6__l3ls5I-?(<*RRU~~IYJdb3LPG|$N zZ6g!u@JYk@lnL7r)j_*Yf10T0a}zlSY$%Sd>HOgYazq>x*eYeQIFcY>skp@Brphxd zoX1HcIoSm+xFfHUA{_u^j-6*^I6S5%J$fj-k_j+;&>#$9z{WemKuhDVq(WeTCEX*U z03C$%9neJV2s>wdg*j0LJA+<$#Pwl5A-MFfxKeJC!9$w-fQ`Jjn7B<^~kK>p0*)kqJt224V>y}Gy4?5=Mwt5Tt9MTPY$RB#PrK*=Qq zcfOq<>eZaqHGsL#aRIFWZb{qKeEsoSy`A5P+(~t&+|s(Ut$$XfI<$J!ZfQ=(H!V49_y~7@69R;;r8HkuwH5#m>!s@jez(07b28*sb%Sv^frMatjR;hwSh{QnZe3sRt zczLO6e7D?Dcl{k~av10}oIIPeem^7{d+zGqTsGfMp;EPH7-(xrB>4chejf17y;ipG zif+ECOMhU;15w_mX8H*$b<>-q@cj>A!?p~h;vv@+2Q^3flb_ScQ>#|3&0cD?9Ot<1 z?T}pC*3+~rb8W-+RH(D9LfpH|^*73ko`d4Eu5Y~KjAwn8 z3yrDsaK+{caOH45ju}u}_;~Ja9cUkRv&ZCCPfgZrby~L+?CLqrpke&YfO<&sSbqy2 zI%VSt`xU_-7XJW}+QpTRH#E*JCe0e4r+T%CbK6jtGB3K2ZjV|wp0HAiTV^Av&K4_rkShR@a?^Ss=mD+ zZ(6$yo=GAH$gK+3LDQ|=U+jIoU}V&;d5f~TkJ2fHo+W5?GZl2_w;oS-@mei563{>~ zpMnYuV8dAqX)rl))mNuQl1zvvea=&d2YaS``of!?Aj^sA(qr;K+TKzeBo>Jz^gT!O z-C5NHI7S8{PxF;qoPhpF5)67{3W<3xAWZGN5)etCI5ZQ=B#`HNWm9`vTmw&^ugwON zoIc5pxZP8|XVvYiTviTkDhxFo;fcn^en>5KEkesqb)pa{fGf%dmTI%w%XwqjX_nzYet^)Qa2>4^6Xm)fRs9Mp~wJ_1`Yu0SA zIx-m3fIk)Fp9VEcO&i579KO_C)>^XXk?(fQ=V@SZ^ezkDWMu`t3oBXzDB9c8Z)Q_y z{S+=V>l=o}dn;Olv*|Scitr%@v8iw`4eAUcwv|GgkKdvDGx%Y0-Z}8*=Ru)T{{T#= z`>O_?YJiX0QXR~0Ji_k@RBIhdpsE3+T0_CwBPcw9s%aLwovW$Wr!U==Fbh^c!RyP5 zPAadYJ;l@<$HPhcE@|ktTe@xf#YVR@gO4ffCktBet%kpe7nP38r&-wZa0oj&Y#2xh zRbJUkl?5k#td#kqw5mFd-L-|Y?r&?-x3_27sZqh8E_JQ=wWHb>GfcO*zj(lT{hK~# zC**^rb0yE&aBJTeb;_juR@%nhy*<}F{K;6i_?N`)ApL%ue49b2JsKRCC#v)9mx_Et zM2~M)-njnNAU`FzaQ^^{6fSBumZ@qPKYo$h;D1CNQBA7PPrkO)Et_#?S+!|9t4`m+ zUNr{O;q!xa*SGhmIzC{o9pXhFsrZY;v|Y_FyER$|USJ*iuFJvoMIIxwlL5ud`GUFk zjTUaQ@nQ9VA(z%ncsCgRl)5OMszKP_hz5|*Y2fBz|A{$ieULp{{V^(v&P(W zW1w5rqis=_I-C&NEHW5-xb*bhdD`pR-B+txsV}Qh<qMuv~BsB0p6q9K&t;gcQAlTGATO9D0+Lf#Aq* zigob=l%M!k#z1vGrXq2=*LXd^_@Q1W>=XY03J&@TudK1I@Y{?YfBv0VfB3g6K=pg8 zj&BP1z>WT+SbzAkgO7aw!5j{MVWO zh9S|#Ffsm(`BYw*Iot6-qu!q5bRW!Ya+v~lQ86YAdHJ9mAd?0+$xn33H`;K)CU zfG`Fo4?uu00rKvk>Fp=YN#-12@3HkrfEol04yYhOFgiz72f;mtD9Hk5Vmhjo0WbmIvZmlkgCLB; z4EQnu?uAa+ms`>&a?q+EH%7=!0nrHr&>a;E)5~j9(N~pis2H|6jE~I*Bp7fr5O?m6 zyRq*DHo+%;+*aYfN?vZoR@v9{{R$5M>hL==fbvD&Y3=r4j2jsfOjlfzan^m=$Z0hxxWv;I7epBQ&LAm&J z;Yzh?O`b}$+flQF{N;3=8Qhw!le<-K=DE&+`web^J3JQr*85JOrBRO?vBBRXC^dhi z^)p9^xIXVZt~IEbJ^4@Sx#bXE%*l3oboj2R^rpA=ngrP}K~*0FPsb#Bd{9$uogzfF#lY-L zMio}uQeb>Bgq`uXqHH8#!a+M6%8_vf2GJ7;CgFe@12NEUwLcNAO&%Ml#<-7fRje{* zMo;LrlJHtK$cX?-(tJ`bI(>*U{b`x%c~Emwm`U58(J?J1d=YEWF)G++v`kVo%z>b%rMAQ&hNQ-$_z<=Z8{(aL{6nU)uD7byrfwPw9eGrO50P>Y zdS72!Y4lB7>zY>dhVH1~)yw$n#3o)_RnxQr?`2RH)w*!y<{etWzI&C--%;*yb;F+L zllH1QN$rxU)O)cIL|~oJQ>|Co!NCm%L~c8*KY{eUuC=V)o|M|qf4t&AA z`04xstyXD=zK^hJ^LvATB2aNIB-VAG5Ovp^N)@WxF~{om%=VQT1CSP_GA@ z$T)RgqOalG3lFi>o(z5ZK>kH)d_%(bx;bm>mQ<$fHlsE%)71x^yfETRojXu{tyegK zlE-xeaq1U;v#QGW^y<=dvEo5qbmRL&!<>BUnoZ@SS;FK1BL@#3Ir*;1!5WBt0cz(0 z#}0Z&xIwwvRyNmEYd3mt5BU`jq*b64_;X*UJe2C2dX68u@ytIX^H2q6xX#S+KZ81r zy9YhZr9WuQN#>+^hs~h}7zf`tkPdOv)o4B?(k88i!RpsA!Jf1Ft;(dy7$ww5sxi=D{sjjw1u$}=q}{>^dZT|c+@uj5&=b`nq@sQ(7FOfo zlMnQj-B@r8qy)F2E?Rs7x-W+|e#=R(aQ^^wSE&MaA*1+`gKu+-wjS^~5}RGgj)!>? z50a+<<_S9je+(%C*JH0tZh~CX?+$1a{{SU3A9ow(I;unMNr5xA>Ztp?#z^jf0A!Lu z`4RC*k{!GQPBalmv1(p?S9c^bw~2}Ma9()-&3#u0OZyWo4UzyB|y&u__@O$=(WfDpdjYI zLoe#Muh!UYJs!O+w0RxM^LNnAgX$bq^NFi&-}hd8n+aT&*NiUvpQ@=kZ_KZ2%QV0^^%Q*6d$o}Cpp zMB*c$KmrLrlwm=!2NE}sB}jrd&U2W`d5Jx`pvqX8wWsL{y0+8*0H}_E#07GI2qP(^ zOdwF25P;~dH7wC+?&Wq>mZ*PcOhGc_7}4)}$(#ith=HA<0(pVSgMgTB0EzujEb|G1 zW;RIRjr!#ERVD=P0f8M;^bxm`WC_|wXh4Ay22X74q}`;1fB=uqH&Tw@KFA0lw;zwmOaTXW z^cdXrQ9Hm<0a-;x&19!T0jj)f#ql8TphO^~n98K3l3`zV})5*<3xL&e}c-JfnD% z>Vk(Mj-$|SJE}#zr#T>c;a@;IkN_L4ONe;F!%Z%uZT^#T+(S>g51B!pd@-)5_cSyN zxR?MfPg>(^J0SXcX!_NCxrri}{wqh;b?rk{ar)JADfFb=G<-U&P+@Vvf#!nyR@QIz zT7}oQFR0#(7-M|`u?#NQW4fxwHK#c}6-bm2qUTYl*R=c0A;9^C>3uQc=EmCLyH%#w z{KT&{Ij}>H+b;d#t=HE$H&1hnx{!4f{u3XRAlOgrD^RL8Yk^y^A~A4075&msQ+iE+&+^Vm_X8L3UZJePXcZBDV_ z4z*^;FKxY82fI%={Fk5jY5vnjqS2l}=7MJ#pVbCOcL#63M1jbY*Cszgl#KH?2@?#E zNhCx@$SSeX9VE;WMEM{%b6~@Hx~fAa0MBH>jDhnAD)V4x1jc(UN5rZ=(?DfGC)rkO zr^&#N;I^pVAi<5*o~vfd`x}c|up3#0v)J@M0|+>Y5|>XUTIP%G?kZ5M(%Q7#TITj4 zQtW_IoTw=SbgU?XN)z?7v2;pR`#~yH>B*3kRW^&mC{nPq(T-xT1OM1_xaZS{!u)~_+kWfG- zGx1PT1F``B0Ld=Dnh8I-9uLwrt82QE1D3VX zYfo?|_=FuWxm4py{>#9QGSB*=-}bpepi0Deou~_c1$e4~IjZ^%9~zAxq6cRlAbIlBX#H1r0L-7W>Vj<|3<5e% z$xM$er2yi65-o#|;DNdee3U?#oF34m;yj2WvV?Pfc*+QjiT?nYOOzL2Y?;~tpN7dm z1LK4g%;G0LaFc;_!Gn#zH8Mf?fS}>m8Nlf%1DM`Az}ZGI(oXVlrX(~(?Xm8n;~AU- z9f!dMB0bT8v>8J%*dJ@L0IGz@+kT}$3E1X3Wd=u0{;A_1Yo>ZDwP&WEas4te*seo>JUyW7SE( zhHo9uK%pcVA{-BvJrvpud)Wl%C>RqGWd!7RnL`HI&*X<-&Iq5H0K2KiJM4ylPbk6s zvYzA#3QYt6Nz6y84tMl{XE%eKN-_YV$9$?ad0WC0{++0_{{Y~%(bw%2>mME(=lDa# zO&E(=j<|bD@<)V~19kg`Y+r77@^C@ad2%FtN&FS2t9xyw+8Xz@TGow+S05qOUESQ% zw6>{nRlrlG(&tLy+)=I9)$i(5sOW6_tp^Pq06~!AUNXDXO-dGo+gcoQwENEWKcdze z$2%lIJxa=H`bn!zwH{i~Kr&U`YdUnA;?P~|(FP1K4w8G7AP;aA^Xaq!04gS!AoM|P z%dv$vg(5OAfHRaC3U;Em4PVy{lWlQD#P$vjZ|4i7cqe(!rD`^gIi*>(0P=ADEn2q* z*_-|w;_F}~-%@2(`mxeKB>W!KKCQ(bz?fy-7cghM1A zdLw~rih8w5M8~zJW7HX3bHsf#X+A0H)cInS;|0?{!~s8uatu2%;n%J@DZCI5?y6=1 z1~*C4cWXf0KnNz#3tTfGbx)|<=8!N)M(;f#0njthP7p|u1DYpj^Z0a0qnN?wm;!lb zaGZOa%>HU4a7p)!4^o3hS=H5$?F*ak?9JbX7=1}C^(<-iYiW1$g0&t;|B_j*4ldCTqQB=>LdL7*oX%AHD2rBT%DG1Tfe1+EZ6i-8dUAVt|olRjvU%Hqbt z=KjC2v!d#+pSmzTPec^0s8zbJPKCP-O0^ss){V(svxhX+==wDqAf-*^&YWA#u-iQZt1jukqF8Ush34pfN)1_s6l zRb#H|6twL&wasG&m?41mao8#)!PZAx@d~BefOW2oZeC1d+8w_VK1-y7=apsQ=79bf z@XnpZ`%86QdZ4+e*AID=Mp_T955-;}mi<N^ z{&Itqa6Y;HC8t|m2Y;kfJe5ah597M(6mFYVlV073UTe|rZul#UYuRcbwvd0axE%=l zwFl?uO75C9-#s2s;NiPSJA@r;gYGSL%?|sA^)`x>pH0o=KYE+6K=TJH&$`Bkb;BG% zcc5w?)=+mnwNrs!iTf@def;HgT{}^&r`}PzwR}~k=^c-7e2U(<%Z9Y?6F6Fp#jD$I zs!#>i)%wz@)sE}Re}O^g+F~CtPnOWEwXG)0SEL2Y3u-h&YP9>!^79@_=Hy)I`lW3% zTB2U_M_r)@IMjGQQMPlPYs+~^W?6?1P=7^I0zD9Nn@$_mZyW<{T}g-URUD)Et-nCwiW+O_)~F4| z%t(8i0ltIvTO(RIiUN_#T^J+PK44;FILSm}I&b+TT?7HzW>7M5 zkF|^>2?J^Q_59L2q(pgum>}|iB1YYiK(`|%0;=Z_!?A-fJF0HwY!_fe<^T$Xd)sPF znzvM2)_KAFkX*K?1RQ5<$W@wU!J`H?m5j5vcA-$y(ycGG3X}G2ZQTC=#0XoCjp5%K zYXy;~P|@w&WYxc^%=V8eZIeE*gIK<;R8eicl_yrexc!yA24&SM5dZ=B{1-yeI8g9s z59yjka>rgak*#uCW@B%|`mJ zqkUHDxgOG?nCJ&U5Ktz1`Yi*;3*TYk{cCP$H&=979r_P~sO9|RAvbO8`$N8Z5N zI($-OmXZX>iBkZR_GBJ~188$eCL_^RVH~)?j=fYJfCfOybioZg!`C=LCq%#znNlJm zXB`TRyOaVtY&)kj_F#zXi6{m*d!)N=-BgQCV=<1(BXV~?ihR=}5sy?8naT9W`a) z@rCp*1VM=E4^`kl6nJ*yfxJf4tQx|~bnE?U&GCm)apqwjn|ull+r&EMoI6pW*?XG9 z>A&c>q4%BUO6xphe@j;2x;OUE4yN+g5!J5PkAYmS$)48ogFCzr#Rl_Em~EvtHAoks6J&E=pxDJvx`7A!6vxYq*WEgjDXC6vBljqq~c;=jy5I2}8DY$b< zJ$k4H^eVV)N#CrfR1k0{x(w71iL3h}$Czuh($nDb=g z{nEC-2ChvWE~`v`t+sf_kp)%p%SiTGy{556r`cUI*wsCr-KW*Rk`AmL%-&|11V|&O zRB6`wrlCf+K;b@%U-0u+8m9`{InJ8)?e-Nj)wl=ZA!lxfw4_95bR7>uyZWxJXB~e?2>z=(*u_vfsi|#CQmj5ZyrTPAb|sXW>7@PJ&4#GN^SsC za3$rqJBag8Co|CJ1Oy7r1FvF7^Rf$T%L{AL8+C0;xXg337#*i|h`He{CHWTbr3dcS zKZ4j=dBFEc1Ll8@Xy(a@w;)`3pY5;<#EDpv$=9nJg7>L{}D*D!&LoU9ff%i{0F69g zPL&HvP4;f~A{f?>xZl*E!|`6KHCsdRZ? zds10zORL}9j>B{E>VpBP*q;$RS<$#kjK59O-Sw?S!(ap#H{}iWabC2f*0GIcHiogF zHLU^w17H^?`aJLrZWG~(x~8z#9w638xVdxw)ixZphtE96%=s?1#-N(xJ}7wmqi|-e zbEE0@HFa%L-161|;+-l^kFs5oNa_Gxo-n)(^nueKrFg%@l%5D}dgAGayJ|E$^PiFp zt6KU>@wMS_u%)Hxtm*9Nnyw!gpV4W$hm0J5eowaIoAv|uXqM9-?tru-pHxDFV6Vpf zRa}!-iFK!c`)xt`t5L-qK-UKidshw_k$YGF0GVPT1qZ8sihd;PTK)b101a^k-CO?v zV{i4FTZ+e;qd;&DW1YK(K?LV@-*}ftr>$wOqUaTw?^1c_@8DOEeu$3c@miptwWn76 z+P$O|9#-*tf}gD0x}_^}&2G#VhU{vzeZ%L}e7de};qMl@#N-sUM^t3{dt>hVc>JIFpxf=L z`$h-1Zrzr_!+Q13iFfU-k3BbHr6(LbeuvF@_ksBGrjGHZ>%yn7VdNED4?QU8;kg6m z7h$xzqjzsk;?}Dw(Rh}2Bm5Mw!f~%jfXsskwL9h@XN#sE&l-M z{T|@|0Oj5m&&(@l_lCgajj4F^uPQNL%7>ob_LBb=}D+G z8h#aciB>t8p-`RXvz_`Yx?T-&#ZY~|wW81maMnHl0Qy$g{w~(uGkoTc?6ITtR<*c` zR;fJtjmaKQkI4oukAZsQjNWl|CQkm!(4Wo0Uo*iyB8VT-{9mY41MLPnoe+OAs8_$b ztUqgYUH<^ys7j*O4!<-RDjpbkYh+2fxx2o1_U>Ho_&{09J6-_Mz&dXZTD|QUbFIUV z&GJ^P9#px|ZuL0S(qLtUg&H)*(r`Wk0>a;MKCN>g-MW)c-J}D5&1=^l71g~rRW*fbe8uq|@G#-| zeAlnOj2uDzH{o5Ky~RTNjV`0?OrN+t>VNLKKf;5oi6m`5s%9DpBl+%v0XZi-sGqTq zho`{<<`^Zzx>9z@6Z1fCQb>-+qNYJ7%=u#oDu)w*V1br}2<0XsCI^sFjiUhJNH`D= zyadiM2qJTm;73R*PypyTj1Gu00i1qGU;;>-%$@!S01iN%@RQriv5D-0`Q{zUi_DUH zK|K%?0|rE53a22(0N!V!s_AHnlNkf^RHxpZ!7x0~HxTHVp1w*GF#~<0Z<3K7^GT5= zJ9JdJLz+kjc%6z1-6S4*)BT>SAXSc*A&))d@>koS5S%1%fuxPlfC|r46G@RjY8B$O z)I`t`7;rg3jKIMJ?<1S>O{1T`&m|yan1W&ijgx8RB$JNw_#lxPFa{2Cn?dCx?)5#> zX%1=Iq!^e;fM7`yWXM3r+6DxYn|JCbIf0cJfIdV?!kZ#<)cnv98~iajQjiA68BuT` zhR?%fFwWyWN(Oc$jrQoJgUy2zjPyZnL}MLug(i#$oQxjGBp`@@n}2!~W0rjUu%#J2 zeNY_){!5v7>*1q3LE+H*K-zlsgIw!MrU0l8O(%ICosX$qFpZ#kBwK?avA#kNoHXw5 zw4r~dT~nz|u5o2+dV&o)jXTFe2+EFxCswu{pFe{1pVHribc$Lfw-nn@6m@EsOt!63 zo&|Q6xPsx;!;}f$H(qYxhL>x0^@fgo00ayUi#GoNcAG&h z0oap|lELa^!%6&*Vu^#0eKLqR>}C{VOcN1_g)XFi2nPWjy;7*jBt#H8rZ)$m+Ip&o zAd*S=pxAsYc&Ep940hF7RiEw?`Yy%BIt@M`&~9uVKzqkEC&$=$`z3J>33;K%d_3{? zU3$uA(cbUsy&YberCIdf_L@sfjNu2Jyg$}o!+b+p$5RH48m{&=gTK{O1_3@@J}b6> z2%W)Ne~J7E{c3e>9i#e1to^MKk8aViAKD*^)A%cnt7yP!+RJLxwPEFJ$Uf4C_DJdn zZNd()+LbIWg<3ynsO~#0w}-fbt)0tmtSSKLhthV=9fuxoFqIBZted}t5 zpWxCzCCV+eT8$jF*d6DwS54F@9D?SPC?(JxG)6xYFUHq}$2=0Et}x0MeapqyGS;?tU&%{{W@B>qa$8kHG$jEYE;?)Q~vU z{JwVI{&J~Hz%5W8+HtLT{>8Wd0Gz9yE!T|y0PQ=8^&i1R@m9Lwol@uhs6kSn(f*+` zUyOAp5A4wc^;azVK51qR&k^f2d*ymt_oZ7^)Nd;P09$o%{Qc^L z{-`s}@Ed~Y0Bo`z-)=kK2CU_mg_^}PZjC38-5 zze-ob+o15!Zt+s~;(y&>{ZM*@uPOaAG!aWz&^UsVadAoZb%_1u9%j$LyX3T;W9bRv z2B2Ih>Nd6vJuPjT2>7~6&^VWic!P=km;E5tFLf5vJj`u+q_u?g4cHVIB;g29B9Tof zLDIgDTvw%VcZk&WJ$}2b>rE0G^A~4)OcLkTI>)ccqMbEYF1G=VO{W-$w-2VWn zsfPji6dq~Pyjk~J-B(VN)}^zz{{RX8D`&Cs6Nj!q=DB?X+O0A_DGNWZa0Z8P`h!r> zX;8QyY0PP$?_5ADQN8e^NN^_F?)Halwcvch4UU%?aPcGm0BYNhQbM^LVZ-tN0Mho6 z{q@gkcv5+t?Dcm*{ptdLHB0`fuChk4Pig+3{{R#n4Dpu^kNxjy{@3{^RO5afZ~pV5 zeFKl^x%)gOyDo#P(;k!$;gxqs!S@*U+S}u=Ex-Q&oP%+9A8_M;_lGz4X}JE1(yxge zI?uCOyQBXAE%>e3HNVAOx5C~Yr%lYO^{S6}hU(ON>AL4mpLXV$z#rNlbp8uiAQ6Ne zD(}V3P3>^EwV_D&B7Zf5zVQ!;Zvh`#bvB-i$KZF&vlia9=mtmq+<+Y(O>X-!W-32RqVNt*_q@JYg7Wcu7Wvxj4;U^1FedV>G3_kOk zau_81N}Vnyb+tyi-jBT9i=Vg22Jhl!pt;Z)a?$VG)DFhnrw8;~$I#bSG|6X`jv(s*vWqFCM2$1|;->MzG!^99#9E5{xU z;)|MAzgwxMY88lUXkUQFxb_bc)A%6jM|{jA*=Yd8bxe-_k+dX40%Om4Kogwgk__)9 zGXMx1r7{L*(LMhF^X_=`XED;K2O7}l-dpf2YkR$$p$wY;Z3975_b9g5KK=f=^a7pnBNj7 z9*QF{XX2Q_&fcGr3CJUP?ouCUbm_8u&dh`IPzUAsAgEkHz!^KIG1^YbI2_Zt&QM{e z0Bz`lihV68m-tmp;9{PmM4V(ucwS23l0T-X2;Z1~1$z(aMMT%|dr@#7)m+=u_;bhV zym7JMl-UL2Qx&;j3S`{&gPi(N}L9q$HR04N7?hv$|3;48TfQlInQuPCiG||prt{j>Xy1^)?7jQI z)o5`ShWZV9;8dq|r_po0c?A4r2Px$(biw{BOyhn8u;M`LiUe9}as6;?hxt5p_21QX zek9@BjVj>a)U`Ql!0FibTHBgN(;X+O4>#Xv+)KgtPO53#TeKMZ#knq~;pRu=R$oo= zGf|?@+uLdvV14$VX7AK~3%R|#@(97{JCD_Cnx_cpH|~3`w7Y(DGWu=gGwRqurdxQI zranHiXLm^T<>h$%)%8CRxP9Z^t8&lpQ9q)U*M=G$QhkkU>K!0d4ukOvA5+3>L;Y5* za^3LiEhqCqmS-IB>%Z^(zuu(b`YNsCZXcX#l*jm8{1&-W!Z&Bx>n)znq5f%q)dk5T zms+=v?NM+)nhm6JzJPYs=?_rv;G*s~&`19CqJ9qk3sgQ3UXT6nYq$Orl|TBXyOBD* zw%sVZ_@LVd9Owi80C`hBjCb%+J|OV>Kku%0_h`8Oi&$@jwTox^Vv!?wpkwn@nc+Jk zU#qzP0Ct3aWd?2jBowemp@U(ua-iL(NC;Ht=@PW~^+bZyQ zU7}Ooz4c#OfxnPJi>>0V0O_HoRzKgW2jmr%$BOr45pSnkQ~v!&JNPZ8kB9s_M<&Vj zBdtoVKdQ-FaORI}0HLMXuEu6Fx@`vk0O8U1-SapIJlCc8 zRdZIYH){HeSj)M0=AFAG#v8h!)B5GkEofPds;yLAgc%Xb*M0( zWpQfoPj@zd1=Ns(la2$`+CIgx&q{;!3TJ|KaUZavaDUc?)k0`FDd4SSoLf`rlU1sf zUIW(LWwdA$J9}UkUPt7Eku$^HY3*}fY+Aw~hdhvf1*P#n(X;wWlkT+5LeEaWAfIB& zZZsZ$^!x;QFGzJv93c7I#hewcaE_z(9wD-QrBY8L$eLA0c0Xr&Z{)Fb>_GcYnCQNX z>zY2DuIbfmHH$hIwsk~0m1YMt`S~9(yy4gPrg5x^teZHKSPCwzFJqshN+o*&mNpZApWcMDuwKmG+&=+lD#PVk6B4>}_Z^ z$?RnYQz3<;k-NxT$AD^!Zam@Ygn${SP?`S#;sw;GH=fnN;BuZ>!H)CQa$Xky0QtX1 zJO2Qu(cAw3h!A}kyRo#m4sFGiwPsJ*eI~koVQX5C0C0|?*9-0$(kd7;7R_n-v;wxu zfD&V|&vi~QAA$})uYDhQ8&eK8w)dJ{L$j@GlF)y;`3suspGECel?${Te$wKRFdKPE z)SNyo<_GXzsSOA6j-Sp{fdCLXiQgzO+&5ucO5x2i!s_AomF+F5(WzXV)pJ?_c6<4& z;wA@eyD6Sm2LTh(I&@JPE-@gVUsMCU@dM<5VnH+AGBdvZg+%Qqx2gu-um5zfC3IL%p zk^v_PX&u68^g)8A(ap;2G<<ycxh~_{=F>FtXwB)AqMe1Q9JJ0PKN{r1{E_o%6R< zO`{}}A~p)BjGTN51~!5ud8Qy&}Lxd?GkdB^PP`KLC<`Bwff(K{83B}XENAT@Ah8T zeua2fPpRzh?ce*g8h;h^PmL@Ft->1RfzQ@#Yf}T&h9ly>akf}N+0Eb7AnLRGFkDE^ z#od1;jl67w9`T*_{&KJAJKEc_qYp82K_Cncs)c5U%t`rt&}((azE0EJss+Wf5x+%y zs5G*tD91x8&y@K>1YJ9rkHIGw06hDsRJo%_kZJ;ZO#VvRrlm{>rpKRLAiZv9A`Fe! zvp$SEm)HCr(y2Jh>}uAuclcgN{2UjDU#Qj3D_SSMR{7z-6ZnNnjcp&p`j^Dksr8D~ zZD=v@NDbzf1IjQwkbCB>I(4a*Rcl_uxFSJX#;L(}Hzm)unlC*DLg6|;0r=;w7Sz?a zzP^)9*&+9&ybtcu5%7?@28H1kwQtD%Z^WJ|yr?o;ZF1@@{7Z@ptL_WGqVvc(+ZiJ= zu(k9%%0b4Zv%wqh3$ExILo{ncL6^FPVt!gHmeM}o4Y{} zslLt4*{&TnmEKJXF8frepYVkbsoM~L(dlRV0S5x9LMi|nd52i}tD08MbBSm;GxlVz z>f2jzWLwb(Z?F|s(_s57VDtbW;O?`lQK7W$>bRWCSmP>mxPMcv29BR{Xa4{!{;RtH z2G~cc4k=55^}6M;r@6S@?`vb`Rn0FCwYrW0?6#)U`_-rN1$HgUaD$fHcxihRTK?Xd zpSssN2jH?4d^5NI0KDo|oI5g@Z|5taBv5Krz8>gQOx34e;Pv*EOniha)rNtj*hkd# z>uOFLJK2JMXDcX#0KgrPjnN1Injs_tSxlsZg8eJF4*Q8TO*>rCt*TvJ>74ZI(WKsI zx{ILm0lDQPZp5!N=^h+$matp>9m6`UM!RRafu`S^pf92$)ifR`(LRnmcYn%nY3aIS z4*uTfox|Y3e>J>mKSg1KtMNgf-Lt0p;2wiSagPvP>E#cj;9?ykr9UW>Hzy2o`l%e651W+K-;Y}5> z*XoQvm|J=}puth#?i!#Xmk;SI9#)k90D`@zqG?owQqwG0KeKMZ`YeJFTQd{O{m}|&C?fzSf`kHSK|r#fL?nTsBp@XSNO_=tngR~+j_4HhLGw); z6dEsxo*3}=98xte=zUvL4T^X6;5MUtozdgS{tL-|A@B~jz*>l*tJC(DbzK(s)PeR@ ze7~~q?4N|McPkBVNwL>7%Z)o$wx@MxUA(WQP)I(0M0e3}EP^-yJ&Vf*42VuJB-W^akz94Yj5tCC;p^x!`u(z6R#hY7Fvs=ha z2Q|}`9X|H!O}(RgVR2U4?t{fjRjE6b%y&W$LWAjh%(xIoQcmCmgh>!SI9@a1Kcrt6 z={%J6kE-i-;~(h__H}>TZvOxfS8w3Yqz4A^31uxxwS5lp&@9uN`6XE1}1t;?uZi; z1pWvE%^;4_R52Lb>|s=RmgG-V5;KgM>VlaAn*-pYBbaZuRVQ}>8_V)3IKUa-ayn%J zE{vX&Gk~c-Cv5EAy%d0S3_v(N6kZ201a%Tmr{;hljf4)8GO6Lfd*Q^y9;Hj0tPeiw zbQ#TYOa~q3JHiaKKtgB%0Gc5P5)gy}X(kY2^%e%)3YZ+tk2P**tYAbehM?beo50IY zbzuM)BtY|zVeaUlMTF8D7Ec+bUJZyET3f34`Y)$Q$TwT=C>2UK%JbHLg_7(tlO9NN4&XmCuktxQz9b1hkn zJKlH5Y=X-7TdQ#SrAd@W`$c2jQnhygT=$;KXt?3~TOdH1ul?toAAnZQr2+tf*`o+B z)U@jL218gp%DktgQfon~_da$50bjMT1V(mJ=>w_sP*A09LY`^TX8Vypn(4nst!!xC zE@?ue%V}yG;=Pr6cPx(Va40^D^y-&Y zZKdB*)ildH`*#OWx}wU=aM-oY1b%AjJ|$4W-6DaG-e~kd1jf^uNMSO79%vgN1a$L2 z(J4nnN(M26zn#(Mk5mUtAsNbj&>s{>syZftbwX(k{E#1#5RS+MLTErARTRn)385~i z8UkHYKpv<<5C}m@0|-ep2;nr5C?8ZLng!J~kbo(KiV6V!C@G|XC_zU=2Sgz*r~@dU zG4&w=Xy$egnFHXw-F;oxx38$sT<5wN(YfdX z`T^lb4F3Sp9}je0Ac(l7Kvb?rTCY6MpNWrx4KIp*kK7ThG48RpucKWV_w1fcFn_q| zA1GW)j6ROsTcZ0)+B2>7%T|JaV11ov{{Z2;e}OC6h22{-I7cy#xW;$*p!xH|+*ifk z9qMnRVRwC|R%!jMopzANe|np-@sEo1uY~?SX`EMgZKUxX2I-o`NT*7pT{iXI&;oMD z9>zzS>ikc_x(5|n8-5|ut#9dp?z*cz_WuBN!z18VA=Q42{5expp>?C``ktRjl^api z2o;75!(3pGjG*ssh=NEGL5xDC9wY%IbREZZga!f3;2Hn~ocf?2c(h<`9sJNUlLiQw z!h{k8b>Eam6N!*Wz)X%-112Y~$SL(Z5;lXfL_s8(CurYf@ZvWlcPcdmZzZQNJ0M_y zAc59na;ZNqCOSx-hz}h5L>-C8s%Hjs=0*@RB$&yb>b9IFu_h!8z*gkTVsLTzE6p%| z&F`6$0LNq(sf4983Nn+oOdO=`&@>?k1Oy=kJC<|MdwRmeI2D^YSc>iBt?c3ekueA< zg3uaV(evx%oRW7kL6bZBCeV3Dn3Fv|DGZ!^0guT9y92*&;Ypy$-cIw;ME#@EI`&T_ z<8zE4W?{LB%=#%al(YteB~LN zl;957$%GLG2_Ah)n@2PO2e+E1nb^$r%9e5>0Uok}T$a+OQls3~(rA}Bo>0&?B%X`U zekpw-Ep+2sP2hI2_VKdEYBdDWrh5A}{qyE=>bK9N27$!fO~7YO;SgU|rNe%;N7{xu zttdDIn2u;9b_<*MZS--aZsy+c)x&GlXbx_jYU9a0s#NRf-Y#{^X{~H50c#Y@4$UagS4E34WSDf@eCb{8HSU>w*1q2IgQ!#lbaP^VR3AP# zBIsLd9?9f2mDpJ^)MPFBq{IX7KqLoF7dO|m%dQ;a8{IbS7G2m^btePerw8MM@muzv zaNElYH#Eynv;dJGWX?hf-qQAzV93ORdQSfUqSh`O$xw`Aw^g`RY_ZcBlb)Z_0Vk_2lmP+8dv;K84ryzm4kO7@uW?F{ijQZe z<2$t#{%f5kqpY3|NNaM>_edWFym1E{aK8@%b*+0& zv~zyr>$Jc9ktgt9JuP*;R@R-xwT=DVwL7N+R*kh+FjXUI4LRLzJSX7S9C1sVTHi;h zXKwucYfwJLq<4ewAAmvV?RV)V!8R2OH0Ekrn}^<`N7=CaUP1g8KZX90_PjyFmRe1( z3hGY!%~sRqrB$^az)W)%fw0`=T5w0vpG2@Muf>{;ZC1E~ZLQ{w5#&$Wci_8+4)ETK z!TdniV6VaWihfv1fUQQjgScFnpp@Ah#qL&7(jedf`X2S4w%YB$?{7*B^<+~ z!T|IgR}}hI@p#aDJ~~CUQrqoi-o^&)q9D{i95>=uX02M4wY^H$4;1KAVSC==hO`MJ zpGDwL8hF{9Z!|Hc;bh$MhV2i4O&C6-TQ*X*o_?KIQl6j|XvS+dZ z$G5KOG+@ZY_Ufcg&@tR3^B!GibO@MtQaaEj18N+VYS>hCHU9lSUZeH+FL?1@gJZ=UF{tR;q#H}R zC60Xm09JZ9d4d7>FP=J$wS5m>xwbWFzP*)qQ}&dc9M=|@kVXhUst%y|fCTcukl{ZS ziPf&G?Hd=hgC0RJ)1QD^o~OlE*Fdt|i&{scKGFF900oG*wYj{geU&fYR3Lrcsby4)?0HO)9gfTB7K5%^aSny2YSuL-()NREu#B9KvQKbv@LmNBheS`o zdJpKW#dAYY;Jequ=mUGF7k%nv`|S7_K7^q3Fm?xA4f>T;uFMr-mpngX#dV$?kWk*aMp#{J_LJmMs>C-8L)^X~BTM7LWnNiL` zOvWPt1cCxVGz2E2Gla)!K=<@OGL+#6A4E!BQTd=~M#*`gXgm3!B!S95R3LOf1k&vY z*dR6t^GKY2s2#UJ=O~#+q7RY;dZ+lMFm@@%$N&&GLBL07gbq@fKtv!B=#cV9L=V*) zguK%@KqPyoDRw~mBdSAm{bc}zr{shIN@NtA=)fwQo;T=FNV%uYQhh)i8Ygv4)pH$4 znBQg1d}{G7+kkXI^?zquUbD-{v{*>M%w@=d@!TL>B{dVo3-@2Lp zs+UGjcXjghTvNcF2X`HD<+ZiNGVLbLF0V{rv>$bo{iBabT4TSYc#B?-+h1zBg?xSI z)u`kASGxQh;2VDrxIT`YIUlK4BDM8)k?+)vhxS@9J}0UT+%>FgTG7hT003+N=oFbC z6Nu|59U?L|h?NnO&JTY@9&L%*Hz&{dsYGDsY)q1qrZ8lVu!3Ijo~N#NP#}h! z3=dR?#t7UgH*f%wIv`HNpqW1@PPccN&xI!WUG_{ z5={V+O(KDz2tX8*DIgF;f)7+C5Mk>y({qGGV`=nJpL#p1%lc!PkJ~vTb!74h#$=z0 z2@H|SC&@j5j)HekXn`AfPGwaQ6NB1JAV5KZjEN(vs_s&72!XPU3^amB9TZH#&S&O= zc;+PS81wZ?IY1}ukI%^sGeMHr4vN=+3kk%optD zr0fDt8hR7lE`vskc>`L=rasF+0Bo*)kRBMnfq01C>9pKVV?VaPj@rq6-ar>wDKu$pp2% zcRdhc9>4}88)h<~<`ClIGGNbjd0LbSlgtLtsJXnO-P&hAk_sHYk@_r#jjG;o_OoNI zX+(?b3WB2>xTxKn!{l2at5Z%}zS&fs=TjgPfMXw;4{q?zzh}g{6^^x~Kc3R|n0rCp zj{D6%V8|oMX8orz%ukZ?x6$j3hYWEO^c_aOv(a^WpR##$3u}{so{fG1^M&d{4LY2! z85o2Wn&T%ub|q8}_jV&O=%_TA8~P^FOL7V6JupVllegOtQo~SE_N0He!t8)1*l4Z(4X9+%mo&l&4LX3&u%he+O_>Sl&I6c%!#{U2%7P>&*RX4tN-_{US zFA#Dkx~A%Zt&)1?M@2@hQ86MUjN(GK_OR2FiGp`Qa_Wr|TxK#=wQHVsxHS13eu~O4oRTxy!d%kFP$x?J~k9U9Tl4S-ZNeNOvY)hplXcNK20ZXL|} zk1||)4=%xaN9g_Fi|Ez2;(j!>0qu&mT6Iye=~AftoAD?!e@4#<&kx&D;+`U-%d6Z| zn@SHEwx)jZAHL!89;?2$4g?6qB4l>!-zfnGM0|RnG3tF(K_W?yISIZ55PHO+q`?Dm z&~!ioI|+oGB!dP&F6jd#k0bCyxrW(2e8K^yBzDjFsPd3;BnUz41e~3>^id`O9%LU> z6Nhq;BbQ@1Q9Pmu>F~l}&cx4`M7n|un8%_BmYv4K8>C1KEhnJB@=P3w$4o{Nb4kN- z{17RF%zA$~P&3rP={QmiGC+eH!hyp0STwkBmxG=37`(jDauE55<(Iv0)!y|gdqhw?B}HBjpGXyv1m9E z*U4s9GVz|uu{moTdAX2MFd8O#NS}{HHR3k|8OnsZJoC1}Nxfo81|bDjp8jb7IkTAD#>wVmU`$736WEBv{DNTm zZ;9%u?StNPI8_AmME5D_w=YTBDji>t=8@*nIo?6=n^&2=+8pg8nU8S^Do zgR^!)9+EPBa+w*N&NJ0dl*9}|jwX7YqZmPp;!Oun;#~^sN!DmGy_L&3Ue_5j(ak*w z+#ZX<{w?@*sd#s<{aWLm<4mketnWi$R3Ex~Jar!sz4+6emK%$>b4=pR0^>&3?Y^;T zTxKxlJEPiqICuRJcw2@w@o*VueN&dH!z!P>UHBf06~mlZ`X#p7tNG~c+Q%io-tIj2L9^Uj1I^8!UDh(a z9$$69f-$x~=C)RHT~TSE=DwSRhp>ViJc^A=Q&SFP@5kN|b?!07;DW_#nd?KGBAoh8;3v@?MwlBgBXC4Xr*I;tKx&`+m}& z`Zaeu{@X+ir}x@7?lawa*V+5c{N-wb>Gzm z(`uJEf=@KyoT-Yk*$4cUlTHbO2K%Wo;FIUj97+rEPyq*&xb9U(zXKyCH|nwCr!4Z% zX`ZS3Ou-}=lo=A?%3=%z2lYFR#H%q^-66!l^GCFk6O+^UAiNbj#P*dozt0`}D<;&E zF&#cCMy^KWoF3>eTJS`YpD-~h(ba$hCqHQhuxq{3f`amY6ayPVw{203iS5}xX*fNi zP**MhA0!uGeyZQvh$eB=kI_lBL7e>iAh?{AO1E`Lz;u(@Nwoot`bOw0XXDiex~0#J z$Ei=8K$8e61pQS$d2pcR89mTUoMWnU{FP6bM8-O(hk|Er zvVyR3Bol(D^W)F-QFTKE=jMX5owr|tfp|F?3f$EhA874`4{ICmo~SN)#0-q}1t&fU z0Q{AhtOJDm-lwFhZn%;R;E3s*puKfMIz(=%n$QS1z&MO6A8jx9o9>c&^-1p=05-`% zc5A_cV4dKkYx}d9m1E8XM3~={O1Cwz;z?*|GG-wK^-9N?&_+ZNxQ^<={{Gs+(f2xq zcF>^4ml}>S$~{WvJbU9e5AeCGM%t*=H8zM8Eu1-6@9jTf=p?T+ap#DfLB^L3cCB_> zXbiH}k>#e}Ugyl9>wYMB`&Ox~rtoNM23YIzGyVbJ%&rAzYp83Qy*qnKR~Pz?-AHQ~ z3+hyP{QXw>;g5s-OUHF7+)|=+?HHeW{^g`K!~Xy+yS(~i&3f;{pA7hSfUOHOYi@hz zx0bE#VjWti$L^0Ik5nA*!5;$c_+`|!t}bmGt!zW6T91C6q3(J){(BCSy6-PJ-`00P zGUx}+B_a<}eEm=^qbQgW*m|L-Be~fkP9fbl?0|5d(mhf*01bvhCQdqRfM652>VZd= z5Y)J|E9yheC6R^*}e2xE^EaI8c(% zA%VHh*it9Ap%H?ZILV z=ckfI#~2@)kpxKu_6jfCw1c_b1u27=1Wr453oT_&+0Yn*?3H0{Ogg(-2fET`L`R~_ zAY~*ZP)Q0P!e|7FXh6_}AW10{kO)E$3XRo2X-_-1I8~5?4D*37{*kaga)92$8v{L6 z&31b#r}qv(=%|8csKL)<3Ji{u=A|YC9Cd{sfdVBk+2uJMKF&f0L4h9hDGzseiH!A8 zr@l@+@g+&5z=M<31IPd!=Lxn%$e0p)rH)cQU+4VwQUV6f1JMMCBRB_tM3^Mwr0J?Mc25%!h=`M(r6YqFpUDFR z4uuap^&VYvlz|5$eDzFh13?gi*8a-dP_(aUdv8wW-momGN~1%V=Jf;><{uY+j`ggC z#;?F<+u8tXRMTod-=;eIHy^Y-j(p1WpA+laR}5(N^-Xr_m8G2x-2L2oHKTG*Ko^hv zT=BzL<562p(%StqKqd_)x+>fc{KpN4_C`C(4rQb2_xd$ywyEwDr0%Fxq~>Ia9l{R1S{(tz5C$`aXK`;d$O3&A zJJWT$?L2`-sdYd6I-c`?$!#`VV{2WmZS@yXbHD}7_nY$F1=FqlnK&{gWGPaj@Yw_g z9P)vU)=GulrTCj$iglXdmV*c6s{LFBKx_jMCv+J90IHY1m3kGcTV7kgo`uyT%Tkku z#1-6pGVx-Tvr>kM#*U?9t`W&X{{ZaJz3HBef0oDaTyC8nQetF`NrejbbZ+g98=7LH zUC{46(0dHA^j*tQrLYghKs=lXouC}AIB;i*TK5G~rDLm8tHeAy&vXYL^s8q70A=5J z4#(yfcHurI(74LP-SEbvPVKD|QiHw9^iO9n=i-AnBd9QZqbfvl4>5uO-BEA4M=*#H zo#jl`z@C8MK=VMuyWos^e>)~$EQb@3(iJC?NOtp?J09qk%cGhJ=FUA3NvGbE-{z$E zgB-E&>Z$W?=XTmAPm+U-m>s%xL2$>8Uwb_usI~5N83qOqWkiw)g9(QSn83%P3!v@J z$E0>lRUKku9hI?gAb~q0obo^oRm_t20!KL?1m|P7QlGYQz>I7P zu@yn(IDy}FE^tA~-)X`Nu5t_m=bq}TYhY$URy^4Rbo?@#-H>Esq5P0!8(XeKoJtL1 zN#+yXW5r_twa_tunW_wl@4j$@Alk+^0FI}sO|8&(h*l!B$!QId(M9!op19cs_^ew5 z9-oh7dthw6WmME()c!r>&?%h?ilQJQ-5?Fp4ALSX4BdkuIg%36UD6Cg4h$WVf^>J+ zz!1{uGr#-3U;Wp!)>-Gxy#3DFXYYMo*GEVMz4F`gzTQ<_<59FN?we)zC46}h4sJh# z_(NF+Y{$j7SsL#n>YKoUr2~!H0+nnkio(jT{+D{MoJP6)?Kt5NT8YWf=#2skVSRjM zeyfDP{{ZR4?e<)_!|RYFptOrs)M^1{%7|js$-cgY{)n2Qtc`TJ87T!bG;=a z&G`ta$Y>j(EdHBVOGeHVX|~8Q?}Y9{nzerb+d=sI6q<#Hp9>c;Tr(e`e%3OkoH;?- z4Q=%`NIzdp65;d#zPVus)=tv)@Ut6PJDT(x6XBw9ghdD3%`gA{ofmQ336RQOLczt} z-Y9x#q3E5R^b%_{JsT%$#s(XUh^6uc;>_*d?BJvCv%fky!YmKO!LG>2ui8BpXHL%k z#UD2?-(}q;qtZpp;T2pe32xMglhkH+dh@2P#7zf+e%O!czK{*S5PZ+2_h=c6geYP! ze`Q-|rCK|DV(tHCRIym5!B=dnXMOhJvStnwdb3;S_*xfMxR_4o;95Zba&|2_ASHgb zvOy)iHEmMFH!<7HMk`bNwly}M+ebSdTude4X;*y4$9$+z9DEWm0w zWl0H=;6Gt9Io<&UOo_riw2ncFL7Z>y`|oG2@3wqxg1p<6H%zg!VR?(bs!pMk1t0Zt zuLfDg*gDQ+t9rk-B!~`M1L9^?A{6i4=di}Th{^i_89Gk^G`_(b^^kp{oy96umlaZfgmVMOEG3o(^H@{aU`+F+P=t}Iz+%+jd& z2c1`z*&8Wm2Ng}608+q5+}{5G3RRxKf9(p697W)ZXF3=d4d%$IZiSrvX0x?=Wy^Ym zNqfW4Xn3nH_3pEDjL2WsxW`Jc*T+3$@1$m#QkQv#6BJ1F4e-TB>CX%DCo0d#_$Y)r zM2>a~)+pEyIDS8dip1)jHk?Am*)jC>6)9y4swZC*t>qiKqc;4CH#1yh`JTAf5XJlS zF4c3J#&=bm7bA7Gc;I^ty#kFRS#Kk4}b>Dc$HVb z*O${eXz}M);xEJPYQRSB{e{y0c}!$o?t4k=4_xb{ni1zd^F@siox{Hshh9UNPPo=c z9G4-MQe@xcgxK_E8>V&3r(9oKpjn%{Jj9|2VNQxdR$J#fs)hS$L^A*$U`+O3Z$WVy zNuuH{P_B(J6H$OW-5qqgDG|&6|Q{PwGcO!ziT!KI2(kRqok`J*Z zY3Q`P`!8E*&Qx-KQwClCBC+MQET9?}5`UFd(OPBdzhRV|@_Jeg^XB zrvZvwdOa6vb`os1aGrMDosLpY&RMMyTC}wO@OMeOR8@06a8*i8v(#=_&S)LJB-`Qf z7^sy8-xCH1Wua-aGrMa~4TS0i$nur6#t%_*cCRG!;7vY%dr?CIGX(ax&NDDfe%ubJTU4DizVug9<~mlUrw;%2(`{ zS*rRafS0=NVpQ_6Pv4&d1%ge1?z=6{xmOdtK3p6QbrdL^dj%J}iI~xKi8Axs_u9sV;u906!9CJnQ(X$%2{6N~-^@v2 ze<(mb#oj|526J8&w@R!j0<0ZU>=e+SO}OfcOXI$q6e^OOXMc^*DU2>fxzia^Psdh< z0!b$r{pEve>Sw%COp50JjyH&s6}t4uLed$TUR=$3GAr%|>ph{iQ(NvWXDQvKgWfRU#`9 zgS#&C3DAphMqhHn)*2zkU+CDzRJalXRc4jvx##4Ivp-N`_|y(At4zZc}5Pl#5N`1@Q)x>Yr;(AkQ;Rhc@^ zlA1)ipoU&cuQ8atZC`hKGGjXE2ScSyTuQ^C~oDzs0)S==S$ioo{pCQG*>V@;)vk$hl<| zYcT4y0xQ8-xx>ED@UQP?A68kF-YhhldEmrXF}XEKKcXwIc_YX|J!irXeUanYc)G~l z?m@_)L!lx%GKBN-{BP2aiBi!N>{@yJZE}5LaRWW71G2!wn#5GB&>$R~G3@m=R;S8O zf}{dKlL_aRQR#BqJrr&AFJ=|jTr+~F)0I;9Z;@qtjDpUkqZf6|cto+AF}asUDG?F^ zJa#PRnl?9r?`}UMEGneEzpxGAPj!ElwCtJp^<)tovfjhE;4F47&F?_5oh|y6SDxJ% zYv)Aft#6r4{Q7kHt=Q20OiX_DUV~=WA(wxw|ANmUFQQC_J*!n>Mq`7Qu4diwl>uUt z4sIienS``RdoG*DL&uhxT&I)z?xcn^RRf-ax}4x9p9_I~b5f?U`bY<{gSIcnHjnJh zSX}L$58joUj6rG}>q|qYt+rxVnpwjh`_=|Gz%(|b7!lJRK0(vx8AnxVeq6DLJ}>sW zV|^y#D#B|#91Lm>-#F;_8*@Ly`ST|y6AZ(YOx;28y3+PsKyglatkFM8n(~yXt`RKS zS_#ZWHkQv_u{FG|aK+y~Bb2Gyz$IWceWVifhCXL!vv^XuZ|$#^D@u063ZJAiCSE<) zogru|HE25_yaR{xkH$us*&Yj4rn`R$Q7k($HDTvUHAo^CV7ZzlL-53^4=feQOHCiO zE+m7KNn!H_aXn%kV6DM03~~8YQ(ug>3z~4}_&EpwbjUpWv4mOX%V7}GSU4UWW%$A0 z*ol;%|4(hkBf!&WeFI7ZujC!*%X`R%yGYz6a1uOLW**+@e+g^SIN z9R(wB-N&aA@9KLG(gf0LU{v?HF{)%ubw23rK`Dt~TdQW;bG{hirbCz+>SFEu(7t67 zZdMw;>!p-8uk*21n(t_6di#EU^!x{iN7OYwT^^`ltKzCGYhD08C{usyjw9+lOnKQD z+GFL@J29qHF#=YPef8xL2DAd4*m}!zr#I-%01{w3fFYW(KbG$wn1PAl?gR_|yRR6R z=LQn7`JbBH>y)n(oD(vs<{yd!i}h&Ret!!#A~+?|cYNU{IOKq{t>2la6##?$*2`Dk ziUCt2zR{1A@$;EHdY{K6er!lL@ydh3b*rh!c$~s=MFCAk(x)KK9qs8g0S9FD_OdK)i$oS zu_FLeYZ;@8hXq&|k}J%gVB@_S^ypKBr#+YW#dNIH-or$I=dzzqrPA?qt7UhS{cDf; zw(*SC8DSe;h?bHZbSOZ7>Y!6vcgB$erT_~1t6zG;MPZ1jPj0Lj`|IhGe`;1*^h?EI z75!KTCL_9h`r*qr%n*X&OH4|*iJ^1kR|6P{-+ma|kbzC4gzZRe52QN)jFwI{iz+Q% zX!9$CHy2ZZF>I6GdT5azSB_e>YxqN6@tN$ex%C~Ux&qcGB?t7|h3Xgrq1pq|d-WgS z2-BUcz6khRF=!s@p`+{-SBwVS;$u_;@-7wOJ85GFD$yadxtr4GjlISH0Dj~c7(wAb zz(DEbiFvdcKl9Nq+lH zpSN`LfHZr_WPLfiOYmI78sD}F9SE?>wKtHz@ z+B}TsTm;?@owCuJ@~7bFdO7j_=JE%XiNcBPXb(t{d8!GhF5tk4J+v2V1-{7Sls%#jNkm0CUA`eZhMq!h#&Tyewx)7Z2Noqn-g5<8xl zgY936VhU*1_^N$mps!KlEV;&D7vm5c%--Nk=?0b_buAHcRyxW#Joj?Dtz8c^BghR8 z<~G%Lk*a)(Hzgj)>s_psu8G#Js!6^WV(<|AI^C(Mf@mGLV=7ZG!2v!-kvI`e+wWbb z>o%g9o#4Wo(%`mm{E$x~o{kxqE2 zA$HK@94euvojvh>GSleBY11WONnCTpGjJ`N?IvTv*Gm*8{ECIq_d3bB=M}7QA9T}0 zo2?p_T*XBFV0l6yoI~B9j=E6Nnb;dbH~Xyu&&ydb-u(C(3Ca`34a_6J5+*r3dc@4& z_s*M%D4MNhrCZtf2!H?mB#*I5U)GTGTUP(mfN+zU9#&>CjWSPSRf~FIC(cl`MzQuT zgzXXQH4>)S3g@1lVgf}ghE<~_I)|Rf0ufxH4LQ6fAv-xgi^FZSFv5`e!cR`+^L8KT znA>8F+?SeTIW}9#Q!l&t~mA6odl&OF-SB}j6cyBkdyC- zcp?6{0UMGXPVs}^eWKs%T|sxyG1D{a;Ww8pi8gO1AT%rN+W&wmQo|1=oiFb5YK+nNLNE!W1U103(4yRDd;v7qru64SVQn7 z1J#9>4;5X4<>MhNH=HDN0!R+ri>v&v2>L@Uq5F8vO1%q6YrOm&)m10Jx$1qbXtr6K z@>3Df{UymN^fY7S0-KO z<;~KbeF(k+qtd;j1I*JNf$#$hqE2Q1d#E+xp*|{IbO*eNUfravk;fdPWmOsrx$_dzYtpb?35ZWd=*& zbM9FNfW~7oi8-!Hxm0`-r84X{^f8g^>xQz3-W_*tA@oHOE(7TwR+KPVN)t)Yw?~Xv zR~}jMF099$Osi!-tUhiy3uFK~(M=?t=Q#-GKS5gL=`mU63lF`ek@=;lnlmubh^3oV zAl$p6CmEu5==ii{)CBl$H1~U|VUFalaBBVv2UtC7sgiQ2HtbW`BoeOx;g)HQkA0F^ zxxI_N2X%GTrFmMRXyhB)j*ee4cq%u>fEWGkLKEB^ojaWlr$JSX?+FEq@R!AQ=pFJ1f!A8~J+5AN6 zj9#POw4seY?EL%(SaP|G>2ctCH)&!#2-dozi}B|AE?5CrSF|&de5YDV{8rTKVqW@B+3r6!-fRDvDmYV=a z>^wWia-?!OI1Bw3NOBhz?55(*bW3^hc@c~S+@ZZ}RKj6n;44n20UaW9qReEdHTvyz z9-E!GfYlvPkJax+?LYBXXZ}0e5H`Z{US&9Sh1-1SNc$Wae?V{edEsuJHfqFcTLMh2optX#A-m4mq~!# zlDO`L*H;yV_#5^vUYVscjE?f`%uI8Gpzu@g!@cYkb~Pwi$ z(=M5SayXj@lNXejhw^k;COyao*Ju3U^enj%?7z zkYN)Y-hO)iA3xA|{(^Mtz`Fn{y5X>4!rxq6jb<%3CMO~j-u#2In7PJTGzcjuL#Dv! zqB+!)ziJSt*{+?ogrNdV!8;gVWQr$h_P-Qnsv>K6>|vd)hsWht84yiy@%9bs^{P2U2I*NfD== zh4C+?j#6l^C?63I!$a2TJ-b(qM45;~z%5s0s%(zKT5cdeZjwE0?_g43etKjvm?@3@ zjJpmaOXB$<1SQ%HcL*9}dAm#jzQZY*u6N(1bDKtZ1gZ>vCb)jEhnvqEp0JVY=YN1= z2Po^bREQPx&tFG6tA{-K zo=zKT+7nJV^Io`6WFA|P8RoV6@VIupjc($+Rdh(eX%86c1a7twxQ0IVUg;U4kkFlW z418Lx+TwLvaZigrQ`@jHw5OBc@YCU`RB5Q)mi}DDdJ4Qu=bCD>l{Abo_zXa)Y6pr1 zr*TpOC|M{-V%05h0i>eKzW%mfE@k45mE(V@1JD=>H_U9!&=l8|UDlv~9r7Ga|z3!Xr{!j*Jm07?(;g zMj(5Doo}NwhfIz2TZwP{uYKjHQT}f+`agA#-BykQk3cz>l0ZK9Kkpi$=YI|(Ib!=V ztZoTx6EU)~VRnaS5GJ4UvZ|*1{?%=Ak85>yWVkprTO{Ke-zVASXL?aMfgE7TdzxqA z>{xMp!N`v!)YYiWLn|A~QEr|me9{V9ga9#dHUTQGjJKQQ)|;Az=1ipSk-IMFXfu13 zCw|pH@&*p+gD9W)R)+OW+8+Ix9h?29*$LpZH!p_$?tjTYw zewRWg{D(^C)eEa&H=v%%QIpvTJ4sqpZexLhI7G^C$3ZnO8_Erz3mkBaF&!w3I^VU% z4)-`;5S3?j7Fl}pMudLg$08XtPxec`E_uTadzaFB32K;5zbuSuJIBN4RmhK^X@!dtO?eZCd6uB%JBv&8vzq_wx+OKQg`q zma(W{I*;5iMWRkKZ#8V98f)8otYg@* zSQNG7fC4*`pow4et5$|~_+arz%XfVjn(@4(lz*dlp`SK*DT_omu)x^HE5SGF(adLd=4q;j)A1oI9RmsvPetd7r9vH6O`OKEy>2guP9l8L5v`BSIDp|XB(^({M zLrsVm{nlo=MT?oH(=R4nNx`mH8)v3!!LJq^JEw)tXPM^_ji@)j-Zh@$`cO1JMRV;- zn5*{wcsgZYvxtSlx;H30mm-9#$<$4rfuvfIwULR!eo`iCzEM8kSY0-TDPTXR9)65x z=%ScA`x3M5AsTO6H2QuX4`x3ME zHf4mp08L&zmP;*n(Q6ecDZG4666dDg;kPzqFi)D`E`jK9%~OIUl$`K>GG#p8O9_ ztyy&d`EgQAj$sS(CgY*bwAJu^gQYZ;AE>slHs=G7AQrdFrt6Fw{p77e0@)}w-RK8?!!VGgMVk>+-JBQ6_tIB-*#wo~-tTMsj_Er!vLUng9Xh861$1Rb)io0TYHA0O(V8h^YMV6 z1fSc@tHJk?7oK~`tqpy04eo8tUChce3mAIu0^@oiH?ZY3U-PWq>DQk~TS;bpWE z>GRRu@m%!@36Y@E9oN}4`-M672@M(V8tF^pdVtVjtfZpylPuXV;nmduyqsCm%RcL^ zqo1$o(iuZAyP;+23kYCoF8C8Gux$**en)f;Y#mtT>?OpeV4GuNgsYI&ZJ zz|h@&0L?m0W%&W{ZJ2csI@ilwx8zFkOB~Ei&5VxK%Sqch@7N7~Jh$*s!w2?VRSuS+ zg$P{UaVs&dnl2fg-CB%GH3SI=<_gGQxDN!+v2_w3u~P(oBYBL4hgk;y-#!@QUHYGO z@c%A_WjJMAg89-ZKA7kVEV}aZ=~ppN@LS0ZO6H;2M>;L->LyXN4MAy?K?HQmRPNQ^ z(s%i-uzd)nAIHUCC~x;q6N$ww5~#K-s{3()F|>gr38}rby?92`9ZyEaZyaA@%8iBh_|YV**jC zq-6!oa+-S6s)UuWsBA!K^PJImL7!$(H(r$UJjEBt5A4bk0~-6}2&}eUA}F7ggG*qg zN^AkjnTjAfnOwPS|GmnjY2fLA>&(w#i9txG^wZ#Juvqkv*g=l(TNXLeiXXh3iuX4! zZ;6Rj&)F2$V_QxRMd-Jrhe1NUB``;g^4PC9cOb z-E1C|7bC}dXQqPlNsyTaF4O^}?PyuLiFWx=Yjir?QXW4jh~=0ujN?&*Wy|hmPlw()z8oj-yoL zV%M=4s`~zy{K4O3^n2GYVGG>#f{iap{ARF%;Vx^jCb`AB;Fz?(hH&5q&xl97N{Bix zwpomlK7wafaN$6XkpP#%y@_On@wis7jI3<}innjfvn5i#yxbbw=^jl0u7gch%`o3m z?Yw*aPOTMs5gCOVK8b6{N|76_)3q>7gvIaMFi6izj;*s1)fyC`HPtK?R+)$Gg({Xe zZq3t4@H5I>Z9zFaSjALPwYY?GGdQU@@4Z;>C(abwg`g`G8RU*%An@L{Dl< zrD8_A8bBj5*afRB5vo(I_xL0Jev)y08k2kGxBd0aW<5E*glqH0GHdz!w`og>a;Cq6d@d^mC#F8*_b+FJ4Efc6%3 zT7M?3$N?+AslajY&7UbXdj0Jy=5rk1dvg{sEr>mS(F;Z%)~+?4o|)y0dX$L?rKygG zs>!#GrHGfxc2#;TL<^l?q(p7OG#SJ%q%3UB*u4XsD{BfbG6t3ONYg|d1Gv1T0t8WH zJfjTdM((4e*625fQc|P$ap}`TLFK zB9KnqIShaS$Hs~9gN`<);Bamq)6ZicTS_kLrerR^13D!C8VFU5Kc7L+(U@Fw-opFz z=(x-a<^2ceC7@5#H{lPA|IdJb|;Os@FA-TD=~Q~UWfP@ zxnc<#mP7a%t8i|*ho^>21Gxq~Fr9FYn}L=hV1Glb!eIqzf$eb*)Py~m?(1*qvg4F+ zBfJrOSKrrXNUguIX9WR(0AN#i}n)B0dKhV6g+GDB%DPalpubq-qa}e75#y@p))j=mTNSh5>lxc0{-;^T!TFzmae7Q7hh!jX^ijQG{IwoQ~CBK7%UsAgku zGq|FDJ7Y{EjTtddPk`-0$F$CM>;JTc2S9C{vP8*+xXcssla=1Ok+05~zE~e-xp8AHA~t;}F?m|wY<&tV zkUwWp$*;HTT7J%-#qxIkQVbvuJ`RWgVTZys{$^MtEs(`7vvt3gyQgj_ZAu|9b3u14 zoJaHKm8zxw7O z5R)gmBTj$mkj8@`!cjoR-OL3vzuiHIE(#?=H6zew@ zgA!M(E&y08V!1N{Wm3Hp^R)3ho7ZHKH)((rW~_+4C9c%lW)gzAmtnqQqz;=$+{Bo% z_Bwjl-;OtHUHTCrWjFzolk||bkk0F}{*JTVir3_CNIOUgssVJ8T@M2!;oo=%815y=4m=H{2dBfUF|1H&CgfeWma-! zqeS2G+wi^Rw&Xx|D&bU))L4uv{sZ8Wjv6)++A)4<7^{G}-A;zPYZhUmqF6UlmxZs& zYtzBIq{T>tXsiG|D?bpIL{m4F0mt#1- z2uPXW2cB+LJ6&o72nG~RJt+mxt>ZtoJTg8o*N$OgmX)>l^jJ`{0r^@*39z;J^0@WR z@0&~+%H^~g)dnWiDh069IQrCFoVa#SrJpIXCI#tO@m?g+E_jJ?&{m@B4E9d6Fx6tQ1e| zg*9P|g7tAyd^`}N&|@SJmpyPRjCaS)iP5rw3#tkyW?7fi70Cm$i_fI&x^&06KQ!n8 z(}VbCva_|Scl@DwA!+01P9S3Axl-9*jOM8n(i$j7 z?;X7$qvqsU+>j^pQPEf={7|~?8WxLxwU&$&@P>r*h7fZ#$4{dwrjNKt0xk&mFEx{A zn0esMnos8UR(8Lwb^o@>`Pp+7`-`O94t4YHT?F&xBf}p@XyiHDBbJd!ZxMsSgF5u% z6ajyxSI0uKS0>oJt%7`Iz(v+`2Ja2ei^=avyso;#Eq!;*ts*zC53)5 z7M5CU;b*vFnOmrpozt|j>+@QNe;LY#W>8Epza9Dr+=d#gYA}lFlUJA_@5M?2$#3c} z&Lu(f=@d_ku7ZBn)V0s-h7v{Jx=%uk(|b>-zaWgOZqb zq+rCLSV3|x&d*Ox!1|`DgC z)O6fK6Fd}%w>_}^=DTidrM`vC!cmd+lgs?fb9ZzcC%R#zHf`I}Ip|U{7r?E@O|149 zu%SfH+D;v&fd0>%kbaRyhUv{ElN5F;e+Gm@L1W|us3gpvN7F_!BikJmc6d|!m!sy4 z8^0yutacrv7Leks$3#shI2Ol(U9h^!;)0H;Pt6L}hn!|Yubj1~UuQGO4Sz3d$Sxqk z+Eyozy#BkN5yQD|+^Tp!0otyu;7%A<@7tu%Z7AXqP~wZ7mjH_Q$4e{dLUETCMZ18}Ue5bh!zZyT9M>*zpz52Nn=ALlFlk&b=h|#l- z4nY(WbO>x5AdNUD9sV)HhE$Hg{YsnAgSb9;7k-(h#qjqD?MgupXy)fZ-7lGi-}W~{ zZ1xsr8GlzNa^Cy{aMBMm!G|mkh7VlX%4W;$Z<&%MBB*h%d0vOvb?xhBb$CgsSruyc z;YRH^Br?&_>}_a|*;Til%PjkRe*4(ojO0WcqwSy+XugTrsx8C#F_v(UHU5NBp)AM7 zW^wN4-`QuRS3YiChAI3Jsp&&8_J9xyV(kcNEM@q`0ijaA3#7 zb7teU>=cOh>av#2s z+1orAz355&S@kI}L}W1d+@E5mH>+IhR=z2^i*ur)^D^CEN0?Z@-P;pFqNd4xxkKx+ zoY5op?(E(SL;rH?i;_xc5-rX%<2zC7TG9>lw9#qZZkT{IWEf9}JIdZxuz7AEyV=Ks zu*DBDS0h-ul5t`R_Z9eX#xs15`!W6 z)h~#t>_mIjYBVT-T-a7JIz{U&*^S)d!zv@|v27SJYO~}Hf`Hex*EK15Qk_U0H#vxl zNs(6UR}P{P>>~0TSk}}G5!4}<0Xz^0zBkO#pGwn{rw{n;fItE3V#xYbKA3UZ2#V=L zpac4cNqUpjxqF;JY@7@*qhH@MwCdT9xQmdOEocV;hApJmU9~g8eS<_J8rc)nm@fJ@ zp}LcB=vGC{=S-1TFW;;AbU+6#GHL1!isl1xCMvBXo9ebN%{c#q%5dmiRM@nE4J_gY zBTg~>W%Gv>V^lIa&z+K|~r(x5``oy4Lyz~_#kxVD8 zIh?yl66JRAAH1QF&j#;DK@3@>bqamejqNBCBEzT`Mz70^qM>kZ!T?DQzN69Hx;K=F zgIslNd|4tL9GPGm;Z!n@k6(jHl2b}E42Uo)G_aGr+oAE@g@I9aB9px7Y_<;>mC>KR z)CXeRzCd94&d=X_K80#@_@^mjt||Nhl-p4H@n_HU6`7;E*Q}4qOHJSI3z6L#dP?n_ zNvV+;ef}iT9tj}p=u^mE8?v}KpR;yRgGXGl+{Qc*vgG}7|_#QnsS@=WteBZUXjD= zcjkXYU$kE1`tKRBvAT4QRlJ|du+c0*hx#S7dt7^6v)@n_n;W4(0?q=rkp@CZ>1-Ns zE}-B>!()@zfGhp=nC7*uSx@K#vOw?a;s;E(EafQex@-w7ue7=HTxSjHo41+v5YIag z6=1yZw5Th|5jtm^r?Dq(4_d@v|`)i}sf zOlE9^WBYM`6L$6Y_)yw=mj_IGuTz&iQG6+b^HObrVyz5Sr~@v<(eSO7Re( z&>$lsBZu8XpjSnMCZlCy%Y|ZX^WPV0S%txWMf*OXW}=lQ zU>A$%x{iH9m)H=inHQkg8f}^-QF%X3M(`mP|4y#?xHcW zej2n69NJ}at35T=NE}nrKw4(7)v_^YnN^P(vs2&>^xL8@nxgT$-!*0(5A*`5tYmWd zYFqfm)TbM~ZS5HV7e`mz-1}3}#_MyJAC^C`@mDjC%BM2DSOi_vt!SmC(5WE-TiV&5 zHv@gP@OogRM&(5lDNO`SN#>DGUEEVoJ9O%bDR-Z0zOya#xQ(p9L%c{~8v`%elr|OO zX!zZRor+0A9$cVi6Y2YCy9`wPmoi_2^A7%|&ozgxat%0f2YWM>D1-)6-oai|BcIt9 zrJqYy(u&3Wq#P^56uJ|3e@&|r;=g>IsxJ|B+85}imS`(ud zJwo~)L**w%rq11dcQ<~wDOme6uCAFr?FmX}{9PiJ+|Cv`0wld9WEr(V*oW3PmkzU4 z?{TLv?Vg{j*&ECnx2+%RJ3bpPAkKVnkYRBr$|3(?$GBbVSd2-t`Pqk zFv4(Zoki9pz+!-{WecyT#d~7%Y6pOZ>T{YTnP-Z`S{AHz= z9CvY0^(GeE7<>E(Y^?75C*Axmhqqs1en%vQ$_>)H2gMnzNwVY3*PcXGPok=lTVt6k zELaGnHkdr?e|r z#!kv&cZbtsZFUvm&-I1v!CYI~e*e|r^gQ4oyuR{kc7v=zB}1)r*8Dl`8u@e#3E z<$U}=@P-udXZY)6S2!kBJSH;Z8-46IhYV%*j^ET={K4zfD0tS#8&l1eiE84PMp-Nx zP}qW7eXail;mXX}OLOV1=KWQo??;xjM z5U>vKL8St^U+Jql73%+S*>btl(g|kaOal_zj#rl2)q8rNW#O*wAEB2EcOZntM7%DB z^Nr$%5jrY%f)Ahu>!ytDWOfAtzG|vDQ;l6@&YH90#&vXwvA3zV#?zi3`^@Fd_(<5;bnAJh5qCNAy6 zumhn%eVwQZ@DmighS~%oE{Hiw?F7&~CWp@R;-t>$)31&)>;@|Mci3vgVZ^ZXBvg75 zvxzHGCRiVqA~NY3<19GbFt8mxTziZ4+VUOi+SJNc&0IqUh|x1{lYOT2aDt_|c@5Kw z%G6v;nR*)eW$+V@y#4W6AS0k;c3raeuV27#Juml(A$`|venpPW5`7Ub7u-a~;h%nO zB^MF=tDV<8zq8SNfCXSbkFXjU9H#3^^<{8m8>xsz9Zd1QNCwIfA^L0hP49w2Pzq>d z{#AFeSW+>eHg zh6?!1R!6Z(T5U4?fP5?-r$796P1?1~JV~{eM|im6vU7$(`|Eheb)@yVAM10f9ax%^ zN_GWA%i2oAZ9_*q7@8jSa61%rlG+B+I%|}fI~zs)iRjZ0Wm4<{qbd=7$xDG`=m-Kj zfp9N>?!(>mbWgfJe;cqREnA$c_^~m|+x~jDsryaph+$Q8pMPlS= z$9V&|h_lT2mA!I)ku6Bip}dsbE9*_;p~mKQW^SjqrC zZLBq2TCf3=KKLwLCXcWnC^3)!8==4t3M@Q<$p0KA1ai3P|C39I2?FEPmBao2=}{8? z+xSHqzj#U@3i&QY3C?tyS(#(>@oyRX9=PJxZlOo|5763hYNoN?#yHhrpzRmhY@;*X zj6v)s>#?=;Ijpt?CWWq7Fphh}R7#8O>m8cv{pHvGK#l|#5ZB+>q{_VdI;|1OkwW_1 zO|q^l{k(DO0l`LnMCq6F&r8d8f10Qn3+|Gm5q^31c_&!5K5#7SqVb>1gx)yk&-n`C zk2Q9_KBqqVOs0#^zWLe4lP*mrhSLNKjzgJ7ug$Pr%Xs&aKvp`}cJQU1 z3v2I>w}4cR)$)aSV2)NH#CYCB5Ayz7h)S`8mAooZCG+yWd_yY39c`nPWN0}!jbeun zUNIGDYNZDD?PhygCb`%&=JF5F!?g{ya8Uf@MdV4y9Ck!jmO)0)s~T-H^fr->Zrf}I zvDUS7H&BZqI!Q&s%IM}19o+$VvK1)dQ<;vOFb}tNX+YrTfXCmc1A`%;!fCleJ`K*8 z(JDHjpzfyR`{b2kV+5V)8&MR*-j7%w}`Wi+nRhRW~n`(wUPIjVi9zjv$jU_sKAR2vxhe@sItK;_CE3DPHB4W@ZD!#`iIY@ zqGjfx{;kaLoS?Xzbi%M7$J_A){KOFAH*y!r`7&CKw$`KcU!C{vXi0K>Q-kv-nfqtY z6X`A=*)6oxS4=$a`c%pnuM7_MA&a~iKS!$H)NQKFEsgAcof7}9WHbpq63C?gMp55b zYHwIqnz^jEALW9)b&607WJhu3cSG2JN~I#p<4_VJH$R-Wk|-C=e4yMnPVm*3Fa zP`Rp#Tc%>I2C|Q2TfQ0xZnN{pM)b$5n2`3L?HjG+`_W=a39@CqQ2lZ?$M#kfEj)j@ z|AI#ShvYAf2j!Q`whm>aYILF5h~bsZk~urb{Cio&W)sxAL+P`Z+%w4yZmB^{?`W1ASb{Aa_2IZ3&}Nzk96R-c$$%>$G-#2Ulrcd(_ZjQv?vr|ok= zWV27%*$YSIJF%R5r51Hw#vVO-WVRpetM9%P=&$bVyi+#Eq>;t#n6J51G)7SZ21QrZ zkwjn=we?5Rs};)O&sjxnwrOGtb>j!Be_yIIESa;_$cQ^%YF!E4WHnBD`6w0?|e1d2a6zjaT9KEh!Bg*EqKQ^|^30tO<#L@Uq$ zjKJ*`=ax|Wa?h5}KbMWhu=D=pPSq{!po|Jt<4uSgjdzk#>yS5a+Ob%_b~~S>u+b7< zW0bQOV;@--Xs{H(>v|c;9~^$P-_%eKJJ_G_=%&1r)^`-)+N?h!|0*>ja(J4cUU=X@ zzYF&>tX9c>cbWD7)pZ@vaBbax)FBc^v>+Jmkx`PU(TyicL~k)l;`4|SMD$J&B2j}N z7$S@rCPIwfO9WBJj2IDwsL>fw-~W2adoSx--+!%r*E;K#b7juoME>5NI~!lxh*UG5PO+$A7#T|1_=(yh?+{e+|3z zUB1XGMmn&l4%nUy=>%IJa-rUm?97gV(?54g*gxcqADP5LY=3j$p?*GXO@+Kib307M25F;u=LBd0_D|3%H0OF zAqp*@0;h(jWOxJORK4n~xFICD!O{vPoz)Z9N2T_Gucpi^M_1j(Crvug7WQu4tvlv! zT`<8$YkNUA+s|aQ*2idF_zt^?+=>y? zrX76;r@Mb~z+=Nmvla+!&b~AK0DxSy-+!f~Qvz1znhdd37i--&&DJJ*Y`;<6b)PG7 z@f2@FEhJ?(62J$y{64iZi(Vz5tMm6F@{Tj)nn0nXhw$afPD&xh+;k2+nA)DU!OP=- zTA^57itdwmVlF!JY<<=%W zsC8*_{uy_J5}ZyW5{TB;A7B2 zl~`YcmIW>DsUp%s3sHd;y0-9n3-14I_WdgC{Bzn81f0U1;Iy71pYcN>R-*{c>g^lL0Cr zL*7``uQf7F>noaICW0MRDrMJ-1zQ!5?T7O&gR=5I!NFq7vM&(N?ArBi=GV*G^gQL0 z#K>l8Y#}B3sE_dzU(g&6uV(4jie4e517)K_6{GR~bqh=L?4GeZcjbC&Y+A=k#+?_r zCkPI>D7g;qYvRSRz7|skILrt9Ugmsm;{A|#hR6?N%tmmJqc$@y;Yk&H$8(B`MU)42 zs}@OfY){boJD=xAJ;h?fn&Y7BSDR<DHr zl@at9`VEb$s_+tScD7?(iZZus7DCj_@kfdqdmU-{h6w@lftv zCtIY6ySq$S4WTqXCx3N>>7R4czC+tvd&U|H|B+ApV*waF6iGdz4`R_h4-i!UDn?Ri z#VK^uLfJomWWPN0?-?EdLeMRsHp+qKw|e>0Er!@S?AnGK7WoX5Va$CdS!-iYV-|p{ z5-P;oQj_%<4^9l?=@ZvZsfLiqLrEa4jSCX8IVyfxW}-JEC;=O+hY9ycaAH>uIa4#o zpHI;|#kSroI%CTc@2*;2?lOA$f@((||F>7SFU3Z?W)v6hj`x)mC(r2Q0 zUKn|v@NdEw4m;Q`)m(5L^EC>qpAM#}_A*GpI4d^ksdyXKR=hqdV{s46xa!v#Bw=X6 zcL<*yrgeE8LBTg)Vi}SwA7k7}wPBIy<=wOPaQ?~rV8(a;=A~a=oqHNodMi@!j=be_ zTAS{h? zy0%`^rHgXe4}{$vbyxO~VOo*~I`JC@f?-pxZVJ#fQzjfA|vB?6cddT0d9Tq3)({vB-Gx!$$^=*c; zV*37qJ?qM@r$$vTaR4RByB)L-tA0)ptt;rvV0@b#w(iX<`qjg40)3n0%YZEq#j|Zq%ywO#Ly?$JbS_ zMl9j(bK>*78QdC5{u2a=I{&d7X@sddY$2(z3*M~He7TLR)jeXjdJz%q3wK8+2Ft(u z4^xlb#wME&Y-eC+*_%p@?@Nj0#Zg}TV`@-g8-ah!M~5217^Wjd-gUJ$XL5LA_}n}# z6oH80OhjP$1drJH7t&}yWcH-9E5C`AS=ff_8KJ*PlycB{!}rS=qx49w=e$Unl44?= zW8!G7WDnl$^`z^1kCrlqv6iJd;Jy=QDI5|aXT^~HG9euX%Dd}0m5r+^T=h_Tlm%*0ObQ|@l#(G?T~=;xPzB-+AS!2m|dV~#kzN8A}Oq59qe=<$G$or zeGc$n3I7j8r&Iq8@{$l9bxLdG=%t5Aw+AYC|FAnjAur4*UOSelj_6u~~UIgo$=wJQ%eMr6x3wQ29K zvyO<5RXx$GxfpCIosqv25X+R!gbaMQ@j9>$OEM4;4swVOOHgzS3(Ao$v$1NNGivm# zzT4J*QH||`?-b3o39V{0m$m28n@qHWk(rSH*DLF7;47Tl-!MFpOTz{y1G9#;zD>JL z!HC%)-;cM}Q;g>4)!j$DE36P;q=EPfGS)mEv{2dWB02Axyj#Tj=$OZ|1MaNlg>K86vL^H8hn z_VQWEQl6Zo9z^ZqZMdVwl)ve|*coDipY>Y9h83DN*iqBS-4%NW#PWDC%9*E_7yBI?qqB%#)3J%vzw)(5MCc&iX4aShq@9@Z0>a~SNErBLyNJ~L4Z3FS(g z&!x5%qizU@NH%iq*}lZX&+{>hj4wAxDarou`{eT~Mba%En2T$IFEY1f)?uv6ichwf zGKI}cxQz>T;zX+7OOE^Xejxkvt@>D2o9A_WbG=rpUAr{tcC5)}murcu=uc7`rsa$G zLEW+q{ZCvx+u7MQrOJ#KK4SR6-6+NrF=x-p(R;`nZ-0-9l~6Yb)fis8WHG!eVj33c zcQRpU#u?ROd{C;w{O(bcc}gtUVbjuVSq>*RYM;@7hBc?WTvn`sSl8&_*UDWLUa?P@ z`0DINMzei#Dom7zK~tz4N2{191Mub&zLQPW>6*Ls7>3!yGGu2AKEQ2p=_NuT{aTc1 z!)TtAi!pC|)~?sck zed0ZqcGx}F6xtEO*U>1gBdsx9Ru*@-v&87Vy!~w3YVM+GlrrT=73t!UUa+M}o!4{I zm-?{Zd&7qJldco1RG9RJ+-a&4?A;yJLrLQ2kfwFt%i^8S-;ahmtN#RQezni1ZFL|| z>W8}0|Mu@SQMd+$(1<7~TQ~oo?FGH(F8@3~f09mO9=vEe3Ta%XiKt7>Y&MF{=yc}U2HTja+i z0gR6TN4+l-<98(^YTNq*sY}Zfes7K@Xzr{lvrj9fByfE6IZo)(Iw?_(2~+sCG|CK( zk{*gl3~W16Uu+7$-I{n7tv>7^%XLpcWg^vKo*jl79*fCYaw;r6EktM!Aofwczl(r3 zCUq0PmW)VK^9e8YwG{e2T|bm;Dj88xSTYUYus|)2xk&#B(tV8@ARxQId9si6GIiRh zHN}My#u-QPyN=z%#DSTo?goPO%t${%)UFYqRxTGpZ2h?qZ?TX%aAs|Pa* z@X1Jd`;e@ExzO@VEBTs+Gv#qq-czR8SROv=R_6c%sMD9i?!GK{#k;XNd_{3@W^x6dBMG-= zx1njg+;6K(OEN18EpWC^E}32ynPVS(72y6(vBJ4>W@Q7vw<0|*6JpCSK_*v|vFEA_ zZamRye?g@^UCPR9I&_lMh}f&fPR>8KpDZrK)E+#FJF-{~OE{3s7j3a4l#3An&W!O} zBn>6q)P{P9cOK7%WkeNw&GG@880zWv=O#jr%1rn34eQeNck<>C!;@LQoc6 z3Q)8lhJpqXO#!GM{VSyAe|Pmu&-8yW>VcwDxS`HE0JEMk{ZEy2)_{m=^`sSmq6Hvy znm-PT)6VV#0gu^65xM|ED-&UG`f5T$(Ui=8scw-BD>WrcH1N=0It*N(r*G#60rnNp zYf-c?9Vq&@NGOU - - - - - - - QuantDinger - - - <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %> - - <% } %> - - - -

-
-

Landing

-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
QuantDinger
-
-
- - <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %> - - <% } %> - - - diff --git a/quantdinger_vue/public/logo.png b/quantdinger_vue/public/logo.png deleted file mode 100644 index 69a77a7788f98b0831c10bca30890680c9187b95..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9218 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�-2>%wW!@;m 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 - -
- -
-
- - - diff --git a/quantdinger_vue/src/api/ai-trading.js b/quantdinger_vue/src/api/ai-trading.js deleted file mode 100644 index 0961230..0000000 --- a/quantdinger_vue/src/api/ai-trading.js +++ /dev/null @@ -1,113 +0,0 @@ -import request from '@/utils/request' - -const api = { - strategies: '/addons/quantdinger/strategy/strategies', - createAIStrategy: '/addons/quantdinger/strategy/aiCreate', - updateAIStrategy: '/addons/quantdinger/strategy/aiUpdate', - deleteStrategy: '/addons/quantdinger/strategy/delete', - startStrategy: '/addons/quantdinger/strategy/start', - stopStrategy: '/addons/quantdinger/strategy/stop', - testConnection: '/addons/quantdinger/strategy/testConnection', - aiDecisions: '/addons/quantdinger/strategy/aiDecisions', - getCryptoSymbols: '/addons/quantdinger/strategy/getCryptoSymbols' -} - -/** - * ่Žทๅ–AIไบคๆ˜“็ญ–็•ฅๅˆ—่กจ - */ -export function getStrategies () { - return request({ - url: api.strategies, - method: 'get' - }) -} - -/** - * ๅˆ›ๅปบAIไบคๆ˜“็ญ–็•ฅ - */ -export function createAIStrategy (data) { - return request({ - url: api.createAIStrategy, - method: 'post', - data - }) -} - -/** - * ๆ›ดๆ–ฐAIไบคๆ˜“็ญ–็•ฅ - */ -export function updateAIStrategy (data) { - return request({ - url: api.updateAIStrategy, - method: 'post', - data - }) -} - -/** - * ๅˆ ้™ค็ญ–็•ฅ - */ -export function deleteStrategy (strategyId) { - return request({ - url: api.deleteStrategy, - method: 'delete', - params: { id: strategyId } - }) -} - -/** - * ๅฏๅŠจ็ญ–็•ฅ - */ -export function startStrategy (strategyId) { - return request({ - url: api.startStrategy, - method: 'post', - params: { id: strategyId } - }) -} - -/** - * ๅœๆญข็ญ–็•ฅ - */ -export function stopStrategy (strategyId) { - return request({ - url: api.stopStrategy, - method: 'post', - params: { id: strategyId } - }) -} - -/** - * ๆต‹่ฏ•ไบคๆ˜“ๆ‰€่ฟžๆŽฅ - */ -export function testConnection (data) { - return request({ - url: api.testConnection, - method: 'post', - data - }) -} - -/** - * ่Žทๅ–AIๅ†ณ็ญ–่ฎฐๅฝ• - */ -export function getAIDecisions (strategyId, params) { - return request({ - url: api.aiDecisions, - method: 'get', - params: { - strategy_id: strategyId, - ...params - } - }) -} - -/** - * ่Žทๅ–็ณป็ปŸๆ”ฏๆŒ็š„ไบคๆ˜“ๅฏนๅˆ—่กจ - */ -export function getCryptoSymbols () { - return request({ - url: api.getCryptoSymbols, - method: 'get' - }) -} diff --git a/quantdinger_vue/src/api/auth.js b/quantdinger_vue/src/api/auth.js deleted file mode 100644 index 5212a6f..0000000 --- a/quantdinger_vue/src/api/auth.js +++ /dev/null @@ -1,131 +0,0 @@ -import request from '@/utils/request' - -function joinApiBase (path) { - const base = (process.env.VUE_APP_API_BASE_URL || '').trim() - const p = path.startsWith('/') ? path : `/${path}` - if (!base) return p - - const b = base.replace(/\/+$/, '') - // Avoid duplicate "/api/api/*" when base is "/api" or ends with "/api" - if (b.endsWith('/api') && p.startsWith('/api/')) { - return b + p.slice('/api'.length) - } - return b + p -} - -/** - * Get security configuration (Turnstile, OAuth settings) - */ -export function getSecurityConfig () { - return request({ - url: '/api/auth/security-config', - method: 'get' - }) -} - -/** - * User login - * @param {Object} data - { username, password, turnstile_token } - */ -export function login (data) { - return request({ - url: '/api/auth/login', - method: 'post', - data - }) -} - -/** - * User logout - */ -export function logout () { - return request({ - url: '/api/auth/logout', - method: 'post' - }) -} - -/** - * Get current user info - */ -export function getUserInfo () { - return request({ - url: '/api/auth/info', - method: 'get' - }) -} - -/** - * Send verification code - * @param {Object} data - { email, type, turnstile_token } - * type: 'register' | 'login' | 'reset_password' | 'change_password' | 'change_email' - */ -export function sendVerificationCode (data) { - return request({ - url: '/api/auth/send-code', - method: 'post', - data - }) -} - -/** - * Login with email verification code (quick login) - * @param {Object} data - { email, code, turnstile_token } - */ -export function loginWithCode (data) { - return request({ - url: '/api/auth/login-code', - method: 'post', - data - }) -} - -/** - * User registration - * @param {Object} data - { email, code, username, password, turnstile_token } - */ -export function register (data) { - return request({ - url: '/api/auth/register', - method: 'post', - data - }) -} - -/** - * Reset password - * @param {Object} data - { email, code, new_password, turnstile_token } - */ -export function resetPassword (data) { - return request({ - url: '/api/auth/reset-password', - method: 'post', - data - }) -} - -/** - * Change password (for logged-in users) - * @param {Object} data - { code, new_password } - */ -export function changePassword (data) { - return request({ - url: '/api/auth/change-password', - method: 'post', - data - }) -} - -/** - * Get Google OAuth URL - */ -export function getGoogleOAuthUrl () { - return joinApiBase('/api/auth/oauth/google') -} - -/** - * Get GitHub OAuth URL - */ -export function getGitHubOAuthUrl () { - return joinApiBase('/api/auth/oauth/github') -} diff --git a/quantdinger_vue/src/api/billing.js b/quantdinger_vue/src/api/billing.js deleted file mode 100644 index 7fcb73f..0000000 --- a/quantdinger_vue/src/api/billing.js +++ /dev/null @@ -1,39 +0,0 @@ -import request from '@/utils/request' - -const billingApi = { - Plans: '/api/billing/plans', - Purchase: '/api/billing/purchase', - UsdtCreate: '/api/billing/usdt/create', - UsdtOrder: (id) => `/api/billing/usdt/order/${id}` -} - -export function getMembershipPlans () { - return request({ - url: billingApi.Plans, - method: 'get' - }) -} - -export function purchaseMembership (plan) { - return request({ - url: billingApi.Purchase, - method: 'post', - data: { plan } - }) -} - -export function createUsdtOrder (plan) { - return request({ - url: billingApi.UsdtCreate, - method: 'post', - data: { plan } - }) -} - -export function getUsdtOrder (orderId, refresh = true) { - return request({ - url: billingApi.UsdtOrder(orderId), - method: 'get', - params: { refresh: refresh ? 1 : 0 } - }) -} diff --git a/quantdinger_vue/src/api/credentials.js b/quantdinger_vue/src/api/credentials.js deleted file mode 100644 index 85c8a21..0000000 --- a/quantdinger_vue/src/api/credentials.js +++ /dev/null @@ -1,40 +0,0 @@ -import request from '@/utils/request' - -const api = { - list: '/api/credentials/list', - get: '/api/credentials/get', - create: '/api/credentials/create', - delete: '/api/credentials/delete' -} - -export function listExchangeCredentials (params = {}) { - return request({ - url: api.list, - method: 'get', - params - }) -} - -export function getExchangeCredential (id, params = {}) { - return request({ - url: api.get, - method: 'get', - params: { id, ...params } - }) -} - -export function createExchangeCredential (data) { - return request({ - url: api.create, - method: 'post', - data - }) -} - -export function deleteExchangeCredential (id, params = {}) { - return request({ - url: api.delete, - method: 'delete', - params: { id, ...params } - }) -} diff --git a/quantdinger_vue/src/api/dashboard.js b/quantdinger_vue/src/api/dashboard.js deleted file mode 100644 index 0cd1da7..0000000 --- a/quantdinger_vue/src/api/dashboard.js +++ /dev/null @@ -1,30 +0,0 @@ - -import request from '@/utils/request' - -// Dashboard API -const api = { - summary: '/api/dashboard/summary', - pendingOrders: '/api/dashboard/pendingOrders' -} - -export function getDashboardSummary () { - return request({ - url: api.summary, - method: 'get' - }) -} - -export function getPendingOrders (params) { - return request({ - url: api.pendingOrders, - method: 'get', - params - }) -} - -export function deletePendingOrder (id) { - return request({ - url: `${api.pendingOrders}/${id}`, - method: 'delete' - }) -} diff --git a/quantdinger_vue/src/api/fast-analysis.js b/quantdinger_vue/src/api/fast-analysis.js deleted file mode 100644 index 55829a9..0000000 --- a/quantdinger_vue/src/api/fast-analysis.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Fast Analysis API - * New high-performance AI analysis endpoints - */ -import request from '@/utils/request' - -const BASE_URL = '/api/fast-analysis' - -/** - * Run fast AI analysis - * @param {Object} params - { market, symbol, language, timeframe } - */ -export function fastAnalyze (params) { - return request({ - url: `${BASE_URL}/analyze`, - method: 'post', - data: params, - timeout: 60000 // 60s timeout for analysis - }) -} - -/** - * Run fast analysis with legacy format (for backward compatibility) - * @param {Object} params - { market, symbol, language, timeframe } - */ -export function fastAnalyzeLegacy (params) { - return request({ - url: `${BASE_URL}/analyze-legacy`, - method: 'post', - data: params, - timeout: 60000 - }) -} - -/** - * Get analysis history for a specific symbol - * @param {Object} params - { market, symbol, days, limit } - */ -export function getAnalysisHistory (params) { - return request({ - url: `${BASE_URL}/history`, - method: 'get', - params - }) -} - -/** - * Get all analysis history with pagination - * @param {Object} params - { page, pagesize } - */ -export function getAllAnalysisHistory (params) { - return request({ - url: `${BASE_URL}/history/all`, - method: 'get', - params - }) -} - -/** - * Delete analysis history record - * @param {Number} memoryId - The memory ID to delete - */ -export function deleteAnalysisHistory (memoryId) { - return request({ - url: `${BASE_URL}/history/${memoryId}`, - method: 'delete' - }) -} - -/** - * Submit user feedback on analysis - * @param {Object} params - { memory_id, feedback } - */ -export function submitFeedback (params) { - return request({ - url: `${BASE_URL}/feedback`, - method: 'post', - data: params - }) -} - -/** - * Get AI performance stats - * @param {Object} params - { market, symbol, days } - */ -export function getPerformanceStats (params) { - return request({ - url: `${BASE_URL}/performance`, - method: 'get', - params - }) -} - -/** - * Get similar historical patterns - * @param {Object} params - { market, symbol } - */ -export function getSimilarPatterns (params) { - return request({ - url: `${BASE_URL}/similar-patterns`, - method: 'get', - params - }) -} diff --git a/quantdinger_vue/src/api/global-market.js b/quantdinger_vue/src/api/global-market.js deleted file mode 100644 index 2a76979..0000000 --- a/quantdinger_vue/src/api/global-market.js +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Global Market Dashboard API - */ -import request from '@/utils/request' - -const BASE_URL = '/api/global-market' - -/** - * Get global market overview (indices, forex, crypto, commodities) - * Includes geo coordinates for world map display - */ -export function getMarketOverview () { - return request({ - url: `${BASE_URL}/overview`, - method: 'get' - }) -} - -/** - * Get market heatmap data (crypto, stock sectors, forex) - */ -export function getMarketHeatmap () { - return request({ - url: `${BASE_URL}/heatmap`, - method: 'get' - }) -} - -/** - * Get financial news - separated by language (cn/en) - * @param {string} lang - Language filter: 'cn', 'en', or 'all' (default) - */ -export function getMarketNews (lang = 'all') { - return request({ - url: `${BASE_URL}/news`, - method: 'get', - params: { lang } - }) -} - -/** - * Get economic calendar with impact indicators - */ -export function getEconomicCalendar () { - return request({ - url: `${BASE_URL}/calendar`, - method: 'get' - }) -} - -/** - * Get market sentiment (Fear & Greed Index, VIX) - */ -export function getMarketSentiment () { - return request({ - url: `${BASE_URL}/sentiment`, - method: 'get' - }) -} - -/** - * Get trading opportunities based on technical analysis - */ -export function getTradingOpportunities (params) { - return request({ - url: `${BASE_URL}/opportunities`, - method: 'get', - params - }) -} - -/** - * Force refresh all market data (clears cache) - */ -export function refreshMarketData () { - return request({ - url: `${BASE_URL}/refresh`, - method: 'post' - }) -} diff --git a/quantdinger_vue/src/api/login.js b/quantdinger_vue/src/api/login.js deleted file mode 100644 index 5bd228f..0000000 --- a/quantdinger_vue/src/api/login.js +++ /dev/null @@ -1,59 +0,0 @@ -import request from '@/utils/request' - -const userApi = { - Login: '/api/auth/login', - Logout: '/api/auth/logout', - UserInfo: '/api/auth/info', - UserMenu: '/user/nav' -} - -/** - * login func - * parameter: { - * username: '', - * password: '', - * remember_me: true, - * captcha: '12345' - * } - * @param parameter - * @returns {*} - */ -export function login (parameter) { - return request({ - url: userApi.Login, - method: 'post', - data: parameter - }) -} - -export function getInfo () { - return request({ - url: userApi.UserInfo, - method: 'get', - headers: { - 'Content-Type': 'application/json;charset=UTF-8' - } - }) -} - -// Backward-compatible alias: some modules still call getUserInfo() -export function getUserInfo () { - return getInfo() -} - -export function logout () { - return request({ - url: userApi.Logout, - method: 'post', - headers: { - 'Content-Type': 'application/json;charset=UTF-8' - } - }) -} - -export function getCurrentUserNav () { - return request({ - url: userApi.UserMenu, - method: 'get' - }) -} diff --git a/quantdinger_vue/src/api/manage.js b/quantdinger_vue/src/api/manage.js deleted file mode 100644 index 46a4a41..0000000 --- a/quantdinger_vue/src/api/manage.js +++ /dev/null @@ -1,70 +0,0 @@ -import request from '@/utils/request' - -const api = { - user: '/user', - role: '/role', - service: '/service', - permission: '/permission', - permissionNoPager: '/permission/no-pager', - orgTree: '/org/tree' -} - -export default api - -export function getUserList (parameter) { - return request({ - url: api.user, - method: 'get', - params: parameter - }) -} - -export function getRoleList (parameter) { - return request({ - url: api.role, - method: 'get', - params: parameter - }) -} - -export function getServiceList (parameter) { - return request({ - url: api.service, - method: 'get', - params: parameter - }) -} - -export function getPermissions (parameter) { - return request({ - url: api.permissionNoPager, - method: 'get', - params: parameter - }) -} - -export function getOrgTree (parameter) { - return request({ - url: api.orgTree, - method: 'get', - params: parameter - }) -} - -// id == 0 add post -// id != 0 update put -export function saveService (parameter) { - return request({ - url: api.service, - method: parameter.id === 0 ? 'post' : 'put', - data: parameter - }) -} - -export function saveSub (sub) { - return request({ - url: '/sub', - method: sub.id === 0 ? 'post' : 'put', - data: sub - }) -} diff --git a/quantdinger_vue/src/api/market.js b/quantdinger_vue/src/api/market.js deleted file mode 100644 index 01ada51..0000000 --- a/quantdinger_vue/src/api/market.js +++ /dev/null @@ -1,259 +0,0 @@ -import request, { ANALYSIS_TIMEOUT } from '@/utils/request' - -const marketApi = { - // Watchlist - GetWatchlist: '/api/market/watchlist/get', - AddWatchlist: '/api/market/watchlist/add', - RemoveWatchlist: '/api/market/watchlist/remove', - GetWatchlistPrices: '/api/market/watchlist/prices', - // Analysis - MultiAnalysis: '/api/analysis/multiAnalysis', - CreateAnalysisTask: '/api/analysis/createTask', - GetAnalysisTaskStatus: '/api/analysis/getTaskStatus', - GetAnalysisHistoryList: '/api/analysis/getHistoryList', - DeleteAnalysisTask: '/api/analysis/deleteTask', - ReflectAnalysis: '/api/analysis/reflect', - // AI chat (optional) - ChatMessage: '/api/ai/chat/message', - GetChatHistory: '/api/ai/chat/history', - SaveChatHistory: '/api/ai/chat/history/save', - // Public config - GetConfig: '/api/market/config', - GetMenuFooterConfig: '/api/market/menuFooterConfig', - // Market metadata - GetMarketTypes: '/api/market/types', - // Symbol search - SearchSymbols: '/api/market/symbols/search', - GetHotSymbols: '/api/market/symbols/hot' -} - -/** - * ่Žทๅ–่‡ช้€‰่‚กๅˆ—่กจ - * @param parameter { userid: number } - * @returns {*} - */ -export function getWatchlist (parameter) { - return request({ - url: marketApi.GetWatchlist, - method: 'get', - params: parameter - }) -} - -/** - * ๆทปๅŠ ่‡ช้€‰่‚ก - * @param parameter { userid: number, market: string, symbol: string } - * @returns {*} - */ -export function addWatchlist (parameter) { - return request({ - url: marketApi.AddWatchlist, - method: 'post', - data: parameter - }) -} - -/** - * ๅˆ ้™ค่‡ช้€‰่‚ก - * @param parameter { userid: number, symbol: string } - * @returns {*} - */ -export function removeWatchlist (parameter) { - return request({ - url: marketApi.RemoveWatchlist, - method: 'post', - data: parameter - }) -} - -/** - * ่Žทๅ–่‡ช้€‰่‚กไปทๆ ผ - * @param parameter { watchlist: array } watchlistๆ ผๅผ๏ผš[{market: 'USStock', symbol: 'AAPL'}, ...] - * @returns {*} - */ -export function getWatchlistPrices (parameter) { - return request({ - url: marketApi.GetWatchlistPrices, - method: 'get', - params: { - watchlist: JSON.stringify(parameter.watchlist || []) - } - }) -} - -/** - * ๅ‘้€ AI ่Šๅคฉๆถˆๆฏ - * @param parameter { userid: number, message: string, chatId?: string } - * @returns {*} - */ -export function chatMessage (parameter) { - return request({ - url: marketApi.ChatMessage, - method: 'post', - data: parameter - }) -} - -/** - * ่Žทๅ–่Šๅคฉๅކๅฒ - * @param parameter { userid: number } - * @returns {*} - */ -export function getChatHistory (parameter) { - return request({ - url: marketApi.GetChatHistory, - method: 'get', - params: parameter - }) -} - -/** - * ไฟๅญ˜่Šๅคฉๅކๅฒ - * @param parameter { userid: number, chatHistory: array } - * @returns {*} - */ -export function saveChatHistory (parameter) { - return request({ - url: marketApi.SaveChatHistory, - method: 'post', - data: parameter - }) -} - -/** - * ๆ‰ง่กŒๅคš็ปดๅบฆๅˆ†ๆž - * @param parameter { userid: number, market: string, symbol: string } - * @returns {*} - */ -export function multiAnalysis (parameter) { - return request({ - url: marketApi.MultiAnalysis, - method: 'post', - data: parameter, - timeout: ANALYSIS_TIMEOUT // Extended timeout for AI analysis - }) -} - -/** - * ๅˆ›ๅปบๅˆ†ๆžไปปๅŠก - * @param parameter { userid: number, market: string, symbol: string } - * @returns {*} - */ -export function createAnalysisTask (parameter) { - return request({ - url: marketApi.CreateAnalysisTask, - method: 'post', - data: parameter - }) -} - -/** - * ่Žทๅ–ๅˆ†ๆžไปปๅŠก็Šถๆ€ - * @param parameter { task_id: number } - * @returns {*} - */ -export function getAnalysisTaskStatus (parameter) { - return request({ - url: marketApi.GetAnalysisTaskStatus, - method: 'get', - params: parameter - }) -} - -/** - * ่Žทๅ–ๅކๅฒๅˆ†ๆžๅˆ—่กจ - * @param parameter { userid: number, page?: number, pagesize?: number } - * @returns {*} - */ -export function getAnalysisHistoryList (parameter) { - return request({ - url: marketApi.GetAnalysisHistoryList, - method: 'get', - params: parameter - }) -} - -/** - * Delete analysis task - * @param parameter { task_id: number } - * @returns {*} - */ -export function deleteAnalysisTask (parameter) { - return request({ - url: marketApi.DeleteAnalysisTask, - method: 'post', - data: parameter - }) -} - -/** - * ๅๆ€ๅญฆไน  - * @param parameter { market: string, symbol: string, decision: string, returns?: number, result?: string } - * @returns {*} - */ -export function reflectAnalysis (parameter) { - return request({ - url: marketApi.ReflectAnalysis, - method: 'post', - data: parameter - }) -} - -/** - * ่Žทๅ–ๆ’ไปถ้…็ฝฎ - * @returns {*} - */ -export function getConfig () { - return request({ - url: marketApi.GetConfig, - method: 'get' - }) -} - -/** - * ่Žทๅ–่œๅ•ๅบ•้ƒจ้…็ฝฎ - * @returns {*} - */ -export function getMenuFooterConfig () { - return request({ - url: marketApi.GetMenuFooterConfig, - method: 'get' - }) -} - -/** - * ่Žทๅ–่‚ก็ฅจ็ฑปๅž‹ๅˆ—่กจ - * @returns {*} - */ -export function getMarketTypes () { - return request({ - url: marketApi.GetMarketTypes, - method: 'get' - }) -} - -/** - * ๆœ็ดข้‡‘่žไบงๅ“ - * @param parameter { market: string, keyword: string, limit?: number } - * @returns {*} - */ -export function searchSymbols (parameter) { - return request({ - url: marketApi.SearchSymbols, - method: 'get', - params: parameter - }) -} - -/** - * ่Žทๅ–็ƒญ้—จๆ ‡็š„ - * @param parameter { market: string, limit?: number } - * @returns {*} - */ -export function getHotSymbols (parameter) { - return request({ - url: marketApi.GetHotSymbols, - method: 'get', - params: parameter - }) -} diff --git a/quantdinger_vue/src/api/portfolio.js b/quantdinger_vue/src/api/portfolio.js deleted file mode 100644 index 732508e..0000000 --- a/quantdinger_vue/src/api/portfolio.js +++ /dev/null @@ -1,151 +0,0 @@ -/** - * Portfolio API - Manual positions and monitoring - */ -import request from '@/utils/request' - -// ==================== Positions ==================== - -export function getPositions (params = {}) { - return request({ - url: '/api/portfolio/positions', - method: 'get', - params - }) -} - -export function addPosition (data) { - return request({ - url: '/api/portfolio/positions', - method: 'post', - data - }) -} - -export function updatePosition (id, data) { - return request({ - url: `/api/portfolio/positions/${id}`, - method: 'put', - data - }) -} - -export function deletePosition (id) { - return request({ - url: `/api/portfolio/positions/${id}`, - method: 'delete' - }) -} - -export function getPortfolioSummary (params = {}) { - return request({ - url: '/api/portfolio/summary', - method: 'get', - params - }) -} - -// ==================== Monitors ==================== - -export function getMonitors () { - return request({ - url: '/api/portfolio/monitors', - method: 'get' - }) -} - -export function addMonitor (data) { - return request({ - url: '/api/portfolio/monitors', - method: 'post', - data - }) -} - -export function updateMonitor (id, data) { - return request({ - url: `/api/portfolio/monitors/${id}`, - method: 'put', - data - }) -} - -export function deleteMonitor (id) { - return request({ - url: `/api/portfolio/monitors/${id}`, - method: 'delete' - }) -} - -export function runMonitor (id, params = {}) { - return request({ - url: `/api/portfolio/monitors/${id}/run`, - method: 'post', - data: params - }) -} - -// ==================== Alerts ==================== - -export function getAlerts () { - return request({ - url: '/api/portfolio/alerts', - method: 'get' - }) -} - -export function addAlert (data) { - return request({ - url: '/api/portfolio/alerts', - method: 'post', - data - }) -} - -export function updateAlert (id, data) { - return request({ - url: `/api/portfolio/alerts/${id}`, - method: 'put', - data - }) -} - -export function deleteAlert (id) { - return request({ - url: `/api/portfolio/alerts/${id}`, - method: 'delete' - }) -} - -// ==================== Groups ==================== - -export function getGroups () { - return request({ - url: '/api/portfolio/groups', - method: 'get' - }) -} - -export function renameGroup (data) { - return request({ - url: '/api/portfolio/groups/rename', - method: 'post', - data - }) -} - -// ==================== Market (reuse from market.js) ==================== - -export function searchSymbols (data) { - return request({ - url: '/api/market/symbols/search', - method: 'post', - data - }) -} - -export function getMarketTypes () { - return request({ - url: '/api/market/types', - method: 'get' - }) -} diff --git a/quantdinger_vue/src/api/settings.js b/quantdinger_vue/src/api/settings.js deleted file mode 100644 index f721e94..0000000 --- a/quantdinger_vue/src/api/settings.js +++ /dev/null @@ -1,56 +0,0 @@ -import request from '@/utils/request' - -/** - * ่Žทๅ–้…็ฝฎ้กนๅฎšไน‰ - */ -export function getSettingsSchema () { - return request({ - url: '/api/settings/schema', - method: 'get' - }) -} - -/** - * ่Žทๅ–ๅฝ“ๅ‰้…็ฝฎๅ€ผ - */ -export function getSettingsValues () { - return request({ - url: '/api/settings/values', - method: 'get' - }) -} - -/** - * ไฟๅญ˜้…็ฝฎ - * @param {Object} data - ้…็ฝฎๆ•ฐๆฎ - */ -export function saveSettings (data) { - return request({ - url: '/api/settings/save', - method: 'post', - data - }) -} - -/** - * ๆต‹่ฏ•API่ฟžๆŽฅ - * @param {string} service - ๆœๅŠกๅ็งฐ (openrouter, finnhub, etc.) - * @param {Object} params - ้ขๅค–ๅ‚ๆ•ฐ - */ -export function testConnection (service, params = {}) { - return request({ - url: '/api/settings/test-connection', - method: 'post', - data: { service, ...params } - }) -} - -/** - * ๆŸฅ่ฏข OpenRouter ่ดฆๆˆทไฝ™้ข - */ -export function getOpenRouterBalance () { - return request({ - url: '/api/settings/openrouter-balance', - method: 'get' - }) -} diff --git a/quantdinger_vue/src/api/strategy.js b/quantdinger_vue/src/api/strategy.js deleted file mode 100644 index 6c2abae..0000000 --- a/quantdinger_vue/src/api/strategy.js +++ /dev/null @@ -1,237 +0,0 @@ -import request from '@/utils/request' - -const api = { - // Local Python backend - strategies: '/api/strategies', - strategyDetail: '/api/strategies/detail', - createStrategy: '/api/strategies/create', - batchCreateStrategies: '/api/strategies/batch-create', - updateStrategy: '/api/strategies/update', - stopStrategy: '/api/strategies/stop', - startStrategy: '/api/strategies/start', - deleteStrategy: '/api/strategies/delete', - batchStartStrategies: '/api/strategies/batch-start', - batchStopStrategies: '/api/strategies/batch-stop', - batchDeleteStrategies: '/api/strategies/batch-delete', - testConnection: '/api/strategies/test-connection', - trades: '/api/strategies/trades', - positions: '/api/strategies/positions', - equityCurve: '/api/strategies/equityCurve', - notifications: '/api/strategies/notifications' -} - -/** - * ่Žทๅ–็ญ–็•ฅๅˆ—่กจ - * @param {Object} params - ๆŸฅ่ฏขๅ‚ๆ•ฐ - * @param {number} params.user_id - ็”จๆˆทID๏ผˆๅฏ้€‰๏ผ‰ - */ -export function getStrategyList (params = {}) { - return request({ - url: api.strategies, - method: 'get', - params - }) -} - -/** - * ่Žทๅ–็ญ–็•ฅ่ฏฆๆƒ… - * @param {number} id - ็ญ–็•ฅID - */ -export function getStrategyDetail (id) { - return request({ - url: api.strategyDetail, - method: 'get', - params: { id } - }) -} - -/** - * ๅˆ›ๅปบ็ญ–็•ฅ - * @param {Object} data - ็ญ–็•ฅๆ•ฐๆฎ - * @param {number} data.user_id - ็”จๆˆทID - * @param {string} data.strategy_name - ็ญ–็•ฅๅ็งฐ - * @param {string} data.strategy_type - ็ญ–็•ฅ็ฑปๅž‹ - * @param {Object} data.llm_model_config - LLMๆจกๅž‹้…็ฝฎ - * @param {Object} data.exchange_config - ไบคๆ˜“ๆ‰€้…็ฝฎ - * @param {Object} data.trading_config - ไบคๆ˜“้…็ฝฎ - */ -export function createStrategy (data) { - return request({ - url: api.createStrategy, - method: 'post', - data - }) -} - -/** - * ๆ‰น้‡ๅˆ›ๅปบ็ญ–็•ฅ๏ผˆๅคšๅธ็ง๏ผ‰ - * @param {Object} data - ็ญ–็•ฅๆ•ฐๆฎ - * @param {string} data.strategy_name - ็ญ–็•ฅๅŸบ็ก€ๅ็งฐ - * @param {Array} data.symbols - ๅธ็งๆ•ฐ็ป„๏ผŒๅฆ‚ ["Crypto:BTC/USDT", "Crypto:ETH/USDT"] - */ -export function batchCreateStrategies (data) { - return request({ - url: api.batchCreateStrategies, - method: 'post', - data - }) -} - -/** - * ๆ›ดๆ–ฐ็ญ–็•ฅ - * @param {number} id - ็ญ–็•ฅID - * @param {Object} data - ็ญ–็•ฅๆ•ฐๆฎ - * @param {string} data.strategy_name - ็ญ–็•ฅๅ็งฐ๏ผˆๅฏ้€‰๏ผ‰ - * @param {Object} data.indicator_config - ๆŠ€ๆœฏๆŒ‡ๆ ‡้…็ฝฎ๏ผˆๅฏ้€‰๏ผ‰ - * @param {Object} data.exchange_config - ไบคๆ˜“ๆ‰€้…็ฝฎ๏ผˆๅฏ้€‰๏ผ‰ - * @param {Object} data.trading_config - ไบคๆ˜“้…็ฝฎ๏ผˆๅฏ้€‰๏ผ‰ - */ -export function updateStrategy (id, data) { - return request({ - url: api.updateStrategy, - method: 'put', - params: { id }, - data - }) -} - -/** - * ๅœๆญข็ญ–็•ฅ - * @param {number} id - ็ญ–็•ฅID - */ -export function stopStrategy (id) { - return request({ - url: api.stopStrategy, - method: 'post', - params: { id } - }) -} - -/** - * ๅฏๅŠจ็ญ–็•ฅ - * @param {number} id - ็ญ–็•ฅID - */ -export function startStrategy (id) { - return request({ - url: api.startStrategy, - method: 'post', - params: { id } - }) -} - -/** - * ๅˆ ้™ค็ญ–็•ฅ - * @param {number} id - ็ญ–็•ฅID - */ -export function deleteStrategy (id) { - return request({ - url: api.deleteStrategy, - method: 'delete', - params: { id } - }) -} - -/** - * ๆ‰น้‡ๅฏๅŠจ็ญ–็•ฅ - * @param {Object} data - * @param {Array} data.strategy_ids - ็ญ–็•ฅIDๆ•ฐ็ป„ - * @param {string} data.strategy_group_id - ็ญ–็•ฅ็ป„ID๏ผˆๅฏ้€‰๏ผŒไธŽstrategy_idsไบŒ้€‰ไธ€๏ผ‰ - */ -export function batchStartStrategies (data) { - return request({ - url: api.batchStartStrategies, - method: 'post', - data - }) -} - -/** - * ๆ‰น้‡ๅœๆญข็ญ–็•ฅ - * @param {Object} data - * @param {Array} data.strategy_ids - ็ญ–็•ฅIDๆ•ฐ็ป„ - * @param {string} data.strategy_group_id - ็ญ–็•ฅ็ป„ID๏ผˆๅฏ้€‰๏ผŒไธŽstrategy_idsไบŒ้€‰ไธ€๏ผ‰ - */ -export function batchStopStrategies (data) { - return request({ - url: api.batchStopStrategies, - method: 'post', - data - }) -} - -/** - * ๆ‰น้‡ๅˆ ้™ค็ญ–็•ฅ - * @param {Object} data - * @param {Array} data.strategy_ids - ็ญ–็•ฅIDๆ•ฐ็ป„ - * @param {string} data.strategy_group_id - ็ญ–็•ฅ็ป„ID๏ผˆๅฏ้€‰๏ผŒไธŽstrategy_idsไบŒ้€‰ไธ€๏ผ‰ - */ -export function batchDeleteStrategies (data) { - return request({ - url: api.batchDeleteStrategies, - method: 'delete', - data - }) -} - -/** - * ๆต‹่ฏ•ไบคๆ˜“ๆ‰€่ฟžๆŽฅ - * @param {Object} exchangeConfig - ไบคๆ˜“ๆ‰€้…็ฝฎ - */ -export function testExchangeConnection (exchangeConfig) { - return request({ - url: api.testConnection, - method: 'post', - data: { exchange_config: exchangeConfig } - }) -} - -/** - * ่Žทๅ–็ญ–็•ฅไบคๆ˜“่ฎฐๅฝ• - * @param {number} id - ็ญ–็•ฅID - */ -export function getStrategyTrades (id) { - return request({ - url: api.trades, - method: 'get', - params: { id } - }) -} - -/** - * ่Žทๅ–็ญ–็•ฅๆŒไป“่ฎฐๅฝ• - * @param {number} id - ็ญ–็•ฅID - */ -export function getStrategyPositions (id) { - return request({ - url: api.positions, - method: 'get', - params: { id } - }) -} - -/** - * ่Žทๅ–็ญ–็•ฅๅ‡€ๅ€ผๆ›ฒ็บฟ - * @param {number} id - ็ญ–็•ฅID - */ -export function getStrategyEquityCurve (id) { - return request({ - url: api.equityCurve, - method: 'get', - params: { id } - }) -} - -/** - * Strategy signal notifications (browser channel persistence). - * @param {Object} params - * @param {number} params.id - strategy id (optional) - * @param {number} params.limit - max items (optional) - * @param {number} params.since_id - return items with id > since_id (optional) - */ -export function getStrategyNotifications (params = {}) { - return request({ - url: api.notifications, - method: 'get', - params - }) -} diff --git a/quantdinger_vue/src/api/user.js b/quantdinger_vue/src/api/user.js deleted file mode 100644 index f8e9979..0000000 --- a/quantdinger_vue/src/api/user.js +++ /dev/null @@ -1,222 +0,0 @@ -/** - * User Management API - */ -import request from '@/utils/request' - -// ==================== Admin APIs ==================== - -/** - * Get user list (admin only) - * @param {Object} params - { page, page_size, search } - */ -export function getUserList (params) { - return request({ - url: '/api/users/list', - method: 'get', - params - }) -} - -/** - * Get user detail (admin only) - * @param {Number} id - User ID - */ -export function getUserDetail (id) { - return request({ - url: '/api/users/detail', - method: 'get', - params: { id } - }) -} - -/** - * Create new user (admin only) - * @param {Object} data - { username, password, email, nickname, role } - */ -export function createUser (data) { - return request({ - url: '/api/users/create', - method: 'post', - data - }) -} - -/** - * Update user (admin only) - * @param {Number} id - User ID - * @param {Object} data - { email, nickname, role, status } - */ -export function updateUser (id, data) { - return request({ - url: '/api/users/update', - method: 'put', - params: { id }, - data - }) -} - -/** - * Delete user (admin only) - * @param {Number} id - User ID - */ -export function deleteUser (id) { - return request({ - url: '/api/users/delete', - method: 'delete', - params: { id } - }) -} - -/** - * Reset user password (admin only) - * @param {Object} data - { user_id, new_password } - */ -export function resetUserPassword (data) { - return request({ - url: '/api/users/reset-password', - method: 'post', - data - }) -} - -/** - * Get available roles - */ -export function getRoles () { - return request({ - url: '/api/users/roles', - method: 'get' - }) -} - -// ==================== Self-Service APIs ==================== - -/** - * Get current user profile - */ -export function getProfile () { - return request({ - url: '/api/users/profile', - method: 'get' - }) -} - -/** - * Update current user profile - * @param {Object} data - { nickname, email, avatar } - */ -export function updateProfile (data) { - return request({ - url: '/api/users/profile/update', - method: 'put', - data - }) -} - -/** - * Change current user password - * @param {Object} data - { old_password, new_password } - */ -export function changePassword (data) { - return request({ - url: '/api/users/change-password', - method: 'post', - data - }) -} - -/** - * Get current user's notification settings - */ -export function getNotificationSettings () { - return request({ - url: '/api/users/notification-settings', - method: 'get' - }) -} - -/** - * Update current user's notification settings - * @param {Object} data - { default_channels, telegram_chat_id, email, discord_webhook, webhook_url, phone } - */ -export function updateNotificationSettings (data) { - return request({ - url: '/api/users/notification-settings', - method: 'put', - data - }) -} - -/** - * Get current user's credits log - * @param {Object} params - { page, page_size } - */ -export function getMyCreditsLog (params) { - return request({ - url: '/api/users/my-credits-log', - method: 'get', - params - }) -} - -/** - * Get current user's referral list - * @param {Object} params - { page, page_size } - */ -export function getMyReferrals (params) { - return request({ - url: '/api/users/my-referrals', - method: 'get', - params - }) -} - -// ==================== Billing Management (Admin) ==================== - -/** - * Set user credits (admin only) - * @param {Object} data - { user_id, credits, remark } - */ -export function setUserCredits (data) { - return request({ - url: '/api/users/set-credits', - method: 'post', - data - }) -} - -/** - * Set user VIP status (admin only) - * @param {Object} data - { user_id, vip_days, vip_expires_at, remark } - */ -export function setUserVip (data) { - return request({ - url: '/api/users/set-vip', - method: 'post', - data - }) -} - -/** - * Get user credits log (admin only) - * @param {Object} params - { user_id, page, page_size } - */ -export function getUserCreditsLog (params) { - return request({ - url: '/api/users/credits-log', - method: 'get', - params - }) -} - -/** - * Get system-wide strategy overview (admin only) - * @param {Object} params - { page, page_size, status, search } - */ -export function getSystemStrategies (params) { - return request({ - url: '/api/users/system-strategies', - method: 'get', - params - }) -} diff --git a/quantdinger_vue/src/assets/background.svg b/quantdinger_vue/src/assets/background.svg deleted file mode 100644 index 89c2597..0000000 --- a/quantdinger_vue/src/assets/background.svg +++ /dev/null @@ -1,69 +0,0 @@ - - - - Group 21 - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/quantdinger_vue/src/assets/icons/bx-analyse.svg b/quantdinger_vue/src/assets/icons/bx-analyse.svg deleted file mode 100644 index b02a8d6..0000000 --- a/quantdinger_vue/src/assets/icons/bx-analyse.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/quantdinger_vue/src/assets/logo.png b/quantdinger_vue/src/assets/logo.png deleted file mode 100644 index 536e42f9f61b7a675784c423ce7db1de73c3fbcf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105735 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 GEaMM&$a=W| diff --git a/quantdinger_vue/src/assets/logo.svg b/quantdinger_vue/src/assets/logo.svg deleted file mode 100644 index 07ac542..0000000 --- a/quantdinger_vue/src/assets/logo.svg +++ /dev/null @@ -1,29 +0,0 @@ - - - - Vue - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/quantdinger_vue/src/assets/slogo.png b/quantdinger_vue/src/assets/slogo.png deleted file mode 100644 index 02a796aedb256cd4e8c99980954b9d0222d89397..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27144 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�-2>%wW!@;m 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 - - - - - - diff --git a/quantdinger_vue/src/components/ArticleListContent/index.js b/quantdinger_vue/src/components/ArticleListContent/index.js deleted file mode 100644 index 37d35c7..0000000 --- a/quantdinger_vue/src/components/ArticleListContent/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import ArticleListContent from './ArticleListContent' - -export default ArticleListContent diff --git a/quantdinger_vue/src/components/AvatarList/Item.jsx b/quantdinger_vue/src/components/AvatarList/Item.jsx deleted file mode 100644 index 8019fac..0000000 --- a/quantdinger_vue/src/components/AvatarList/Item.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import PropTypes from 'ant-design-vue/es/_util/vue-types' -import { Tooltip, Avatar } from 'ant-design-vue' -import { getSlotOptions } from 'ant-design-vue/lib/_util/props-util' -import { warning } from 'ant-design-vue/lib/vc-util/warning' - -export const AvatarListItemProps = { - tips: PropTypes.string, - src: PropTypes.string.def('') -} - -const Item = { - __ANT_AVATAR_CHILDREN: true, - name: 'AvatarListItem', - props: AvatarListItemProps, - created () { - warning(getSlotOptions(this.$parent).__ANT_AVATAR_LIST, 'AvatarListItem must be a subcomponent of AvatarList') - }, - render () { - const size = this.$parent.size === 'mini' ? 'small' : this.$parent.size - const AvatarDom = - return (this.tips && {AvatarDom}) || - } -} - -export default Item diff --git a/quantdinger_vue/src/components/AvatarList/List.jsx b/quantdinger_vue/src/components/AvatarList/List.jsx deleted file mode 100644 index bff7092..0000000 --- a/quantdinger_vue/src/components/AvatarList/List.jsx +++ /dev/null @@ -1,72 +0,0 @@ -import './index.less' - -import PropTypes from 'ant-design-vue/es/_util/vue-types' -import Avatar from 'ant-design-vue/es/avatar' -import Item from './Item.jsx' -import { filterEmpty } from '@/components/_util/util' - -/** - * size: `number`ใ€ `large`ใ€`small`ใ€`default` ้ป˜่ฎคๅ€ผ: default - * maxLength: number - * excessItemsStyle: CSSProperties - */ -const AvatarListProps = { - prefixCls: PropTypes.string.def('ant-pro-avatar-list'), - size: { - validator: val => { - return typeof val === 'number' || ['small', 'large', 'default'].includes(val) - }, - default: 'default' - }, - maxLength: PropTypes.number.def(0), - excessItemsStyle: PropTypes.object.def({ - color: '#f56a00', - backgroundColor: '#fde3cf' - }) -} - -const AvatarList = { - __ANT_AVATAR_LIST: true, - Item, - name: 'AvatarList', - props: AvatarListProps, - render (h) { - const { prefixCls, size } = this.$props - const className = { - [`${prefixCls}`]: true, - [`${size}`]: true - } - - const items = filterEmpty(this.$slots.default) - const itemsDom = items && items.length ?
    {this.getItems(items)}
: null - return ( -
- {itemsDom} -
- ) - }, - methods: { - getItems (items) { - const className = { - [`${this.prefixCls}-item`]: true, - [`${this.size}`]: true - } - const totalSize = items.length - - if (this.maxLength > 0) { - items = items.slice(0, this.maxLength) - items.push(({`+${totalSize - this.maxLength}`})) - } - return items.map((item) => ( -
  • {item}
  • - )) - } - } -} - -AvatarList.install = function (Vue) { - Vue.component(AvatarList.name, AvatarList) - Vue.component(AvatarList.Item.name, AvatarList.Item) -} - -export default AvatarList diff --git a/quantdinger_vue/src/components/AvatarList/index.js b/quantdinger_vue/src/components/AvatarList/index.js deleted file mode 100644 index b047432..0000000 --- a/quantdinger_vue/src/components/AvatarList/index.js +++ /dev/null @@ -1,9 +0,0 @@ -import AvatarList from './List' -import Item from './Item' - -export { - AvatarList, - Item as AvatarListItem -} - -export default AvatarList diff --git a/quantdinger_vue/src/components/AvatarList/index.less b/quantdinger_vue/src/components/AvatarList/index.less deleted file mode 100644 index 87cc4b5..0000000 --- a/quantdinger_vue/src/components/AvatarList/index.less +++ /dev/null @@ -1,59 +0,0 @@ -@import '../index'; - -@avatar-list-prefix-cls: ~"@{ant-pro-prefix}-avatar-list"; -@avatar-list-item-prefix-cls: ~"@{ant-pro-prefix}-avatar-list-item"; - -.@{avatar-list-prefix-cls} { - display: inline-block; - - ul { - display: inline-block; - padding: 0; - margin: 0 0 0 8px; - font-size: 0; - list-style: none; - } -} - -.@{avatar-list-item-prefix-cls} { - display: inline-block; - width: @avatar-size-base; - height: @avatar-size-base; - margin-left: -8px; - font-size: @font-size-base; - - :global { - .ant-avatar { - cursor: pointer; - border: 1px solid #fff; - } - } - - &.large { - width: @avatar-size-lg; - height: @avatar-size-lg; - } - - &.small { - width: @avatar-size-sm; - height: @avatar-size-sm; - } - - &.mini { - width: 20px; - height: 20px; - - :global { - .ant-avatar { - width: 20px; - height: 20px; - line-height: 20px; - - .ant-avatar-string { - font-size: 12px; - line-height: 18px; - } - } - } - } -} diff --git a/quantdinger_vue/src/components/AvatarList/index.md b/quantdinger_vue/src/components/AvatarList/index.md deleted file mode 100644 index 75e022c..0000000 --- a/quantdinger_vue/src/components/AvatarList/index.md +++ /dev/null @@ -1,64 +0,0 @@ -# AvatarList ็”จๆˆทๅคดๅƒๅˆ—่กจ - - -ไธ€็ป„็”จๆˆทๅคดๅƒ๏ผŒๅธธ็”จๅœจ้กน็›ฎ/ๅ›ข้˜Ÿๆˆๅ‘˜ๅˆ—่กจใ€‚ๅฏ้€š่ฟ‡่ฎพ็ฝฎ `size` ๅฑžๆ€งๆฅๆŒ‡ๅฎšๅคดๅƒๅคงๅฐใ€‚ - - - -ๅผ•็”จๆ–นๅผ๏ผš - -```javascript -import AvatarList from '@/components/AvatarList' -const AvatarListItem = AvatarList.Item - -export default { - components: { - AvatarList, - AvatarListItem - } -} -``` - - - -## ไปฃ็ ๆผ”็คบ [demo](https://pro.loacg.com/test/home) - -```html - - - - - -``` -ๆˆ– -```html - - - - - - - - - -``` - - - -## API - -### AvatarList - -| ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | -| ---------------- | -------- | ---------------------------------- | --------- | -| size | ๅคดๅƒๅคงๅฐ | `large`ใ€`small` ใ€`mini`, `default` | `default` | -| maxLength | ่ฆๆ˜พ็คบ็š„ๆœ€ๅคง้กน็›ฎ | number | - | -| excessItemsStyle | ๅคšไฝ™็š„้กน็›ฎ้ฃŽๆ ผ | CSSProperties | - | - -### AvatarList.Item - -| ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | -| ---- | ------ | --------- | --- | -| tips | ๅคดๅƒๅฑ•็คบๆ–‡ๆกˆ | string | - | -| src | ๅคดๅƒๅ›พ็‰‡่ฟžๆŽฅ | string | - | - diff --git a/quantdinger_vue/src/components/Charts/Bar.vue b/quantdinger_vue/src/components/Charts/Bar.vue deleted file mode 100644 index 4482845..0000000 --- a/quantdinger_vue/src/components/Charts/Bar.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - diff --git a/quantdinger_vue/src/components/Charts/ChartCard.vue b/quantdinger_vue/src/components/Charts/ChartCard.vue deleted file mode 100644 index fc1f425..0000000 --- a/quantdinger_vue/src/components/Charts/ChartCard.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/Liquid.vue b/quantdinger_vue/src/components/Charts/Liquid.vue deleted file mode 100644 index 4019fb1..0000000 --- a/quantdinger_vue/src/components/Charts/Liquid.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/MiniArea.vue b/quantdinger_vue/src/components/Charts/MiniArea.vue deleted file mode 100644 index 58fe92c..0000000 --- a/quantdinger_vue/src/components/Charts/MiniArea.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/MiniBar.vue b/quantdinger_vue/src/components/Charts/MiniBar.vue deleted file mode 100644 index beac404..0000000 --- a/quantdinger_vue/src/components/Charts/MiniBar.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/MiniProgress.vue b/quantdinger_vue/src/components/Charts/MiniProgress.vue deleted file mode 100644 index e691363..0000000 --- a/quantdinger_vue/src/components/Charts/MiniProgress.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/MiniSmoothArea.vue b/quantdinger_vue/src/components/Charts/MiniSmoothArea.vue deleted file mode 100644 index e5455c2..0000000 --- a/quantdinger_vue/src/components/Charts/MiniSmoothArea.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/Radar.vue b/quantdinger_vue/src/components/Charts/Radar.vue deleted file mode 100644 index 5ee88ad..0000000 --- a/quantdinger_vue/src/components/Charts/Radar.vue +++ /dev/null @@ -1,68 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/RankList.vue b/quantdinger_vue/src/components/Charts/RankList.vue deleted file mode 100644 index afb56a1..0000000 --- a/quantdinger_vue/src/components/Charts/RankList.vue +++ /dev/null @@ -1,77 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/TagCloud.vue b/quantdinger_vue/src/components/Charts/TagCloud.vue deleted file mode 100644 index 74d1b3f..0000000 --- a/quantdinger_vue/src/components/Charts/TagCloud.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - diff --git a/quantdinger_vue/src/components/Charts/TransferBar.vue b/quantdinger_vue/src/components/Charts/TransferBar.vue deleted file mode 100644 index 7f96f0b..0000000 --- a/quantdinger_vue/src/components/Charts/TransferBar.vue +++ /dev/null @@ -1,64 +0,0 @@ - - - diff --git a/quantdinger_vue/src/components/Charts/Trend.vue b/quantdinger_vue/src/components/Charts/Trend.vue deleted file mode 100644 index 2dce37e..0000000 --- a/quantdinger_vue/src/components/Charts/Trend.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Charts/chart.less b/quantdinger_vue/src/components/Charts/chart.less deleted file mode 100644 index f79e17d..0000000 --- a/quantdinger_vue/src/components/Charts/chart.less +++ /dev/null @@ -1,13 +0,0 @@ -.antv-chart-mini { - position: relative; - width: 100%; - - .chart-wrapper { - position: absolute; - bottom: -28px; - width: 100%; - - /* margin: 0 -5px; - overflow: hidden; */ - } -} diff --git a/quantdinger_vue/src/components/Charts/smooth.area.less b/quantdinger_vue/src/components/Charts/smooth.area.less deleted file mode 100644 index d31ff2f..0000000 --- a/quantdinger_vue/src/components/Charts/smooth.area.less +++ /dev/null @@ -1,14 +0,0 @@ -@import '../index'; - -@smoothArea-prefix-cls: ~"@{ant-pro-prefix}-smooth-area"; - -.@{smoothArea-prefix-cls} { - position: relative; - width: 100%; - - .chart-wrapper { - position: absolute; - bottom: -28px; - width: 100%; - } -} diff --git a/quantdinger_vue/src/components/Dialog.js b/quantdinger_vue/src/components/Dialog.js deleted file mode 100644 index 78e95b2..0000000 --- a/quantdinger_vue/src/components/Dialog.js +++ /dev/null @@ -1,113 +0,0 @@ -import Modal from 'ant-design-vue/es/modal' -export default (Vue) => { - function dialog (component, componentProps, modalProps) { - const _vm = this - modalProps = modalProps || {} - if (!_vm || !_vm._isVue) { - return - } - let dialogDiv = document.querySelector('body>div[type=dialog]') - if (!dialogDiv) { - dialogDiv = document.createElement('div') - dialogDiv.setAttribute('type', 'dialog') - document.body.appendChild(dialogDiv) - } - - const handle = function (checkFunction, afterHandel) { - if (checkFunction instanceof Function) { - const res = checkFunction() - if (res instanceof Promise) { - res.then(c => { - c && afterHandel() - }) - } else { - res && afterHandel() - } - } else { - // checkFunction && afterHandel() - checkFunction || afterHandel() - } - } - - const dialogInstance = new Vue({ - data () { - return { - visible: true - } - }, - router: _vm.$router, - store: _vm.$store, - mounted () { - this.$on('close', (v) => { - this.handleClose() - }) - }, - methods: { - handleClose () { - handle(this.$refs._component.onCancel, () => { - this.visible = false - this.$refs._component.$emit('close') - this.$refs._component.$emit('cancel') - dialogInstance.$destroy() - }) - }, - handleOk () { - handle(this.$refs._component.onOK || this.$refs._component.onOk, () => { - this.visible = false - this.$refs._component.$emit('close') - this.$refs._component.$emit('ok') - dialogInstance.$destroy() - }) - } - }, - render: function (h) { - const that = this - const modalModel = modalProps && modalProps.model - if (modalModel) { - delete modalProps.model - } - const ModalProps = Object.assign({}, modalModel && { model: modalModel } || {}, { - attrs: Object.assign({}, { - ...(modalProps.attrs || modalProps) - }, { - visible: this.visible - }), - on: Object.assign({}, { - ...(modalProps.on || modalProps) - }, { - ok: () => { - that.handleOk() - }, - cancel: () => { - that.handleClose() - } - }) - }) - - const componentModel = componentProps && componentProps.model - if (componentModel) { - delete componentProps.model - } - const ComponentProps = Object.assign({}, componentModel && { model: componentModel } || {}, { - ref: '_component', - attrs: Object.assign({}, { - ...((componentProps && componentProps.attrs) || componentProps) - }), - on: Object.assign({}, { - ...((componentProps && componentProps.on) || componentProps) - }) - }) - - return h(Modal, ModalProps, [h(component, ComponentProps)]) - } - }).$mount(dialogDiv) - } - - Object.defineProperty(Vue.prototype, '$dialog', { - get: () => { - return function () { - dialog.apply(this, arguments) - } - } - }) -} diff --git a/quantdinger_vue/src/components/Editor/QuillEditor.vue b/quantdinger_vue/src/components/Editor/QuillEditor.vue deleted file mode 100644 index a9610ee..0000000 --- a/quantdinger_vue/src/components/Editor/QuillEditor.vue +++ /dev/null @@ -1,79 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Editor/WangEditor.vue b/quantdinger_vue/src/components/Editor/WangEditor.vue deleted file mode 100644 index d9c71c7..0000000 --- a/quantdinger_vue/src/components/Editor/WangEditor.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Ellipsis/Ellipsis.vue b/quantdinger_vue/src/components/Ellipsis/Ellipsis.vue deleted file mode 100644 index 5d59200..0000000 --- a/quantdinger_vue/src/components/Ellipsis/Ellipsis.vue +++ /dev/null @@ -1,64 +0,0 @@ - diff --git a/quantdinger_vue/src/components/Ellipsis/index.js b/quantdinger_vue/src/components/Ellipsis/index.js deleted file mode 100644 index 91e3ff4..0000000 --- a/quantdinger_vue/src/components/Ellipsis/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Ellipsis from './Ellipsis' - -export default Ellipsis diff --git a/quantdinger_vue/src/components/Ellipsis/index.md b/quantdinger_vue/src/components/Ellipsis/index.md deleted file mode 100644 index f528ac7..0000000 --- a/quantdinger_vue/src/components/Ellipsis/index.md +++ /dev/null @@ -1,38 +0,0 @@ -# Ellipsis ๆ–‡ๆœฌ่‡ชๅŠจ็œ็•ฅๅท - -ๆ–‡ๆœฌ่ฟ‡้•ฟ่‡ชๅŠจๅค„็†็œ็•ฅๅท๏ผŒๆ”ฏๆŒๆŒ‰็…งๆ–‡ๆœฌ้•ฟๅบฆๅ’Œๆœ€ๅคง่กŒๆ•ฐไธค็งๆ–นๅผๆˆชๅ–ใ€‚ - - - -ๅผ•็”จๆ–นๅผ๏ผš - -```javascript -import Ellipsis from '@/components/Ellipsis' - -export default { - components: { - Ellipsis - } -} -``` - - - -## ไปฃ็ ๆผ”็คบ [demo](https://pro.loacg.com/test/home) - -```html - - There were injuries alleged in three cases in 2015, and a - fourth incident in September, according to the safety recall report. After meeting with US regulators in October, the firm decided to issue a voluntary recall. - -``` - - - -## API - - -ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ -----|------|-----|------ -tooltip | ็งปๅŠจๅˆฐๆ–‡ๆœฌๅฑ•็คบๅฎŒๆ•ดๅ†…ๅฎน็š„ๆ็คบ | boolean | - -length | ๅœจๆŒ‰็…ง้•ฟๅบฆๆˆชๅ–ไธ‹็š„ๆ–‡ๆœฌๆœ€ๅคงๅญ—็ฌฆๆ•ฐ๏ผŒ่ถ…่ฟ‡ๅˆ™ๆˆชๅ–็œ็•ฅ | number | - \ No newline at end of file diff --git a/quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue b/quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue deleted file mode 100644 index ea07123..0000000 --- a/quantdinger_vue/src/components/FooterToolbar/FooterToolBar.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/FooterToolbar/index.js b/quantdinger_vue/src/components/FooterToolbar/index.js deleted file mode 100644 index a0bf145..0000000 --- a/quantdinger_vue/src/components/FooterToolbar/index.js +++ /dev/null @@ -1,4 +0,0 @@ -import FooterToolBar from './FooterToolBar' -import './index.less' - -export default FooterToolBar diff --git a/quantdinger_vue/src/components/FooterToolbar/index.less b/quantdinger_vue/src/components/FooterToolbar/index.less deleted file mode 100644 index 3f49436..0000000 --- a/quantdinger_vue/src/components/FooterToolbar/index.less +++ /dev/null @@ -1,23 +0,0 @@ -@import '../index'; - -@footer-toolbar-prefix-cls: ~"@{ant-pro-prefix}-footer-toolbar"; - -.@{footer-toolbar-prefix-cls} { - position: fixed; - right: 0; - bottom: 0; - z-index: 9; - width: 100%; - height: 56px; - padding: 0 24px; - line-height: 56px; - background: #fff; - box-shadow: 0 -1px 2px rgb(0 0 0 / 3%); - border-top: 1px solid #e8e8e8; - - &::after { - display: block; - clear: both; - content: ''; - } -} diff --git a/quantdinger_vue/src/components/FooterToolbar/index.md b/quantdinger_vue/src/components/FooterToolbar/index.md deleted file mode 100644 index c1aec2c..0000000 --- a/quantdinger_vue/src/components/FooterToolbar/index.md +++ /dev/null @@ -1,48 +0,0 @@ -# FooterToolbar ๅบ•้ƒจๅทฅๅ…ทๆ  - -ๅ›บๅฎšๅœจๅบ•้ƒจ็š„ๅทฅๅ…ทๆ ใ€‚ - - - -## ไฝ•ๆ—ถไฝฟ็”จ - -ๅ›บๅฎšๅœจๅ†…ๅฎนๅŒบๅŸŸ็š„ๅบ•้ƒจ๏ผŒไธ้šๆปšๅŠจๆก็งปๅŠจ๏ผŒๅธธ็”จไบŽ้•ฟ้กต้ข็š„ๆ•ฐๆฎๆœ้›†ๅ’Œๆไบคๅทฅไฝœใ€‚ - - - -ๅผ•็”จๆ–นๅผ๏ผš - -```javascript -import FooterToolBar from '@/components/FooterToolbar' - -export default { - components: { - FooterToolBar - } -} -``` - - - -## ไปฃ็ ๆผ”็คบ - -```html - - ๆไบค - -``` -ๆˆ– -```html - - ๆไบค - -``` - - -## API - -ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ -----|------|-----|------ -children (slot) | ๅทฅๅ…ทๆ ๅ†…ๅฎน๏ผŒๅ‘ๅณๅฏน้ฝ | - | - -extra | ้ขๅค–ไฟกๆฏ๏ผŒๅ‘ๅทฆๅฏน้ฝ | String, Object | - - diff --git a/quantdinger_vue/src/components/GlobalFooter/index.vue b/quantdinger_vue/src/components/GlobalFooter/index.vue deleted file mode 100644 index 564af54..0000000 --- a/quantdinger_vue/src/components/GlobalFooter/index.vue +++ /dev/null @@ -1,129 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue b/quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue deleted file mode 100644 index 2818c4b..0000000 --- a/quantdinger_vue/src/components/GlobalHeader/AvatarDropdown.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/GlobalHeader/RightContent.vue b/quantdinger_vue/src/components/GlobalHeader/RightContent.vue deleted file mode 100644 index 40e3275..0000000 --- a/quantdinger_vue/src/components/GlobalHeader/RightContent.vue +++ /dev/null @@ -1,164 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/IconSelector/IconSelector.vue b/quantdinger_vue/src/components/IconSelector/IconSelector.vue deleted file mode 100644 index 810d297..0000000 --- a/quantdinger_vue/src/components/IconSelector/IconSelector.vue +++ /dev/null @@ -1,86 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/IconSelector/README.md b/quantdinger_vue/src/components/IconSelector/README.md deleted file mode 100644 index 503095d..0000000 --- a/quantdinger_vue/src/components/IconSelector/README.md +++ /dev/null @@ -1,48 +0,0 @@ -IconSelector -==== - -> ๅ›พๆ ‡้€‰ๆ‹ฉ็ป„ไปถ๏ผŒๅธธ็”จไบŽไธบๆŸไธ€ไธชๆ•ฐๆฎ่ฎพๅฎšไธ€ไธชๅ›พๆ ‡ๆ—ถไฝฟ็”จ -> eg: ่ฎพๅฎš่œๅ•ๅˆ—่กจๆ—ถ๏ผŒไธบๆฏไธช่œๅ•่ฎพๅฎšไธ€ไธชๅ›พๆ ‡ - -่ฏฅ็ป„ไปถ็”ฑ [@Saraka](https://github.com/saraka-tsukai) ๅฐ่ฃ… - - - -### ไฝฟ็”จๆ–นๅผ - -```vue - - - -``` - - - -### ไบ‹ไปถ - - -| ๅ็งฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | -| ------ | -------------------------- | ------ | ------ | -| change | ๅฝ“ๆ”นๅ˜ไบ† `icon` ้€‰ไธญ้กน่งฆๅ‘ | String | - | diff --git a/quantdinger_vue/src/components/IconSelector/icons.js b/quantdinger_vue/src/components/IconSelector/icons.js deleted file mode 100644 index 920f464..0000000 --- a/quantdinger_vue/src/components/IconSelector/icons.js +++ /dev/null @@ -1,36 +0,0 @@ -/** - * ๅขžๅŠ ๆ–ฐ็š„ๅ›พๆ ‡ๆ—ถ๏ผŒ่ฏท้ตๅพชไปฅไธ‹ๆ•ฐๆฎ็ป“ๆž„ - * Adding new icon please follow the data structure below - */ -export default [ - { - key: 'directional', - title: 'ๆ–นๅ‘ๆ€งๅ›พๆ ‡', - icons: ['step-backward', 'step-forward', 'fast-backward', 'fast-forward', 'shrink', 'arrows-alt', 'down', 'up', 'left', 'right', 'caret-up', 'caret-down', 'caret-left', 'caret-right', 'up-circle', 'down-circle', 'left-circle', 'right-circle', 'double-right', 'double-left', 'vertical-left', 'vertical-right', 'forward', 'backward', 'rollback', 'enter', 'retweet', 'swap', 'swap-left', 'swap-right', 'arrow-up', 'arrow-down', 'arrow-left', 'arrow-right', 'play-circle', 'up-square', 'down-square', 'left-square', 'right-square', 'login', 'logout', 'menu-fold', 'menu-unfold', 'border-bottom', 'border-horizontal', 'border-inner', 'border-left', 'border-right', 'border-top', 'border-verticle', 'pic-center', 'pic-left', 'pic-right', 'radius-bottomleft', 'radius-bottomright', 'radius-upleft', 'fullscreen', 'fullscreen-exit'] - }, - { - key: 'suggested', - title: 'ๆ็คบๅปบ่ฎฎๆ€งๅ›พๆ ‡', - icons: ['question', 'question-circle', 'plus', 'plus-circle', 'pause', 'pause-circle', 'minus', 'minus-circle', 'plus-square', 'minus-square', 'info', 'info-circle', 'exclamation', 'exclamation-circle', 'close', 'close-circle', 'close-square', 'check', 'check-circle', 'check-square', 'clock-circle', 'warning', 'issues-close', 'stop'] - }, - { - key: 'editor', - title: '็ผ–่พ‘็ฑปๅ›พๆ ‡', - icons: ['edit', 'form', 'copy', 'scissor', 'delete', 'snippets', 'diff', 'highlight', 'align-center', 'align-left', 'align-right', 'bg-colors', 'bold', 'italic', 'underline', 'strikethrough', 'redo', 'undo', 'zoom-in', 'zoom-out', 'font-colors', 'font-size', 'line-height', 'colum-height', 'dash', 'small-dash', 'sort-ascending', 'sort-descending', 'drag', 'ordered-list', 'radius-setting'] - }, - { - key: 'data', - title: 'ๆ•ฐๆฎ็ฑปๅ›พๆ ‡', - icons: ['area-chart', 'pie-chart', 'bar-chart', 'dot-chart', 'line-chart', 'radar-chart', 'heat-map', 'fall', 'rise', 'stock', 'box-plot', 'fund', 'sliders'] - }, - { - key: 'brand_logo', - title: '็ฝ‘็ซ™้€š็”จๅ›พๆ ‡', - icons: ['lock', 'unlock', 'bars', 'book', 'calendar', 'cloud', 'cloud-download', 'code', 'copy', 'credit-card', 'delete', 'desktop', 'download', 'ellipsis', 'file', 'file-text', 'file-unknown', 'file-pdf', 'file-word', 'file-excel', 'file-jpg', 'file-ppt', 'file-markdown', 'file-add', 'folder', 'folder-open', 'folder-add', 'hdd', 'frown', 'meh', 'smile', 'inbox', 'laptop', 'appstore', 'link', 'mail', 'mobile', 'notification', 'paper-clip', 'picture', 'poweroff', 'reload', 'search', 'setting', 'share-alt', 'shopping-cart', 'tablet', 'tag', 'tags', 'to-top', 'upload', 'user', 'video-camera', 'home', 'loading', 'loading-3-quarters', 'cloud-upload', 'star', 'heart', 'environment', 'eye', 'camera', 'save', 'team', 'solution', 'phone', 'filter', 'exception', 'export', 'customer-service', 'qrcode', 'scan', 'like', 'dislike', 'message', 'pay-circle', 'calculator', 'pushpin', 'bulb', 'select', 'switcher', 'rocket', 'bell', 'disconnect', 'database', 'compass', 'barcode', 'hourglass', 'key', 'flag', 'layout', 'printer', 'sound', 'usb', 'skin', 'tool', 'sync', 'wifi', 'car', 'schedule', 'user-add', 'user-delete', 'usergroup-add', 'usergroup-delete', 'man', 'woman', 'shop', 'gift', 'idcard', 'medicine-box', 'red-envelope', 'coffee', 'copyright', 'trademark', 'safety', 'wallet', 'bank', 'trophy', 'contacts', 'global', 'shake', 'api', 'fork', 'dashboard', 'table', 'profile', 'alert', 'audit', 'branches', 'build', 'border', 'crown', 'experiment', 'fire', 'money-collect', 'property-safety', 'read', 'reconciliation', 'rest', 'security-scan', 'insurance', 'interation', 'safety-certificate', 'project', 'thunderbolt', 'block', 'cluster', 'deployment-unit', 'dollar', 'euro', 'pound', 'file-done', 'file-exclamation', 'file-protect', 'file-search', 'file-sync', 'gateway', 'gold', 'robot', 'shopping'] - }, - { - key: 'application', - title: 'ๅ“็‰Œๅ’Œๆ ‡่ฏ†', - icons: ['android', 'apple', 'windows', 'ie', 'chrome', 'github', 'aliwangwang', 'dingding', 'weibo-square', 'weibo-circle', 'taobao-circle', 'html5', 'weibo', 'twitter', 'wechat', 'youtube', 'alipay-circle', 'taobao', 'skype', 'qq', 'medium-workmark', 'gitlab', 'medium', 'linkedin', 'google-plus', 'dropbox', 'facebook', 'codepen', 'code-sandbox', 'amazon', 'google', 'codepen-circle', 'alipay', 'ant-design', 'aliyun', 'zhihu', 'slack', 'slack-square', 'behance', 'behance-square', 'dribbble', 'dribbble-square', 'instagram', 'yuque', 'alibaba', 'yahoo'] - } -] diff --git a/quantdinger_vue/src/components/IconSelector/index.js b/quantdinger_vue/src/components/IconSelector/index.js deleted file mode 100644 index 2d27d70..0000000 --- a/quantdinger_vue/src/components/IconSelector/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import IconSelector from './IconSelector' -export default IconSelector diff --git a/quantdinger_vue/src/components/MultiTab/MultiTab.vue b/quantdinger_vue/src/components/MultiTab/MultiTab.vue deleted file mode 100644 index fe2c3f7..0000000 --- a/quantdinger_vue/src/components/MultiTab/MultiTab.vue +++ /dev/null @@ -1,161 +0,0 @@ - diff --git a/quantdinger_vue/src/components/MultiTab/events.js b/quantdinger_vue/src/components/MultiTab/events.js deleted file mode 100644 index b0230b5..0000000 --- a/quantdinger_vue/src/components/MultiTab/events.js +++ /dev/null @@ -1,2 +0,0 @@ -import Vue from 'vue' -export default new Vue() diff --git a/quantdinger_vue/src/components/MultiTab/index.js b/quantdinger_vue/src/components/MultiTab/index.js deleted file mode 100644 index a047100..0000000 --- a/quantdinger_vue/src/components/MultiTab/index.js +++ /dev/null @@ -1,40 +0,0 @@ -import events from './events' -import MultiTab from './MultiTab' -import './index.less' - -const api = { - /** - * open new tab on route fullPath - * @param config - */ - open: function (config) { - events.$emit('open', config) - }, - rename: function (key, name) { - events.$emit('rename', { key: key, name: name }) - }, - /** - * close current page - */ - closeCurrentPage: function () { - this.close() - }, - /** - * close route fullPath tab - * @param config - */ - close: function (config) { - events.$emit('close', config) - } -} - -MultiTab.install = function (Vue) { - if (Vue.prototype.$multiTab) { - return - } - api.instance = events - Vue.prototype.$multiTab = api - Vue.component('MultiTab', MultiTab) -} - -export default MultiTab diff --git a/quantdinger_vue/src/components/MultiTab/index.less b/quantdinger_vue/src/components/MultiTab/index.less deleted file mode 100644 index d9d9fa6..0000000 --- a/quantdinger_vue/src/components/MultiTab/index.less +++ /dev/null @@ -1,25 +0,0 @@ -@import '../index'; - -@multi-tab-prefix-cls: ~"@{ant-pro-prefix}-multi-tab"; -@multi-tab-wrapper-prefix-cls: ~"@{ant-pro-prefix}-multi-tab-wrapper"; - -/* -.topmenu .@{multi-tab-prefix-cls} { - max-width: 1200px; - margin: -23px auto 24px auto; -} -*/ -.@{multi-tab-prefix-cls} { - margin: -23px -24px 24px; - background: #fff; -} - -.topmenu .@{multi-tab-wrapper-prefix-cls} { - max-width: 1200px; - margin: 0 auto; -} - -.topmenu.content-width-Fluid .@{multi-tab-wrapper-prefix-cls} { - max-width: 100%; - margin: 0 auto; -} diff --git a/quantdinger_vue/src/components/NProgress/nprogress.less b/quantdinger_vue/src/components/NProgress/nprogress.less deleted file mode 100644 index 6593834..0000000 --- a/quantdinger_vue/src/components/NProgress/nprogress.less +++ /dev/null @@ -1,70 +0,0 @@ -@import url('../index.less'); - -/* Make clicks pass-through */ -#nprogress { - pointer-events: none; -} - -#nprogress .bar { - position: fixed; - top: 0; - left: 0; - z-index: 1031; - width: 100%; - height: 2px; - background: @primary-color; -} - -/* Fancy blur effect */ -#nprogress .peg { - position: absolute; - right: 0; - display: block; - width: 100px; - height: 100%; - opacity: 1; - transform: rotate(3deg) translate(0, -4px); - transform: rotate(3deg) translate(0, -4px); - transform: rotate(3deg) translate(0, -4px); - box-shadow: 0 0 10px @primary-color, 0 0 5px @primary-color; -} - -/* Remove these to get rid of the spinner */ -#nprogress .spinner { - position: fixed; - top: 15px; - right: 15px; - z-index: 1031; - display: block; -} - -#nprogress .spinner-icon { - width: 18px; - height: 18px; - box-sizing: border-box; - border: solid 2px transparent; - border-top-color: @primary-color; - border-left-color: @primary-color; - border-radius: 50%; - animation: nprogress-spinner 400ms linear infinite; - animation: nprogress-spinner 400ms linear infinite; -} - -.nprogress-custom-parent { - position: relative; - overflow: hidden; -} - -.nprogress-custom-parent #nprogress .spinner, -.nprogress-custom-parent #nprogress .bar { - position: absolute; -} - -@keyframes nprogress-spinner { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} -@keyframes nprogress-spinner { - 0% { transform: rotate(0deg); } - 100% { transform: rotate(360deg); } -} diff --git a/quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue b/quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue deleted file mode 100644 index a849e2f..0000000 --- a/quantdinger_vue/src/components/NoticeIcon/NoticeIcon.vue +++ /dev/null @@ -1,844 +0,0 @@ - - - - - - - diff --git a/quantdinger_vue/src/components/NoticeIcon/index.js b/quantdinger_vue/src/components/NoticeIcon/index.js deleted file mode 100644 index 659b9ec..0000000 --- a/quantdinger_vue/src/components/NoticeIcon/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import NoticeIcon from './NoticeIcon' -export default NoticeIcon diff --git a/quantdinger_vue/src/components/NumberInfo/NumberInfo.vue b/quantdinger_vue/src/components/NumberInfo/NumberInfo.vue deleted file mode 100644 index bdde3e0..0000000 --- a/quantdinger_vue/src/components/NumberInfo/NumberInfo.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/NumberInfo/index.js b/quantdinger_vue/src/components/NumberInfo/index.js deleted file mode 100644 index 659a2f3..0000000 --- a/quantdinger_vue/src/components/NumberInfo/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import NumberInfo from './NumberInfo' - -export default NumberInfo diff --git a/quantdinger_vue/src/components/NumberInfo/index.less b/quantdinger_vue/src/components/NumberInfo/index.less deleted file mode 100644 index 82cbd7e..0000000 --- a/quantdinger_vue/src/components/NumberInfo/index.less +++ /dev/null @@ -1,55 +0,0 @@ -@import '../index'; - -@numberInfo-prefix-cls: ~"@{ant-pro-prefix}-number-info"; - -.@{numberInfo-prefix-cls} { - .ant-pro-number-info-subtitle { - height: 22px; - overflow: hidden; - font-size: @font-size-base; - line-height: 22px; - color: @text-color-secondary; - text-overflow: ellipsis; - word-break: break-all; - white-space: nowrap; - } - - .number-info-value { - margin-top: 4px; - overflow: hidden; - font-size: 0; - text-overflow: ellipsis; - word-break: break-all; - white-space: nowrap; - - & > span { - display: inline-block; - height: 32px; - margin-right: 32px; - font-size: 24px; - line-height: 32px; - color: @heading-color; - } - - .sub-total { - margin-right: 0; - font-size: @font-size-lg; - color: @text-color-secondary; - vertical-align: top; - - i { - margin-left: 4px; - font-size: 12px; - transform: scale(.82); - } - - .anticon-caret-up { - color: @red-6; - } - - .anticon-caret-down { - color: @green-6; - } - } - } -} diff --git a/quantdinger_vue/src/components/NumberInfo/index.md b/quantdinger_vue/src/components/NumberInfo/index.md deleted file mode 100644 index 147adc4..0000000 --- a/quantdinger_vue/src/components/NumberInfo/index.md +++ /dev/null @@ -1,43 +0,0 @@ -# NumberInfo ๆ•ฐๆฎๆ–‡ๆœฌ - -ๅธธ็”จๅœจๆ•ฐๆฎๅก็‰‡ไธญ๏ผŒ็”จไบŽ็ชๅ‡บๅฑ•็คบๆŸไธชไธšๅŠกๆ•ฐๆฎใ€‚ - - - -ๅผ•็”จๆ–นๅผ๏ผš - -```javascript -import NumberInfo from '@/components/NumberInfo' - -export default { - components: { - NumberInfo - } -} -``` - - - -## ไปฃ็ ๆผ”็คบ [demo](https://pro.loacg.com/test/home) - -```html - -``` - - - -## API - -ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ -----|------|-----|------ -title | ๆ ‡้ข˜ | ReactNode\|string | - -subTitle | ๅญๆ ‡้ข˜ | ReactNode\|string | - -total | ๆ€ป้‡ | ReactNode\|string | - -subTotal | ๅญๆ€ป้‡ | ReactNode\|string | - -status | ๅขžๅŠ ็Šถๆ€ | 'up \| down' | - -theme | ็Šถๆ€ๆ ทๅผ | string | 'light' -gap | ่ฎพ็ฝฎๆ•ฐๅญ—ๅ’Œๆ่ฟฐไน‹้—ด็š„้—ด่ท๏ผˆๅƒ็ด ๏ผ‰| number | 8 diff --git a/quantdinger_vue/src/components/Other/CarbonAds.vue b/quantdinger_vue/src/components/Other/CarbonAds.vue deleted file mode 100644 index 32099c6..0000000 --- a/quantdinger_vue/src/components/Other/CarbonAds.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - diff --git a/quantdinger_vue/src/components/PageLoading/index.jsx b/quantdinger_vue/src/components/PageLoading/index.jsx deleted file mode 100644 index af6d6d6..0000000 --- a/quantdinger_vue/src/components/PageLoading/index.jsx +++ /dev/null @@ -1,106 +0,0 @@ -import { Spin } from 'ant-design-vue' - -export const PageLoading = { - name: 'PageLoading', - props: { - tip: { - type: String, - default: 'Loading..' - }, - size: { - type: String, - default: 'large' - } - }, - render () { - const style = { - textAlign: 'center', - background: 'rgba(0,0,0,0.6)', - position: 'fixed', - top: 0, - bottom: 0, - left: 0, - right: 0, - zIndex: 1100 - } - const spinStyle = { - position: 'absolute', - left: '50%', - top: '40%', - transform: 'translate(-50%, -50%)' - } - return (
    - -
    ) - } -} - -const version = '0.0.1' -const loading = {} - -loading.newInstance = (Vue, options) => { - let loadingElement = document.querySelector('body>div[type=loading]') - if (!loadingElement) { - loadingElement = document.createElement('div') - loadingElement.setAttribute('type', 'loading') - loadingElement.setAttribute('class', 'ant-loading-wrapper') - document.body.appendChild(loadingElement) - } - - const cdProps = Object.assign({ visible: false, size: 'large', tip: 'Loading...' }, options) - - const instance = new Vue({ - data () { - return { - ...cdProps - } - }, - render () { - const { tip } = this - const props = {} - this.tip && (props.tip = tip) - if (this.visible) { - return - } - return null - } - }).$mount(loadingElement) - - function update (config) { - const { visible, size, tip } = { ...cdProps, ...config } - instance.$set(instance, 'visible', visible) - if (tip) { - instance.$set(instance, 'tip', tip) - } - if (size) { - instance.$set(instance, 'size', size) - } - } - - return { - instance, - update - } -} - -const api = { - show: function (options) { - this.instance.update({ ...options, visible: true }) - }, - hide: function () { - this.instance.update({ visible: false }) - } -} - -const install = function (Vue, options) { - if (Vue.prototype.$loading) { - return - } - api.instance = loading.newInstance(Vue, options) - Vue.prototype.$loading = api -} - -export default { - version, - install -} diff --git a/quantdinger_vue/src/components/Search/GlobalSearch.jsx b/quantdinger_vue/src/components/Search/GlobalSearch.jsx deleted file mode 100644 index 13bfa56..0000000 --- a/quantdinger_vue/src/components/Search/GlobalSearch.jsx +++ /dev/null @@ -1,62 +0,0 @@ -import { Select } from 'ant-design-vue' -import './index.less' - -const GlobalSearch = { - name: 'GlobalSearch', - data () { - return { - visible: false - } - }, - mounted () { - const keyboardHandle = (e) => { - e.preventDefault() - e.stopPropagation() - const { ctrlKey, shiftKey, altKey, keyCode } = e - // key is `K` and hold ctrl - if (keyCode === 75 && ctrlKey && !shiftKey && !altKey) { - this.visible = !this.visible - } - } - document.addEventListener('keydown', keyboardHandle) - }, - render () { - const { visible } = this - const handleSearch = (e) => { - this.$emit('search', e) - } - - const handleChange = (e) => { - this.$emit('change', e) - } - if (!visible) { - return null - } - return ( - - ) - } -} - -GlobalSearch.install = function (Vue) { - Vue.component(GlobalSearch.name, GlobalSearch) -} - -export default GlobalSearch diff --git a/quantdinger_vue/src/components/Search/index.less b/quantdinger_vue/src/components/Search/index.less deleted file mode 100644 index f8b51b5..0000000 --- a/quantdinger_vue/src/components/Search/index.less +++ /dev/null @@ -1,25 +0,0 @@ -@import '~ant-design-vue/es/style/themes/default'; - -.global-search-wrapper { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: @zindex-modal-mask; - background: @modal-mask-bg; - - .global-search-box { - position: absolute; - top: 20%; - left: 50%; - width: 450px; - transform: translate(-50%, -50%); - - .global-search-tips { - font-size: @font-size-lg; - color: @white; - text-align: right; - } - } -} diff --git a/quantdinger_vue/src/components/SelectLang/index.jsx b/quantdinger_vue/src/components/SelectLang/index.jsx deleted file mode 100644 index 237bbfe..0000000 --- a/quantdinger_vue/src/components/SelectLang/index.jsx +++ /dev/null @@ -1,70 +0,0 @@ -import './index.less' - -import { Icon, Menu, Dropdown } from 'ant-design-vue' -import { i18nRender } from '@/locales' -import i18nMixin from '@/store/i18n-mixin' - -const locales = ['en-US', 'ja-JP', 'ko-KR', 'vi-VN', 'th-TH', 'ar-SA', 'fr-FR', 'de-DE', 'zh-TW', 'zh-CN'] -const languageLabels = { - 'zh-CN': '็ฎ€ไฝ“ไธญๆ–‡', - 'zh-TW': '็น้ซ”ไธญๆ–‡', - 'en-US': 'English', - 'ja-JP': 'ๆ—ฅๆœฌ่ชž', - 'ko-KR': 'ํ•œ๊ตญ์–ด', - 'vi-VN': 'Tiแบฟng Viแป‡t', - 'th-TH': 'เน„เธ—เธข', - 'ar-SA': 'ุงู„ุนุฑุจูŠุฉ', - 'fr-FR': 'Franรงais', - 'de-DE': 'Deutsch' -} -// eslint-disable-next-line -const languageIcons = { - 'zh-CN': '๐Ÿ‡จ๐Ÿ‡ณ', - 'zh-TW': 'sg', - 'en-US': '๐Ÿ‡บ๐Ÿ‡ธ', - 'ja-JP': '๐Ÿ‡ฏ๐Ÿ‡ต', - 'ko-KR': '๐Ÿ‡ฐ๐Ÿ‡ท', - 'vi-VN': '๐Ÿ‡ป๐Ÿ‡ณ', - 'th-TH': '๐Ÿ‡น๐Ÿ‡ญ', - 'ar-SA': '๐Ÿ‡ธ๐Ÿ‡ฆ', - 'fr-FR': '๐Ÿ‡ซ๐Ÿ‡ท', - 'de-DE': '๐Ÿ‡ฉ๐Ÿ‡ช' -} - -const SelectLang = { - props: { - prefixCls: { - type: String, - default: 'ant-pro-drop-down' - } - }, - name: 'SelectLang', - mixins: [i18nMixin], - render () { - const { prefixCls } = this - const changeLang = ({ key }) => { - this.setLang(key) - } - const langMenu = ( - - {locales.map(locale => ( - - - {languageIcons[locale]} - {' '} - {languageLabels[locale]} - - ))} - - ) - return ( - - - - - - ) - } -} - -export default SelectLang diff --git a/quantdinger_vue/src/components/SelectLang/index.less b/quantdinger_vue/src/components/SelectLang/index.less deleted file mode 100644 index c0226de..0000000 --- a/quantdinger_vue/src/components/SelectLang/index.less +++ /dev/null @@ -1,47 +0,0 @@ -@import '~ant-design-vue/es/style/themes/default'; - -@header-menu-prefix-cls: ~'@{ant-prefix}-pro-header-menu'; -@header-drop-down-prefix-cls: ~'@{ant-prefix}-pro-drop-down'; - -.@{header-menu-prefix-cls} { - .anticon { - margin-right: 8px; - } - - .ant-dropdown-menu-item { - min-width: 160px; - } -} - -.@{header-drop-down-prefix-cls} { - display: inline-flex; - align-items: center; - justify-content: center; - height: @layout-header-height; - line-height: @layout-header-height; - padding: 0 12px; - vertical-align: top; - cursor: pointer; - transition: all 0.3s; - - &:hover { - background: rgba(0, 0, 0, 0.04); - } - - > i { - font-size: 16px !important; - transform: none !important; - - svg { - position: relative; - top: -1px; - } - } -} - -/* ๆ‰‹ๆœบ็ซฏ้€‚้… */ -@media (max-width: 768px) { - .@{header-drop-down-prefix-cls} { - padding: 0 8px; - } -} diff --git a/quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue b/quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue deleted file mode 100644 index 7a19873..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/SettingDrawer.vue +++ /dev/null @@ -1,355 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/SettingDrawer/SettingItem.vue b/quantdinger_vue/src/components/SettingDrawer/SettingItem.vue deleted file mode 100644 index 2b3b553..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/SettingItem.vue +++ /dev/null @@ -1,38 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/SettingDrawer/index.js b/quantdinger_vue/src/components/SettingDrawer/index.js deleted file mode 100644 index 8260f2d..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/index.js +++ /dev/null @@ -1,2 +0,0 @@ -import SettingDrawer from './SettingDrawer' -export default SettingDrawer diff --git a/quantdinger_vue/src/components/SettingDrawer/settingConfig.js b/quantdinger_vue/src/components/SettingDrawer/settingConfig.js deleted file mode 100644 index 9e715d7..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/settingConfig.js +++ /dev/null @@ -1,53 +0,0 @@ -import message from 'ant-design-vue/es/message' -// import defaultSettings from '../defaultSettings'; -import themeColor from './themeColor.js' -import i18n from '@/locales' - -// let lessNodesAppended -const getColorList = () => { - return [ - { - key: i18n.t('app.setting.themecolor.dust'), color: '#F5222D' - }, - { - key: i18n.t('app.setting.themecolor.volcano'), color: '#FA541C' - }, - { - key: i18n.t('app.setting.themecolor.sunset'), color: '#FAAD14' - }, - { - key: i18n.t('app.setting.themecolor.cyan'), color: '#13C2C2' - }, - { - key: i18n.t('app.setting.themecolor.green'), color: '#52C41A' - }, - { - key: i18n.t('app.setting.themecolor.daybreak'), color: '#1890FF' - }, - { - key: i18n.t('app.setting.themecolor.geekblue'), color: '#2F54EB' - }, - { - key: i18n.t('app.setting.themecolor.purple'), color: '#722ED1' - } - ] -} - -const updateTheme = (newPrimaryColor, silent = false) => { - const hideMessage = silent ? null : message.loading(i18n.t('app.setting.theme.switching'), 0) - themeColor.changeColor(newPrimaryColor).finally(() => { - if (hideMessage) { - setTimeout(() => { - hideMessage() - }, 10) - } - }) -} - -const updateColorWeak = colorWeak => { - // document.body.className = colorWeak ? 'colorWeak' : ''; - const app = document.body.querySelector('#app') - colorWeak ? app.classList.add('colorWeak') : app.classList.remove('colorWeak') -} - -export { updateTheme, getColorList, updateColorWeak } diff --git a/quantdinger_vue/src/components/SettingDrawer/themeColor.js b/quantdinger_vue/src/components/SettingDrawer/themeColor.js deleted file mode 100644 index 68f1369..0000000 --- a/quantdinger_vue/src/components/SettingDrawer/themeColor.js +++ /dev/null @@ -1,36 +0,0 @@ -import client from 'webpack-theme-color-replacer/client' -import generate from '@ant-design/colors/lib/generate' - -export default { - getAntdSerials (color) { - // ๆทกๅŒ–๏ผˆๅณless็š„tint๏ผ‰ - const lightens = new Array(9).fill().map((t, i) => { - return client.varyColor.lighten(color, i / 10) - }) - // colorPaletteๅ˜ๆขๅพ—ๅˆฐ้ขœ่‰ฒๅ€ผ - const colorPalettes = generate(color) - const rgb = client.varyColor.toNum3(color.replace('#', '')).join(',') - return lightens.concat(colorPalettes).concat(rgb) - }, - changeColor (newColor) { - // Check if client.changer is available (plugin might not be loaded in some build configs) - if (!client || !client.changer || typeof client.changer.changeColor !== 'function') { - // Return a resolved promise to avoid breaking the calling code - return Promise.resolve() - } - - var options = { - newColors: this.getAntdSerials(newColor), // new colors array, one-to-one corresponde with `matchColors` - changeUrl (cssUrl) { - return `/${cssUrl}` // while router is not `hash` mode, it needs absolute path - } - } - - try { - return client.changer.changeColor(options, Promise) - } catch (error) { - // Return a resolved promise to avoid breaking the calling code - return Promise.resolve() - } - } -} diff --git a/quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue b/quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue deleted file mode 100644 index febc684..0000000 --- a/quantdinger_vue/src/components/StandardFormRow/StandardFormRow.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/StandardFormRow/index.js b/quantdinger_vue/src/components/StandardFormRow/index.js deleted file mode 100644 index 8155cc7..0000000 --- a/quantdinger_vue/src/components/StandardFormRow/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import StandardFormRow from './StandardFormRow' - -export default StandardFormRow diff --git a/quantdinger_vue/src/components/Table/README.md b/quantdinger_vue/src/components/Table/README.md deleted file mode 100644 index 1d2c9d0..0000000 --- a/quantdinger_vue/src/components/Table/README.md +++ /dev/null @@ -1,341 +0,0 @@ -Table ้‡ๅฐ่ฃ…็ป„ไปถ่ฏดๆ˜Ž -==== - - -ๅฐ่ฃ…่ฏดๆ˜Ž ----- - -> ๅŸบ็ก€็š„ไฝฟ็”จๆ–นๅผไธŽ API ไธŽ [ๅฎ˜ๆ–น็‰ˆ(Table)](https://vuecomponent.github.io/ant-design-vue/components/table-cn/) ๆœฌไธ€่‡ด๏ผŒๅœจๅ…ถๅŸบ็ก€ไธŠ๏ผŒๅฐ่ฃ…ไบ†ๅŠ ่ฝฝๆ•ฐๆฎ็š„ๆ–นๆณ•ใ€‚ -> -> ไฝ ๆ— ้œ€ๅœจไฝ ๆ˜ฏ็”จ่กจๆ ผ็š„้กต้ข่ฟ›่กŒๅˆ†้กต้€ป่พ‘ๅค„็†๏ผŒไป…้œ€ๅ‘ Table ็ป„ไปถไผ ้€’็ป‘ๅฎš `:data="Promise"` ๅฏน่ฑกๅณๅฏ - -่ฏฅ `table` ็”ฑ [@Saraka](https://github.com/saraka-tsukai) ๅฎŒๆˆๅฐ่ฃ… - - -ไพ‹ๅญ1 ----- -๏ผˆๅŸบ็ก€ไฝฟ็”จ๏ผ‰ - -```vue - - - - - -``` - - - -ไพ‹ๅญ2 ----- - -๏ผˆ็ฎ€ๅ•็š„่กจๆ ผ๏ผŒๆœ€ๅŽไธ€ๅˆ—ๆ˜ฏๅ„็งๆ“ไฝœ๏ผ‰ - -```vue - - - -``` - - - -ๅ†…็ฝฎๆ–นๆณ• ----- - -้€š่ฟ‡ `this.$refs.table` ่ฐƒ็”จ - -`this.$refs.table.refresh(true)` ๅˆทๆ–ฐๅˆ—่กจ (็”จๆˆทๆ–ฐๅขž/ไฟฎๆ”นๆ•ฐๆฎๅŽ๏ผŒ้‡่ฝฝๅˆ—่กจๆ•ฐๆฎ) - -> ๆณจๆ„๏ผš่ฆ่ฐƒ็”จ `refresh(bool)` ้œ€่ฆ็ป™่กจๆ ผ็ป„ไปถ่ฎพๅฎš `ref` ๅ€ผ -> -> `refresh()` ๆ–นๆณ•ๅฏไปฅไผ ไธ€ไธช `bool` ๅ€ผ๏ผŒๅฝ“ๆœ‰ไผ ๅ€ผ ๆˆ–ๅ€ผไธบ `true` ๆ—ถ๏ผŒๅˆ™ๅˆทๆ–ฐๆ—ถไผšๅผบๅˆถๅˆทๆ–ฐๅˆฐ็ฌฌไธ€้กต๏ผˆๅธธ็”จๆˆท้กต้ข ๆœ็ดข ๆŒ‰้’ฎ่ฟ›่กŒๆœ็ดขๆ—ถ๏ผŒ็ป“ๆžœไปŽ็ฌฌไธ€้กตๅผ€ๅง‹ๅˆ†้กต๏ผ‰ - - -ๅ†…็ฝฎๅฑžๆ€ง ----- -> ้™คๅŽป `a-table` ่‡ชๅธฆๅฑžๆ€งๅค–๏ผŒ่ฟ˜่€Œๅค–ๆไพ›ไบ†ไธ€ไบ›้ขๅค–ๅฑžๆ€งๅฑžๆ€ง - - -| ๅฑžๆ€ง | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | -| -------------- | ----------------------------------------------- | ----------------- | ------ | -| alert | ่ฎพ็ฝฎๆ˜ฏๅฆๆ˜พ็คบ่กจๆ ผไฟกๆฏๆ  | [object, boolean] | null | -| showPagination | ๆ˜พ็คบๅˆ†้กต้€‰ๆ‹ฉๅ™จ๏ผŒๅฏไผ  'auto' \| boolean | [string, boolean] | 'auto' | -| data | ๅŠ ่ฝฝๆ•ฐๆฎๆ–นๆณ• ๅฟ…้กปไธบ `Promise` ๅฏน่ฑก **ๅฟ…้กป็ป‘ๅฎš** | Promise | - | - - -`alert` ๅฑžๆ€งๅฏน่ฑก๏ผš - -```javascript -alert: { - show: Boolean, - clear: [Function, Boolean] -} -``` - -ๆณจๆ„ไบ‹้กน ----- - -> ไฝ ๅฏ่ƒฝ้œ€่ฆไธบไบ†ไธŽๅŽ็ซฏๆไพ›็š„ๆŽฅๅฃ่ฟ”ๅ›ž็ป“ๆžœไธ€่‡ด่€ŒๅŽปไฟฎๆ”นไปฅไธ‹ไปฃ็ ๏ผš -> (้œ€่ฆๆณจๆ„็š„ๆ˜ฏ๏ผŒ่ฟ™้‡Œ็š„ไฟฎๆ”นๆ˜ฏๅ…จๅฑ€ๆ€ง็š„๏ผŒๆ„ๅ‘ณ็€ๆ•ดไธช้กน็›ฎๆ‰€ๆœ‰ไฝฟ็”จ่ฏฅ table ็ป„ไปถ้ƒฝ้œ€่ฆ้ตๅฎˆ่ฟ™ไธช่ฟ”ๅ›ž็ป“ๆžœๅฎšไน‰็š„ๅญ—ๆฎตใ€‚) -> -> ๆ–‡ๆกฃไธญ็š„็ป“ๆž„ๆœ‰ๅฏ่ƒฝ็”ฑไบŽ็ป„ไปถ bug ่ฟ›่กŒไฟฎๆญฃ่€Œๆ”นๅŠจใ€‚ๅฎž้™…ไฟฎๆ”น่ฏทไปฅๅฝ“ๆ—ถๆœ€ๆ–ฐ็‰ˆๆœฌไธบๅ‡† - -ไฟฎๆ”น `@/components/table/index.js` ็ฌฌ 156 ่กŒ่ตท - - - -```javascript -result.then(r => { - this.localPagination = this.showPagination && Object.assign({}, this.localPagination, { - current: r.pageNo, // ่ฟ”ๅ›ž็ป“ๆžœไธญ็š„ๅฝ“ๅ‰ๅˆ†้กตๆ•ฐ - total: r.totalCount, // ่ฟ”ๅ›ž็ป“ๆžœไธญ็š„ๆ€ป่ฎฐๅฝ•ๆ•ฐ - showSizeChanger: this.showSizeChanger, - pageSize: (pagination && pagination.pageSize) || - this.localPagination.pageSize - }) || false - // ไธบ้˜ฒๆญขๅˆ ้™คๆ•ฐๆฎๅŽๅฏผ่‡ด้กต้ขๅฝ“ๅ‰้กต้ขๆ•ฐๆฎ้•ฟๅบฆไธบ 0 ,่‡ชๅŠจ็ฟป้กตๅˆฐไธŠไธ€้กต - if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) { - this.localPagination.current-- - this.loadData() - return - } - - // ่ฟ™้‡Œ็”จไบŽๅˆคๆ–ญๆŽฅๅฃๆ˜ฏๅฆๆœ‰่ฟ”ๅ›ž r.totalCount ไธ” this.showPagination = true ไธ” pageNo ๅ’Œ pageSize ๅญ˜ๅœจ ไธ” totalCount ๅฐไบŽ็ญ‰ไบŽ pageNo * pageSize ็š„ๅคงๅฐ - // ๅฝ“ๆƒ…ๅ†ตๆปก่ถณๆ—ถ๏ผŒ่กจ็คบๆ•ฐๆฎไธๆปก่ถณๅˆ†้กตๅคงๅฐ๏ผŒๅ…ณ้—ญ table ๅˆ†้กตๅŠŸ่ƒฝ - try { - if ((['auto', true].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) { - this.localPagination.hideOnSinglePage = true - } - } catch (e) { - this.localPagination = false - } - console.log('loadData -> this.localPagination', this.localPagination) - this.localDataSource = r.data // ่ฟ”ๅ›ž็ป“ๆžœไธญ็š„ๆ•ฐ็ป„ๆ•ฐๆฎ - this.localLoading = false - }) -``` -่ฟ”ๅ›ž JSON ไพ‹ๅญ๏ผš -```json -{ - "message": "", - "result": { - "data": [{ - id: 1, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', - title: 'Alipay', - description: '้‚ฃๆ˜ฏไธ€็งๅ†…ๅœจ็š„ไธœ่ฅฟ๏ผŒ ไป–ไปฌๅˆฐ่พพไธไบ†๏ผŒไนŸๆ— ๆณ•่งฆๅŠ็š„', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 2, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', - title: 'Angular', - description: 'ๅธŒๆœ›ๆ˜ฏไธ€ไธชๅฅฝไธœ่ฅฟ๏ผŒไนŸ่ฎธๆ˜ฏๆœ€ๅฅฝ็š„๏ผŒๅฅฝไธœ่ฅฟๆ˜ฏไธไผšๆถˆไบก็š„', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 3, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', - title: 'Ant Design', - description: 'ๅŸŽ้•‡ไธญๆœ‰้‚ฃไนˆๅคš็š„้…’้ฆ†๏ผŒๅฅนๅดๅๅ่ตฐ่ฟ›ไบ†ๆˆ‘็š„้…’้ฆ†', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 4, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', - title: 'Ant Design Pro', - description: '้‚ฃๆ—ถๅ€™ๆˆ‘ๅชไผšๆƒณ่‡ชๅทฑๆƒณ่ฆไป€ไนˆ๏ผŒไปŽไธๆƒณ่‡ชๅทฑๆ‹ฅๆœ‰ไป€ไนˆ', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 5, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', - title: 'Bootstrap', - description: 'ๅ‡›ๅ†ฌๅฐ†่‡ณ', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 6, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', - title: 'Vue', - description: '็”Ÿๅ‘ฝๅฐฑๅƒไธ€็›’ๅทงๅ…‹ๅŠ›๏ผŒ็ป“ๆžœๅพ€ๅพ€ๅ‡บไบบๆ„ๆ–™', - status: 1, - updatedAt: '2018-07-26 00:00:00' - } - ], - "pageSize": 10, - "pageNo": 0, - "totalPage": 6, - "totalCount": 57 - }, - "status": 200, - "timestamp": 1534955098193 -} -``` - - - -ๆ›ดๆ–ฐๆ—ถ้—ด ----- - -่ฏฅๆ–‡ๆกฃๆœ€ๅŽๆ›ดๆ–ฐไบŽ๏ผš 2019-06-23 PM 17:19 \ No newline at end of file diff --git a/quantdinger_vue/src/components/Table/index.js b/quantdinger_vue/src/components/Table/index.js deleted file mode 100644 index a407a41..0000000 --- a/quantdinger_vue/src/components/Table/index.js +++ /dev/null @@ -1,325 +0,0 @@ -import T from 'ant-design-vue/es/table/Table' -import get from 'lodash.get' - -export default { - data () { - return { - needTotalList: [], - - selectedRows: [], - selectedRowKeys: [], - - localLoading: false, - localDataSource: [], - localPagination: Object.assign({}, this.pagination), - - // ๅญ˜ๅ‚จ่กจๆ ผonchangeๆ—ถ็š„filters๏ผŒ sorterๅฏน่ฑก - filters: {}, - sorter: {} - } - }, - props: Object.assign({}, T.props, { - rowKey: { - type: [String, Function], - default: 'key' - }, - data: { - type: Function, - required: true - }, - pageNum: { - type: Number, - default: 1 - }, - pageSize: { - type: Number, - default: 10 - }, - showSizeChanger: { - type: Boolean, - default: true - }, - size: { - type: String, - default: 'default' - }, - /** - * alert: { - * show: true, - * clear: Function - * } - */ - alert: { - type: [Object, Boolean], - default: null - }, - rowSelection: { - type: Object, - default: null - }, - /** @Deprecated */ - showAlertInfo: { - type: Boolean, - default: false - }, - showPagination: { - type: String | Boolean, - default: 'auto' - }, - /** - * enable page URI mode - * - * e.g: - * /users/1 - * /users/2 - * /users/3?queryParam=test - * ... - */ - pageURI: { - type: Boolean, - default: false - } - }), - watch: { - 'localPagination.current' (val) { - this.pageURI && this.$router.push({ - ...this.$route, - name: this.$route.name, - params: Object.assign({}, this.$route.params, { - pageNo: val - }) - }) - // change pagination, reset total data - this.needTotalList = this.initTotalList(this.columns) - this.selectedRowKeys = [] - this.selectedRows = [] - }, - pageNum (val) { - Object.assign(this.localPagination, { - current: val - }) - }, - pageSize (val) { - Object.assign(this.localPagination, { - pageSize: val - }) - }, - showSizeChanger (val) { - Object.assign(this.localPagination, { - showSizeChanger: val - }) - } - }, - created () { - const { pageNo } = this.$route.params - const localPageNum = this.pageURI && (pageNo && parseInt(pageNo)) || this.pageNum - this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, { - current: localPageNum, - pageSize: this.pageSize, - showSizeChanger: this.showSizeChanger - }) || false - this.needTotalList = this.initTotalList(this.columns) - this.loadData() - }, - methods: { - /** - * ่กจๆ ผ้‡ๆ–ฐๅŠ ่ฝฝๆ–นๆณ• - * ๅฆ‚ๆžœๅ‚ๆ•ฐไธบ true, ๅˆ™ๅผบๅˆถๅˆทๆ–ฐๅˆฐ็ฌฌไธ€้กต - * @param Boolean bool - */ - refresh (bool = false) { - bool && (this.localPagination = Object.assign({}, { - current: 1, pageSize: this.pageSize - })) - this.loadData() - }, - /** - * ๅŠ ่ฝฝๆ•ฐๆฎๆ–นๆณ• - * @param {Object} pagination ๅˆ†้กต้€‰้กนๅ™จ - * @param {Object} filters ่ฟ‡ๆปคๆกไปถ - * @param {Object} sorter ๆŽ’ๅบๆกไปถ - */ - loadData (pagination, filters = this.filters, sorter = this.sorter) { - this.filters = filters - this.sorter = sorter - - this.localLoading = true - const parameter = Object.assign({ - pageNo: (pagination && pagination.current) || - this.showPagination && this.localPagination.current || this.pageNum, - pageSize: (pagination && pagination.pageSize) || - this.showPagination && this.localPagination.pageSize || this.pageSize - }, - (sorter && sorter.field && { - sortField: sorter.field - }) || {}, - (sorter && sorter.order && { - sortOrder: sorter.order - }) || {}, { - ...filters - } - ) - const result = this.data(parameter) - // ๅฏนๆŽฅ่‡ชๅทฑ็š„้€š็”จๆ•ฐๆฎๆŽฅๅฃ้œ€่ฆไฟฎๆ”นไธ‹ๆ–นไปฃ็ ไธญ็š„ r.pageNo, r.totalCount, r.data - // eslint-disable-next-line - if ((typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function') { - result.then(r => { - this.localPagination = this.showPagination && Object.assign({}, this.localPagination, { - current: r.pageNo, // ่ฟ”ๅ›ž็ป“ๆžœไธญ็š„ๅฝ“ๅ‰ๅˆ†้กตๆ•ฐ - total: r.totalCount, // ่ฟ”ๅ›ž็ป“ๆžœไธญ็š„ๆ€ป่ฎฐๅฝ•ๆ•ฐ - showSizeChanger: this.showSizeChanger, - pageSize: (pagination && pagination.pageSize) || - this.localPagination.pageSize - }) || false - // ไธบ้˜ฒๆญขๅˆ ้™คๆ•ฐๆฎๅŽๅฏผ่‡ด้กต้ขๅฝ“ๅ‰้กต้ขๆ•ฐๆฎ้•ฟๅบฆไธบ 0 ,่‡ชๅŠจ็ฟป้กตๅˆฐไธŠไธ€้กต - if (r.data.length === 0 && this.showPagination && this.localPagination.current > 1) { - this.localPagination.current-- - this.loadData() - return - } - - // ่ฟ™้‡Œ็”จไบŽๅˆคๆ–ญๆŽฅๅฃๆ˜ฏๅฆๆœ‰่ฟ”ๅ›ž r.totalCount ไธ” this.showPagination = true ไธ” pageNo ๅ’Œ pageSize ๅญ˜ๅœจ ไธ” totalCount ๅฐไบŽ็ญ‰ไบŽ pageNo * pageSize ็š„ๅคงๅฐ - // ๅฝ“ๆƒ…ๅ†ตๆปก่ถณๆ—ถ๏ผŒ่กจ็คบๆ•ฐๆฎไธๆปก่ถณๅˆ†้กตๅคงๅฐ๏ผŒๅ…ณ้—ญ table ๅˆ†้กตๅŠŸ่ƒฝ - try { - if ((['auto', true].includes(this.showPagination) && r.totalCount <= (r.pageNo * this.localPagination.pageSize))) { - this.localPagination.hideOnSinglePage = true - } - } catch (e) { - this.localPagination = false - } - this.localDataSource = r.data // ่ฟ”ๅ›ž็ป“ๆžœไธญ็š„ๆ•ฐ็ป„ๆ•ฐๆฎ - }) - .finally(() => { - this.localLoading = false - }) - } - }, - initTotalList (columns) { - const totalList = [] - columns && columns instanceof Array && columns.forEach(column => { - if (column.needTotal) { - totalList.push({ - ...column, - total: 0 - }) - } - }) - return totalList - }, - /** - * ็”จไบŽๆ›ดๆ–ฐๅทฒ้€‰ไธญ็š„ๅˆ—่กจๆ•ฐๆฎ total ็ปŸ่ฎก - * @param selectedRowKeys - * @param selectedRows - */ - updateSelect (selectedRowKeys, selectedRows) { - this.selectedRows = selectedRows - this.selectedRowKeys = selectedRowKeys - const list = this.needTotalList - this.needTotalList = list.map(item => { - return { - ...item, - total: selectedRows.reduce((sum, val) => { - const total = sum + parseInt(get(val, item.dataIndex)) - return isNaN(total) ? 0 : total - }, 0) - } - }) - }, - /** - * ๆธ…็ฉบ table ๅทฒ้€‰ไธญ้กน - */ - clearSelected () { - if (this.rowSelection) { - this.rowSelection.onChange([], []) - this.updateSelect([], []) - } - }, - /** - * ๅค„็†ไบค็ป™ table ไฝฟ็”จ่€…ๅŽปๅค„็† clear ไบ‹ไปถๆ—ถ๏ผŒๅ†…้ƒจ้€‰ไธญ็ปŸ่ฎกๅŒๆ—ถ่ฐƒ็”จ - * @param callback - * @returns {*} - */ - renderClear (callback) { - if (this.selectedRowKeys.length <= 0) return null - return ( - { - callback() - this.clearSelected() - }}>ๆธ…็ฉบ - ) - }, - renderAlert () { - // ็ป˜ๅˆถ็ปŸ่ฎกๅˆ—ๆ•ฐๆฎ - const needTotalItems = this.needTotalList.map((item) => { - return ( - {item.title}ๆ€ป่ฎก {!item.customRender ? item.total : item.customRender(item.total)} - ) - }) - - // ็ป˜ๅˆถ ๆธ…็ฉบ ๆŒ‰้’ฎ - const clearItem = (typeof this.alert.clear === 'boolean' && this.alert.clear) ? ( - this.renderClear(this.clearSelected) - ) : (this.alert !== null && typeof this.alert.clear === 'function') ? ( - this.renderClear(this.alert.clear) - ) : null - - // ็ป˜ๅˆถ alert ็ป„ไปถ - return ( - - - - ) - } - }, - - render () { - const props = {} - const localKeys = Object.keys(this.$data) - const showAlert = (typeof this.alert === 'object' && this.alert !== null && this.alert.show) && typeof this.rowSelection.selectedRowKeys !== 'undefined' || this.alert - - Object.keys(T.props).forEach(k => { - const localKey = `local${k.substring(0, 1).toUpperCase()}${k.substring(1)}` - if (localKeys.includes(localKey)) { - props[k] = this[localKey] - return props[k] - } - if (k === 'rowSelection') { - if (showAlert && this.rowSelection) { - // ๅฆ‚ๆžœ้œ€่ฆไฝฟ็”จalert๏ผŒๅˆ™้‡ๆ–ฐ็ป‘ๅฎš rowSelection ไบ‹ไปถ - props[k] = { - ...this.rowSelection, - selectedRows: this.selectedRows, - selectedRowKeys: this.selectedRowKeys, - onChange: (selectedRowKeys, selectedRows) => { - this.updateSelect(selectedRowKeys, selectedRows) - typeof this[k].onChange !== 'undefined' && this[k].onChange(selectedRowKeys, selectedRows) - } - } - return props[k] - } else if (!this.rowSelection) { - // ๅฆ‚ๆžœๆฒกๆ‰“็ฎ—ๅผ€ๅฏ rowSelection ๅˆ™ๆธ…็ฉบ้ป˜่ฎค็š„้€‰ๆ‹ฉ้กน - props[k] = null - return props[k] - } - } - this[k] && (props[k] = this[k]) - return props[k] - }) - const table = ( - { this.$emit('expand', expanded, record) } }> - { Object.keys(this.$slots).map(name => ()) } - - ) - - return ( -
    - { showAlert ? this.renderAlert() : null } - { table } -
    - ) - } -} diff --git a/quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx b/quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx deleted file mode 100644 index b5ae799..0000000 --- a/quantdinger_vue/src/components/TagSelect/TagSelectOption.jsx +++ /dev/null @@ -1,45 +0,0 @@ -import { Tag } from 'ant-design-vue' -const { CheckableTag } = Tag - -export default { - name: 'TagSelectOption', - props: { - prefixCls: { - type: String, - default: 'ant-pro-tag-select-option' - }, - value: { - type: [String, Number, Object], - default: '' - }, - checked: { - type: Boolean, - default: false - } - }, - data () { - return { - localChecked: this.checked || false - } - }, - watch: { - 'checked' (val) { - this.localChecked = val - }, - '$parent.items': { - handler: function (val) { - this.value && val.hasOwnProperty(this.value) && (this.localChecked = val[this.value]) - }, - deep: true - } - }, - render () { - const { $slots, value } = this - const onChange = (checked) => { - this.$emit('change', { value, checked }) - } - return ( - {$slots.default} - ) - } -} diff --git a/quantdinger_vue/src/components/TagSelect/index.jsx b/quantdinger_vue/src/components/TagSelect/index.jsx deleted file mode 100644 index af98ad7..0000000 --- a/quantdinger_vue/src/components/TagSelect/index.jsx +++ /dev/null @@ -1,113 +0,0 @@ -import PropTypes from 'ant-design-vue/es/_util/vue-types' -import Option from './TagSelectOption.jsx' -import { filterEmpty } from '@/components/_util/util' - -export default { - Option, - name: 'TagSelect', - model: { - prop: 'checked', - event: 'change' - }, - props: { - prefixCls: { - type: String, - default: 'ant-pro-tag-select' - }, - defaultValue: { - type: PropTypes.array, - default: null - }, - value: { - type: PropTypes.array, - default: null - }, - expandable: { - type: Boolean, - default: false - }, - hideCheckAll: { - type: Boolean, - default: false - } - }, - data () { - return { - expand: false, - localCheckAll: false, - items: this.getItemsKey(filterEmpty(this.$slots.default)), - val: this.value || this.defaultValue || [] - } - }, - methods: { - onChange (checked) { - const key = Object.keys(this.items).filter(key => key === checked.value) - this.items[key] = checked.checked - const bool = Object.values(this.items).lastIndexOf(false) - if (bool === -1) { - this.localCheckAll = true - } else { - this.localCheckAll = false - } - }, - onCheckAll (checked) { - Object.keys(this.items).forEach(v => { - this.items[v] = checked.checked - }) - this.localCheckAll = checked.checked - }, - getItemsKey (items) { - const totalItem = {} - items.forEach(item => { - totalItem[item.componentOptions.propsData && item.componentOptions.propsData.value] = false - }) - return totalItem - }, - // CheckAll Button - renderCheckAll () { - const props = { - on: { - change: (checked) => { - this.onCheckAll(checked) - checked.value = 'total' - this.$emit('change', checked) - } - } - } - const checkAllElement = - return !this.hideCheckAll && checkAllElement || null - }, - // expandable - renderExpandable () { - - }, - // render option - renderTags (items) { - const listeners = { - change: (checked) => { - this.onChange(checked) - this.$emit('change', checked) - } - } - - return items.map(vnode => { - const options = vnode.componentOptions - options.listeners = listeners - return vnode - }) - } - }, - render () { - const { $props: { prefixCls } } = this - const classString = { - [`${prefixCls}`]: true - } - const tagItems = filterEmpty(this.$slots.default) - return ( -
    - {this.renderCheckAll()} - {this.renderTags(tagItems)} -
    - ) - } -} diff --git a/quantdinger_vue/src/components/TextArea/index.jsx b/quantdinger_vue/src/components/TextArea/index.jsx deleted file mode 100644 index 1aa63ae..0000000 --- a/quantdinger_vue/src/components/TextArea/index.jsx +++ /dev/null @@ -1,67 +0,0 @@ -import './style.less' -import { getStrFullLength, cutStrByFullLength } from '../_util/util' -import Input from 'ant-design-vue/es/input' -const TextArea = Input.TextArea - -export default { - name: 'LimitTextArea', - model: { - prop: 'value', - event: 'change' - }, - props: Object.assign({}, TextArea.props, { - prefixCls: { - type: String, - default: 'ant-textarea-limit' - }, - // eslint-disable-next-line - value: { - type: String - }, - limit: { - type: Number, - default: 200 - } - }), - data () { - return { - currentLimit: 0 - } - }, - watch: { - value (val) { - this.calcLimitNum(val) - } - }, - created () { - this.calcLimitNum(this.value) - }, - methods: { - handleChange (e) { - const value = e.target.value - const len = getStrFullLength(value) - if (len <= this.limit) { - this.currentLimit = len - this.$emit('change', value) - } else { - const str = cutStrByFullLength(value, this.limit) - this.currentLimit = getStrFullLength(str) - this.$emit('change', str) - } - }, - calcLimitNum (val) { - const len = getStrFullLength(val) - this.currentLimit = len - } - }, - render () { - const { prefixCls, ...props } = this.$props - return ( -
    - - {this.currentLimit}/{this.limit} -
    - ) - } -} diff --git a/quantdinger_vue/src/components/TextArea/style.less b/quantdinger_vue/src/components/TextArea/style.less deleted file mode 100644 index ba544bf..0000000 --- a/quantdinger_vue/src/components/TextArea/style.less +++ /dev/null @@ -1,12 +0,0 @@ -.ant-textarea-limit { - position: relative; - - .limit { - position: absolute; - right: 10px; - bottom: 5px; - font-size: 12px; - color: #909399; - background: #fff; - } -} diff --git a/quantdinger_vue/src/components/Tree/Tree.jsx b/quantdinger_vue/src/components/Tree/Tree.jsx deleted file mode 100644 index e5a2a11..0000000 --- a/quantdinger_vue/src/components/Tree/Tree.jsx +++ /dev/null @@ -1,124 +0,0 @@ -import { Menu, Icon, Input } from 'ant-design-vue' - -const { Item, ItemGroup, SubMenu } = Menu -const { Search } = Input - -export default { - name: 'Tree', - props: { - dataSource: { - type: Array, - required: true - }, - openKeys: { - type: Array, - default: () => [] - }, - search: { - type: Boolean, - default: false - } - }, - created () { - this.localOpenKeys = this.openKeys.slice(0) - }, - data () { - return { - localOpenKeys: [] - } - }, - methods: { - handlePlus (item) { - this.$emit('add', item) - }, - handleTitleClick (...args) { - this.$emit('titleClick', { args }) - }, - - renderSearch () { - return ( - - ) - }, - renderIcon (icon) { - return icon && () || null - }, - renderMenuItem (item) { - return ( - - { this.renderIcon(item.icon) } - { item.title } - this.handlePlus(item) } }}> - - ) - }, - renderItem (item) { - return item.children ? this.renderSubItem(item, item.key) : this.renderMenuItem(item, item.key) - }, - renderItemGroup (item) { - const childrenItems = item.children.map(o => { - return this.renderItem(o, o.key) - }) - - return ( - - - { childrenItems } - - ) - }, - renderSubItem (item, key) { - const childrenItems = item.children && item.children.map(o => { - return this.renderItem(o, o.key) - }) - - const title = ( - - { this.renderIcon(item.icon) } - { item.title } - - ) - - if (item.group) { - return this.renderItemGroup(item) - } - // titleClick={this.handleTitleClick(item)} - return ( - - { title } - { childrenItems } - - ) - } - }, - render () { - const { dataSource, search } = this.$props - - // this.localOpenKeys = openKeys.slice(0) - const list = dataSource.map(item => { - return this.renderItem(item) - }) - - return ( -
    - { search ? this.renderSearch() : null } - this.$emit('click', item), 'update:openKeys': val => { this.localOpenKeys = val } } }} openKeys={this.localOpenKeys}> - { list } - -
    - ) - } -} diff --git a/quantdinger_vue/src/components/Trend/Trend.vue b/quantdinger_vue/src/components/Trend/Trend.vue deleted file mode 100644 index 526e1cc..0000000 --- a/quantdinger_vue/src/components/Trend/Trend.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/Trend/index.js b/quantdinger_vue/src/components/Trend/index.js deleted file mode 100644 index 9f14228..0000000 --- a/quantdinger_vue/src/components/Trend/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import Trend from './Trend.vue' - -export default Trend diff --git a/quantdinger_vue/src/components/Trend/index.less b/quantdinger_vue/src/components/Trend/index.less deleted file mode 100644 index d02ac16..0000000 --- a/quantdinger_vue/src/components/Trend/index.less +++ /dev/null @@ -1,44 +0,0 @@ -@import '../index'; - -@trend-prefix-cls: ~"@{ant-pro-prefix}-trend"; - -.@{trend-prefix-cls} { - display: inline-block; - font-size: @font-size-base; - line-height: 22px; - - .up, - .down { - position: relative; - top: 1px; - margin-left: 4px; - - i { - font-size: 12px; - transform: scale(.83); - } - } - - .item-text { - display: inline-block; - margin-left: 8px; - color: rgb(0 0 0 / 85%); - } - - .up { - color: @red-6; - } - - .down { - top: -1px; - color: @green-6; - } - - &.reverse-color .up { - color: @green-6; - } - - &.reverse-color .down { - color: @red-6; - } -} diff --git a/quantdinger_vue/src/components/Trend/index.md b/quantdinger_vue/src/components/Trend/index.md deleted file mode 100644 index 8881f0e..0000000 --- a/quantdinger_vue/src/components/Trend/index.md +++ /dev/null @@ -1,45 +0,0 @@ -# Trend ่ถ‹ๅŠฟๆ ‡่ฎฐ - -่ถ‹ๅŠฟ็ฌฆๅท๏ผŒๆ ‡่ฎฐไธŠๅ‡ๅ’Œไธ‹้™่ถ‹ๅŠฟใ€‚้€šๅธธ็”จ็ปฟ่‰ฒไปฃ่กจโ€œๅฅฝโ€๏ผŒ็บข่‰ฒไปฃ่กจโ€œไธๅฅฝโ€๏ผŒ่‚ก็ฅจๆถจ่ทŒๅœบๆ™ฏ้™คๅค–ใ€‚ - - - -ๅผ•็”จๆ–นๅผ๏ผš - -```javascript -import Trend from '@/components/Trend' - -export default { - components: { - Trend - } -} -``` - - - -## ไปฃ็ ๆผ”็คบ [demo](https://pro.loacg.com/test/home) - -```html -5% -``` -ๆˆ– -```html - - ๅทฅ่ต„ - 5% - -``` -ๆˆ– -```html -5% -``` - - -## API - -| ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | -|----------|------------------------------------------|-------------|-------| -| flag | ไธŠๅ‡ไธ‹้™ๆ ‡่ฏ†๏ผš`up|down` | string | - | -| reverseColor | ้ขœ่‰ฒๅ่ฝฌ | Boolean | false | - diff --git a/quantdinger_vue/src/components/Turnstile/index.vue b/quantdinger_vue/src/components/Turnstile/index.vue deleted file mode 100644 index 2444cd2..0000000 --- a/quantdinger_vue/src/components/Turnstile/index.vue +++ /dev/null @@ -1,199 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/components/_util/util.js b/quantdinger_vue/src/components/_util/util.js deleted file mode 100644 index dd33231..0000000 --- a/quantdinger_vue/src/components/_util/util.js +++ /dev/null @@ -1,46 +0,0 @@ -/** - * components util - */ - -/** - * ๆธ…็†็ฉบๅ€ผ๏ผŒๅฏน่ฑก - * @param children - * @returns {*[]} - */ -export function filterEmpty (children = []) { - return children.filter(c => c.tag || (c.text && c.text.trim() !== '')) -} - -/** - * ่Žทๅ–ๅญ—็ฌฆไธฒ้•ฟๅบฆ๏ผŒ่‹ฑๆ–‡ๅญ—็ฌฆ ้•ฟๅบฆ1๏ผŒไธญๆ–‡ๅญ—็ฌฆ้•ฟๅบฆ2 - * @param {*} str - */ -export const getStrFullLength = (str = '') => - str.split('').reduce((pre, cur) => { - const charCode = cur.charCodeAt(0) - if (charCode >= 0 && charCode <= 128) { - return pre + 1 - } - return pre + 2 - }, 0) - -/** - * ๆˆชๅ–ๅญ—็ฌฆไธฒ๏ผŒๆ นๆฎ maxLength ๆˆชๅ–ๅŽ่ฟ”ๅ›ž - * @param {*} str - * @param {*} maxLength - */ -export const cutStrByFullLength = (str = '', maxLength) => { - let showLength = 0 - return str.split('').reduce((pre, cur) => { - const charCode = cur.charCodeAt(0) - if (charCode >= 0 && charCode <= 128) { - showLength += 1 - } else { - showLength += 2 - } - if (showLength <= maxLength) { - return pre + cur - } - return pre - }, '') -} diff --git a/quantdinger_vue/src/components/index.js b/quantdinger_vue/src/components/index.js deleted file mode 100644 index 401ae0d..0000000 --- a/quantdinger_vue/src/components/index.js +++ /dev/null @@ -1,56 +0,0 @@ -// chart -import Bar from '@/components/Charts/Bar' -import ChartCard from '@/components/Charts/ChartCard' -import Liquid from '@/components/Charts/Liquid' -import MiniArea from '@/components/Charts/MiniArea' -import MiniSmoothArea from '@/components/Charts/MiniSmoothArea' -import MiniBar from '@/components/Charts/MiniBar' -import MiniProgress from '@/components/Charts/MiniProgress' -import Radar from '@/components/Charts/Radar' -import RankList from '@/components/Charts/RankList' -import TransferBar from '@/components/Charts/TransferBar' -import TagCloud from '@/components/Charts/TagCloud' - -// pro components -import AvatarList from '@/components/AvatarList' -import Ellipsis from '@/components/Ellipsis' -import FooterToolbar from '@/components/FooterToolbar' -import NumberInfo from '@/components/NumberInfo' -import Tree from '@/components/Tree/Tree' -import Trend from '@/components/Trend' -import STable from '@/components/Table' -import MultiTab from '@/components/MultiTab' -import IconSelector from '@/components/IconSelector' -import TagSelect from '@/components/TagSelect' -import StandardFormRow from '@/components/StandardFormRow' -import ArticleListContent from '@/components/ArticleListContent' - -import Dialog from '@/components/Dialog' - -export { - AvatarList, - Bar, - ChartCard, - Liquid, - MiniArea, - MiniSmoothArea, - MiniBar, - MiniProgress, - Radar, - TagCloud, - RankList, - TransferBar, - Trend, - Ellipsis, - FooterToolbar, - NumberInfo, - Tree, - STable, - MultiTab, - IconSelector, - TagSelect, - StandardFormRow, - ArticleListContent, - - Dialog -} diff --git a/quantdinger_vue/src/components/index.less b/quantdinger_vue/src/components/index.less deleted file mode 100644 index 01ef050..0000000 --- a/quantdinger_vue/src/components/index.less +++ /dev/null @@ -1,6 +0,0 @@ -@import '~ant-design-vue/lib/style/index'; - -// The prefix to use on all css classes from ant-pro. -@ant-pro-prefix : ant-pro; -@ant-global-sider-zindex : 106; -@ant-global-header-zindex : 105; diff --git a/quantdinger_vue/src/components/tools/TwoStepCaptcha.vue b/quantdinger_vue/src/components/tools/TwoStepCaptcha.vue deleted file mode 100644 index 638489c..0000000 --- a/quantdinger_vue/src/components/tools/TwoStepCaptcha.vue +++ /dev/null @@ -1,102 +0,0 @@ - - - - diff --git a/quantdinger_vue/src/config/aiModels.js b/quantdinger_vue/src/config/aiModels.js deleted file mode 100644 index cfb3e4c..0000000 --- a/quantdinger_vue/src/config/aiModels.js +++ /dev/null @@ -1,41 +0,0 @@ -// Unified AI model support list for frontend. -// Model IDs follow OpenRouter-style `provider/model` naming. - -export const DEFAULT_AI_MODEL_MAP = { - 'x-ai/grok-code-fast-1': 'xAI: Grok Code Fast 1', - 'x-ai/grok-4-fast': 'xAI: Grok 4 Fast', - 'x-ai/grok-4.1-fast': 'xAI: Grok 4.1 Fast', - 'google/gemini-2.5-flash': 'Google: Gemini 2.5 Flash', - 'google/gemini-2.0-flash-001': 'Google: Gemini 2.0 Flash', - 'google/gemini-3-pro-preview': 'Google: Gemini 3 Pro Preview', - 'google/gemini-2.5-flash-lite': 'Google: Gemini 2.5 Flash Lite', - 'google/gemini-2.5-pro': 'Google: Gemini 2.5 Pro', - 'openai/gpt-4o-mini': 'OpenAI: GPT-4o-mini', - 'openai/gpt-5-mini': 'OpenAI: GPT-5 Mini', - 'openai/gpt-oss-120b': 'OpenAI: gpt-oss-120b', - 'deepseek/deepseek-v3.2': 'DeepSeek: DeepSeek V3.2', - 'minimax/minimax-m2': 'MiniMax: MiniMax M2', - 'anthropic/claude-sonnet-4': 'Anthropic: Claude Sonnet 4', - 'anthropic/claude-sonnet-4.5': 'Anthropic: Claude Sonnet 4.5', - 'anthropic/claude-opus-4.5': 'Anthropic: Claude Opus 4.5', - 'anthropic/claude-haiku-4.5': 'Anthropic: Claude Haiku 4.5', - 'z-ai/glm-4.6': 'Z.AI: GLM 4.6' -} - -export function isPlainObject (val) { - return val !== null && typeof val === 'object' && !Array.isArray(val) -} - -export function mergeModelMaps (baseMap, overrideMap) { - const base = isPlainObject(baseMap) ? baseMap : {} - const override = isPlainObject(overrideMap) ? overrideMap : {} - return { ...base, ...override } -} - -export function modelMapToOptions (modelMap) { - const map = isPlainObject(modelMap) ? modelMap : {} - return Object.keys(map).map(key => ({ - value: key, - label: map[key] - })) -} diff --git a/quantdinger_vue/src/config/defaultSettings.js b/quantdinger_vue/src/config/defaultSettings.js deleted file mode 100644 index 7e4e629..0000000 --- a/quantdinger_vue/src/config/defaultSettings.js +++ /dev/null @@ -1,33 +0,0 @@ -/** - * ้กน็›ฎ้ป˜่ฎค้…็ฝฎ้กน - * primaryColor - ้ป˜่ฎคไธป้ข˜่‰ฒ, ๅฆ‚ๆžœไฟฎๆ”น้ขœ่‰ฒไธ็”Ÿๆ•ˆ๏ผŒ่ฏทๆธ…็† localStorage - * navTheme - sidebar theme ['dark', 'light'] ไธค็งไธป้ข˜ - * colorWeak - ่‰ฒ็›ฒๆจกๅผ - * layout - ๆ•ดไฝ“ๅธƒๅฑ€ๆ–นๅผ ['sidemenu', 'topmenu'] ไธค็งๅธƒๅฑ€ - * fixedHeader - ๅ›บๅฎš Header : boolean - * fixSiderbar - ๅ›บๅฎšๅทฆไพง่œๅ•ๆ  ๏ผš boolean - * contentWidth - ๅ†…ๅฎนๅŒบๅธƒๅฑ€๏ผš ๆตๅผ | ๅ›บๅฎš - * - * storageOptions: {} - Vue-ls ๆ’ไปถ้…็ฝฎ้กน (localStorage/sessionStorage) - * - */ - -export const PYTHON_API_BASE_URL = process.env.VUE_APP_PYTHON_API_BASE_URL || 'http://localhost:5000' - -export default { - navTheme: 'light', // theme for nav menu - primaryColor: '#13C2C2', // '#F5222D', // primary color of ant design - layout: 'sidemenu', // nav menu position: `sidemenu` or `topmenu` - contentWidth: 'Fluid', // layout of content: `Fluid` or `Fixed`, only works when layout is topmenu - fixedHeader: true, // sticky header - ๅ›บๅฎš้กถ้ƒจๅฏผ่ˆชๆ  - fixSiderbar: true, // sticky siderbar - ๅ›บๅฎšๅทฆไพง่พนๆ  - colorWeak: false, - menu: { - locale: true - }, - title: 'QuantDinger', - pwa: false, - iconfontUrl: '', - production: process.env.NODE_ENV === 'production' && process.env.VUE_APP_PREVIEW !== 'true' - -} diff --git a/quantdinger_vue/src/config/router.config.js b/quantdinger_vue/src/config/router.config.js deleted file mode 100644 index c682d3f..0000000 --- a/quantdinger_vue/src/config/router.config.js +++ /dev/null @@ -1,186 +0,0 @@ -// eslint-disable-next-line -import { UserLayout, BasicLayout, BlankLayout } from '@/layouts' - -export const asyncRouterMap = [ - { - path: '/', - name: 'index', - component: BasicLayout, - meta: { title: 'menu.home' }, - redirect: '/dashboard', - children: [ - // ไปช่กจ็›˜ - { - path: '/dashboard', - name: 'Dashboard', - component: () => import('@/views/dashboard'), - meta: { title: 'menu.dashboard', keepAlive: true, icon: 'dashboard', permission: ['dashboard'] } - }, - // AI ๅˆ†ๆž - { - path: '/ai-analysis/:pageNo([1-9]\\d*)?', - name: 'Analysis', - component: () => import('@/views/ai-analysis'), - hidden: true, - meta: { title: 'menu.dashboard.analysis', keepAlive: false, icon: 'thunderbolt', permission: ['dashboard'] } - }, - // AI่ต„ไบงๅˆ†ๆž๏ผˆ็ปŸไธ€ๅ…ฅๅฃ๏ผ‰ - { - path: '/ai-asset-analysis', - name: 'AIAssetAnalysis', - component: () => import('@/views/ai-asset-analysis'), - meta: { title: 'menu.dashboard.aiAssetAnalysis', keepAlive: false, icon: 'appstore', permission: ['dashboard'] } - }, - // ๆŒ‡ๆ ‡ๅˆ†ๆž - { - path: '/indicator-analysis', - name: 'Indicator', - component: () => import('@/views/indicator-analysis'), - meta: { title: 'menu.dashboard.indicator', keepAlive: true, icon: 'line-chart', permission: ['dashboard'] } - }, - // ๆŒ‡ๆ ‡ๅธ‚ๅœบ๏ผˆๆ”พๅœจๆŒ‡ๆ ‡ๅˆ†ๆžไธ‹้ข๏ผ‰ - { - path: '/indicator-community', - name: 'IndicatorCommunity', - component: () => import('@/views/indicator-community'), - meta: { title: 'menu.dashboard.community', keepAlive: false, icon: 'shop', permission: ['dashboard'] } - }, - // ไบคๆ˜“ๅŠฉๆ‰‹ - { - path: '/trading-assistant', - name: 'TradingAssistant', - component: () => import('@/views/trading-assistant'), - meta: { title: 'menu.dashboard.tradingAssistant', keepAlive: true, icon: 'robot', permission: ['dashboard'] } - }, - // ่ต„ไบง็›‘ๆต‹ - { - path: '/portfolio', - name: 'Portfolio', - component: () => import('@/views/portfolio'), - hidden: true, - meta: { title: 'menu.dashboard.portfolio', keepAlive: true, icon: 'fund', permission: ['dashboard'] } - }, - // ็”จๆˆท็ฎก็† (admin only) - { - path: '/user-manage', - name: 'UserManage', - component: () => import('@/views/user-manage'), - meta: { title: 'menu.userManage', keepAlive: false, icon: 'team', permission: ['admin'] } - }, - // ไธชไบบไธญๅฟƒ - { - path: '/profile', - name: 'Profile', - component: () => import('@/views/profile'), - meta: { title: 'menu.myProfile', keepAlive: false, icon: 'user', permission: ['dashboard'] } - }, - // ไผšๅ‘˜/ๅ……ๅ€ผ - { - path: '/billing', - name: 'Billing', - component: () => import('@/views/billing'), - meta: { title: 'menu.billing', keepAlive: false, icon: 'wallet', permission: ['dashboard'] } - }, - // ็ณป็ปŸ่ฎพ็ฝฎ (admin only) - ๆ”พๅœจๆœ€ๅŽ - { - path: '/settings', - name: 'Settings', - component: () => import('@/views/settings'), - meta: { title: 'menu.settings', keepAlive: false, icon: 'setting', permission: ['admin'] } - } - - // other - /* - { - path: '/other', - name: 'otherPage', - component: PageView, - meta: { title: 'ๅ…ถไป–็ป„ไปถ', icon: 'slack', permission: [ 'dashboard' ] }, - redirect: '/other/icon-selector', - children: [ - { - path: '/other/icon-selector', - name: 'TestIconSelect', - component: () => import('@/views/other/IconSelectorView'), - meta: { title: 'IconSelector', icon: 'tool', keepAlive: true, permission: [ 'dashboard' ] } - }, - { - path: '/other/list', - component: RouteView, - meta: { title: 'ไธšๅŠกๅธƒๅฑ€', icon: 'layout', permission: [ 'support' ] }, - redirect: '/other/list/tree-list', - children: [ - { - path: '/other/list/tree-list', - name: 'TreeList', - component: () => import('@/views/other/TreeList'), - meta: { title: 'ๆ ‘็›ฎๅฝ•่กจๆ ผ', keepAlive: true } - }, - { - path: '/other/list/edit-table', - name: 'EditList', - component: () => import('@/views/other/TableInnerEditList'), - meta: { title: 'ๅ†…่”็ผ–่พ‘่กจๆ ผ', keepAlive: true } - }, - { - path: '/other/list/user-list', - name: 'UserList', - component: () => import('@/views/other/UserList'), - meta: { title: '็”จๆˆทๅˆ—่กจ', keepAlive: true } - }, - { - path: '/other/list/role-list', - name: 'RoleList', - component: () => import('@/views/other/RoleList'), - meta: { title: '่ง’่‰ฒๅˆ—่กจ', keepAlive: true } - }, - { - path: '/other/list/system-role', - name: 'SystemRole', - component: () => import('@/views/role/RoleList'), - meta: { title: '่ง’่‰ฒๅˆ—่กจ2', keepAlive: true } - }, - { - path: '/other/list/permission-list', - name: 'PermissionList', - component: () => import('@/views/other/PermissionList'), - meta: { title: 'ๆƒ้™ๅˆ—่กจ', keepAlive: true } - } - ] - } - ] - } - */ - ] - }, - { - path: '*', - redirect: '/404', - hidden: true - } -] - -/** - * ๅŸบ็ก€่ทฏ็”ฑ - * @type { *[] } - */ -export const constantRouterMap = [ - { - path: '/user', - component: UserLayout, - redirect: '/user/login', - hidden: true, - children: [ - { - path: 'login', - name: 'login', - component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login') - } - ] - }, - - { - path: '/404', - component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404') - } -] diff --git a/quantdinger_vue/src/core/bootstrap.js b/quantdinger_vue/src/core/bootstrap.js deleted file mode 100644 index 298851c..0000000 --- a/quantdinger_vue/src/core/bootstrap.js +++ /dev/null @@ -1,37 +0,0 @@ -import store from '@/store' -import storage from 'store' -import { - ACCESS_TOKEN, - APP_LANGUAGE, - TOGGLE_CONTENT_WIDTH, - TOGGLE_FIXED_HEADER, - TOGGLE_FIXED_SIDEBAR, TOGGLE_HIDE_HEADER, - TOGGLE_LAYOUT, TOGGLE_NAV_THEME, TOGGLE_WEAK, - TOGGLE_COLOR, TOGGLE_MULTI_TAB -} from '@/store/mutation-types' -import { printANSI } from '@/utils/screenLog' -import defaultSettings from '@/config/defaultSettings' - -export default function Initializer () { - printANSI() // ่ฏท่‡ช่กŒ็งป้™ค่ฏฅ่กŒ. please remove this line - - store.commit(TOGGLE_LAYOUT, storage.get(TOGGLE_LAYOUT, defaultSettings.layout)) - store.commit(TOGGLE_FIXED_HEADER, storage.get(TOGGLE_FIXED_HEADER, defaultSettings.fixedHeader)) - store.commit(TOGGLE_FIXED_SIDEBAR, storage.get(TOGGLE_FIXED_SIDEBAR, defaultSettings.fixSiderbar)) - store.commit(TOGGLE_CONTENT_WIDTH, storage.get(TOGGLE_CONTENT_WIDTH, defaultSettings.contentWidth)) - store.commit(TOGGLE_HIDE_HEADER, storage.get(TOGGLE_HIDE_HEADER, defaultSettings.autoHideHeader)) - store.commit(TOGGLE_NAV_THEME, storage.get(TOGGLE_NAV_THEME, defaultSettings.navTheme)) - store.commit(TOGGLE_WEAK, storage.get(TOGGLE_WEAK, defaultSettings.colorWeak)) - store.commit(TOGGLE_COLOR, storage.get(TOGGLE_COLOR, defaultSettings.primaryColor)) - store.commit(TOGGLE_MULTI_TAB, storage.get(TOGGLE_MULTI_TAB, defaultSettings.multiTab)) - // ๅค„็† token ๅฏ่ƒฝๆ˜ฏๅญ—็ฌฆไธฒๆˆ–ๅฏน่ฑก็š„ๆƒ…ๅ†ต - let token = storage.get(ACCESS_TOKEN) - if (token && typeof token !== 'string') { - token = token.token || token.value || (typeof token === 'object' ? null : token) - } - token = typeof token === 'string' ? token : null - store.commit('SET_TOKEN', token) - - store.dispatch('setLang', storage.get(APP_LANGUAGE, 'en-US')) - // last step -} diff --git a/quantdinger_vue/src/core/directives/action.js b/quantdinger_vue/src/core/directives/action.js deleted file mode 100644 index 42563f1..0000000 --- a/quantdinger_vue/src/core/directives/action.js +++ /dev/null @@ -1,34 +0,0 @@ -import Vue from 'vue' -import store from '@/store' - -/** - * Action ๆƒ้™ๆŒ‡ไปค - * ๆŒ‡ไปค็”จๆณ•๏ผš - * - ๅœจ้œ€่ฆๆŽงๅˆถ action ็บงๅˆซๆƒ้™็š„็ป„ไปถไธŠไฝฟ็”จ v-action:[method] , ๅฆ‚ไธ‹๏ผš - * ๆทปๅŠ ็”จๆˆท - * ๅˆ ้™ค็”จๆˆท - * ไฟฎๆ”น - * - * - ๅฝ“ๅ‰็”จๆˆทๆฒกๆœ‰ๆƒ้™ๆ—ถ๏ผŒ็ป„ไปถไธŠไฝฟ็”จไบ†่ฏฅๆŒ‡ไปคๅˆ™ไผš่ขซ้š่— - * - ๅฝ“ๅŽๅฐๆƒ้™่ทŸ pro ๆไพ›็š„ๆจกๅผไธๅŒๆ—ถ๏ผŒๅช้œ€่ฆ้’ˆๅฏน่ฟ™้‡Œ็š„ๆƒ้™่ฟ‡ๆปค่ฟ›่กŒไฟฎๆ”นๅณๅฏ - * - * @see https://github.com/vueComponent/ant-design-vue-pro/pull/53 - */ -const action = Vue.directive('action', { - inserted: function (el, binding, vnode) { - const actionName = binding.arg - const roles = store.getters.roles - const elVal = vnode.context.$route.meta.permission - const permissionId = Object.prototype.toString.call(elVal) === '[object String]' && [elVal] || elVal - roles.permissions.forEach(p => { - if (!permissionId.includes(p.permissionId)) { - return - } - if (p.actionList && !p.actionList.includes(actionName)) { - el.parentNode && el.parentNode.removeChild(el) || (el.style.display = 'none') - } - }) - } -}) - -export default action diff --git a/quantdinger_vue/src/core/icons.js b/quantdinger_vue/src/core/icons.js deleted file mode 100644 index 46b7261..0000000 --- a/quantdinger_vue/src/core/icons.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Custom icon list - * All icons are loaded here for easy management - * @see https://vue.ant.design/components/icon/#Custom-Font-Icon - * - * ่‡ชๅฎšไน‰ๅ›พๆ ‡ๅŠ ่ฝฝ่กจ - * ๆ‰€ๆœ‰ๅ›พๆ ‡ๅ‡ไปŽ่ฟ™้‡ŒๅŠ ่ฝฝ๏ผŒๆ–นไพฟ็ฎก็† - */ -import bxAnaalyse from '@/assets/icons/bx-analyse.svg?inline' // path to your '*.svg?inline' file. - -export { bxAnaalyse } diff --git a/quantdinger_vue/src/core/lazy_use.js b/quantdinger_vue/src/core/lazy_use.js deleted file mode 100644 index 0cfa083..0000000 --- a/quantdinger_vue/src/core/lazy_use.js +++ /dev/null @@ -1,129 +0,0 @@ -import Vue from 'vue' - -// base library -import { - ConfigProvider, - Layout, - Input, - InputNumber, - Button, - Switch, - Radio, - Checkbox, - Select, - Card, - Collapse, - Form, - FormModel, - Row, - Col, - Modal, - Table, - Tabs, - Icon, - Badge, - Popover, - Dropdown, - List, - Avatar, - Breadcrumb, - Steps, - Spin, - Menu, - Drawer, - Tooltip, - Alert, - Tag, - Divider, - DatePicker, - TimePicker, - Upload, - Progress, - Skeleton, - Popconfirm, - PageHeader, - Result, - Statistic, - Descriptions, - Space, - Empty, - Rate, - AutoComplete, - message, - notification -} from 'ant-design-vue' -// import Viser from 'viser-vue' - -// ext library -import VueCropper from 'vue-cropper' -import Dialog from '@/components/Dialog' -import MultiTab from '@/components/MultiTab' -import PageLoading from '@/components/PageLoading' -import PermissionHelper from '@/core/permission/permission' -import './directives/action' - -Vue.use(ConfigProvider) -Vue.use(Layout) -Vue.use(Input) -Vue.use(InputNumber) -Vue.use(Button) -Vue.use(Switch) -Vue.use(Radio) -Vue.use(Checkbox) -Vue.use(Select) -Vue.use(Card) -Vue.use(Collapse) -Vue.use(Form) -Vue.use(FormModel) -Vue.use(Row) -Vue.use(Col) -Vue.use(Modal) -Vue.use(Table) -Vue.use(Tabs) -Vue.use(Icon) -Vue.use(Badge) -Vue.use(Popover) -Vue.use(Dropdown) -Vue.use(List) -Vue.use(Avatar) -Vue.use(Breadcrumb) -Vue.use(Steps) -Vue.use(Spin) -Vue.use(Menu) -Vue.use(Drawer) -Vue.use(Tooltip) -Vue.use(Alert) -Vue.use(Tag) -Vue.use(Divider) -Vue.use(DatePicker) -Vue.use(TimePicker) -Vue.use(Upload) -Vue.use(Progress) -Vue.use(Skeleton) -Vue.use(Popconfirm) -Vue.use(PageHeader) -Vue.use(Result) -Vue.use(Statistic) -Vue.use(Descriptions) -Vue.use(Space) -Vue.use(Empty) -Vue.use(Rate) -Vue.use(AutoComplete) -// Textarea ๆ˜ฏ Input ็ป„ไปถ็š„ไธ€้ƒจๅˆ†๏ผŒ้€š่ฟ‡ Vue.use(Input) ๅทฒ่‡ชๅŠจๆณจๅ†Œ - -Vue.prototype.$confirm = Modal.confirm -Vue.prototype.$message = message -Vue.prototype.$notification = notification -Vue.prototype.$info = Modal.info -Vue.prototype.$success = Modal.success -Vue.prototype.$error = Modal.error -Vue.prototype.$warning = Modal.warning - -// Vue.use(Viser) -Vue.use(Dialog) // this.$dialog func -Vue.use(MultiTab) -Vue.use(PageLoading) -Vue.use(PermissionHelper) -Vue.use(VueCropper) - -process.env.NODE_ENV !== 'production' && console.warn('[antd-pro] NOTICE: Antd use lazy-load.') diff --git a/quantdinger_vue/src/core/permission/permission.js b/quantdinger_vue/src/core/permission/permission.js deleted file mode 100644 index fb69844..0000000 --- a/quantdinger_vue/src/core/permission/permission.js +++ /dev/null @@ -1,55 +0,0 @@ -export const PERMISSION_ENUM = { - 'add': { key: 'add', label: 'ๆ–ฐๅขž' }, - 'delete': { key: 'delete', label: 'ๅˆ ้™ค' }, - 'edit': { key: 'edit', label: 'ไฟฎๆ”น' }, - 'query': { key: 'query', label: 'ๆŸฅ่ฏข' }, - 'get': { key: 'get', label: '่ฏฆๆƒ…' }, - 'enable': { key: 'enable', label: 'ๅฏ็”จ' }, - 'disable': { key: 'disable', label: '็ฆ็”จ' }, - 'import': { key: 'import', label: 'ๅฏผๅ…ฅ' }, - 'export': { key: 'export', label: 'ๅฏผๅ‡บ' } -} - -/** - * Button - * @param Vue - */ -function plugin (Vue) { - if (plugin.installed) { - return - } - - !Vue.prototype.$auth && Object.defineProperties(Vue.prototype, { - $auth: { - get () { - const _this = this - return (permissions) => { - const [permission, action] = permissions.split('.') - const permissionList = _this.$store.getters.roles.permissions - return permissionList.find((val) => { - return val.permissionId === permission - }).actionList.findIndex((val) => { - return val === action - }) > -1 - } - } - } - }) - - !Vue.prototype.$enum && Object.defineProperties(Vue.prototype, { - $enum: { - get () { - // const _this = this; - return (val) => { - let result = PERMISSION_ENUM - val && val.split('.').forEach(v => { - result = result && result[v] || null - }) - return result - } - } - } - }) -} - -export default plugin diff --git a/quantdinger_vue/src/core/use.js b/quantdinger_vue/src/core/use.js deleted file mode 100644 index d98cd16..0000000 --- a/quantdinger_vue/src/core/use.js +++ /dev/null @@ -1,27 +0,0 @@ -import Vue from 'vue' - -// base library -import Antd from 'ant-design-vue' -import Viser from 'viser-vue' -import VueCropper from 'vue-cropper' -import 'ant-design-vue/dist/antd.less' - -// ext library -import VueClipboard from 'vue-clipboard2' -import MultiTab from '@/components/MultiTab' -import PageLoading from '@/components/PageLoading' -import PermissionHelper from '@/core/permission/permission' -// import '@/components/use' -import './directives/action' - -VueClipboard.config.autoSetContainer = true - -Vue.use(Antd) -Vue.use(Viser) -Vue.use(MultiTab) -Vue.use(PageLoading) -Vue.use(VueClipboard) -Vue.use(PermissionHelper) -Vue.use(VueCropper) - -process.env.NODE_ENV !== 'production' && console.warn('[antd-pro] WARNING: Antd now use fulled imported.') diff --git a/quantdinger_vue/src/global.less b/quantdinger_vue/src/global.less deleted file mode 100644 index 680736d..0000000 --- a/quantdinger_vue/src/global.less +++ /dev/null @@ -1,117 +0,0 @@ -@import '~ant-design-vue/es/style/themes/default.less'; - -html, -body, -#app, -#root { - height: 100%; -} - -.colorWeak { - filter: invert(80%); -} - -.ant-layout.layout-basic { - height: 100vh; - min-height: 100vh; -} - -canvas { - display: block; -} - -body { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - text-rendering: optimizelegibility; -} - -ul, -ol { - list-style: none; -} - -// ๆ•ฐๆฎๅˆ—่กจ ๆ ทๅผ -.table-alert { - margin-bottom: 16px; -} -// ๆ•ฐๆฎๅˆ—่กจ ๆ“ไฝœ -.table-operator { - margin-bottom: 18px; - - button { - margin-right: 8px; - } -} -// ๆ•ฐๆฎๅˆ—่กจ ๆœ็ดขๆกไปถ -.table-page-search-wrapper { - .ant-form-inline { - .ant-form-item { - display: flex; - margin-right: 0; - margin-bottom: 24px; - - .ant-form-item-control-wrapper { - flex: 1 1; - display: inline-block; - vertical-align: middle; - } - - > .ant-form-item-label { - width: auto; - padding-right: 8px; - line-height: 32px; - } - - .ant-form-item-control { - height: 32px; - line-height: 32px; - } - } - } - - .table-page-search-submitButtons { - display: block; - margin-bottom: 24px; - white-space: nowrap; - } -} - -@media (max-width: @screen-xs) { - .ant-table { - width: 100%; - overflow-x: auto; - - &-thead > tr, - &-tbody > tr { - > th, - > td { - white-space: pre; - - > span { - display: block; - } - } - } - } -} - -// Hide noisy webpack dev server overlay on mobile (ResizeObserver loop warnings) -#webpack-dev-server-client-overlay, -#webpack-hot-middleware-client-overlay, -.webpack-dev-server-client-overlay { - display: none !important; - pointer-events: none !important; - visibility: hidden !important; -} - -// ๆ‰‹ๆœบ็ซฏๅผบๅˆถ่ฆ†็›– logo padding -@media (max-width: 768px) { - .ant-pro-global-header-logo { - padding: 0 !important; - padding-left: 0 !important; - padding-right: 0 !important; - padding-top: 0 !important; - padding-bottom: 0 !important; - } -} \ No newline at end of file diff --git a/quantdinger_vue/src/layouts/BasicLayout.less b/quantdinger_vue/src/layouts/BasicLayout.less deleted file mode 100644 index 81f02ff..0000000 --- a/quantdinger_vue/src/layouts/BasicLayout.less +++ /dev/null @@ -1,423 +0,0 @@ -@import '~ant-design-vue/es/style/themes/default.less'; - -/* ========== ๅฎŒๅ…จ้š่— ant-layout-footer ========== */ -:global { - /* ๅ…จๅฑ€้š่—ๆ‰€ๆœ‰ ant-layout-footer */ - .ant-layout-footer, - footer.ant-layout-footer, - .ant-pro-layout .ant-layout-footer, - .ant-layout .ant-layout-footer { - display: none !important; - height: 0 !important; - padding: 0 !important; - margin: 0 !important; - border: none !important; - min-height: 0 !important; - visibility: hidden !important; - overflow: hidden !important; - } -} - -/* ========== ant-layout-header ไธป้ข˜้€‚้… ========== */ -/* ๅ…จๅฑ€ๆ ทๅผ๏ผšๆ นๆฎ body ๆˆ– layout ็š„ไธป้ข˜็ฑป่‡ชๅŠจ้€‚้… */ -:global { - /* ๆš—้ป‘ไธป้ข˜ไธ‹็š„ ant-layout-header */ - body.dark .ant-layout-header, - body.realdark .ant-layout-header, - .ant-layout.dark .ant-layout-header, - .ant-layout.realdark .ant-layout-header, - .ant-pro-layout.dark .ant-layout-header, - .ant-pro-layout.realdark .ant-layout-header { - background: #001529 !important; - border-bottom: 1px solid #1f1f1f !important; - box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08) !important; - color: rgba(255, 255, 255, 0.85) !important; - - /* Header ๅ†…็š„ๆ‰€ๆœ‰ๆ–‡ๅญ—ๅ’Œๅ›พๆ ‡ */ - * { - color: rgba(255, 255, 255, 0.85) !important; - } - - /* Header ๅ†…็š„ๅ›พๆ ‡ๆŒ‰้’ฎ */ - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - background: rgba(255, 255, 255, 0.08) !important; - border-radius: 4px; - } - } - - /* Header ๅ†…็š„้“พๆŽฅ */ - a { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - } - } - - /* Header ๅ†…็š„ๅทฅๅ…ทๆ็คบๅฎนๅ™จ */ - .ant-tooltip-open { - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - } - } - } - - - /* ๆต…่‰ฒไธป้ข˜ไธ‹็š„ ant-layout-header๏ผˆ็กฎไฟ่ฆ†็›–้ป˜่ฎคๆ ทๅผ๏ผ‰ */ - body.light .ant-layout-header, - .ant-layout.light .ant-layout-header, - .ant-pro-layout.light .ant-layout-header { - background: #fff !important; - border-bottom: 1px solid #e8e8e8 !important; - box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08) !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - /* ========== ant-layout-content ไธป้ข˜้€‚้…๏ผˆไธญ้—ด้กต้ขๅ†…ๅฎนๅŒบๅŸŸ๏ผ‰ ========== */ - /* ๆš—้ป‘ไธป้ข˜ไธ‹็š„ๅ†…ๅฎนๅŒบๅŸŸ */ - body.dark .ant-layout-content, - body.realdark .ant-layout-content, - .ant-layout.dark .ant-layout-content, - .ant-layout.realdark .ant-layout-content, - .ant-pro-layout.dark .ant-layout-content, - .ant-pro-layout.realdark .ant-layout-content { - background: #141414 !important; - color: rgba(255, 255, 255, 0.85) !important; - } - - - - /* ๆต…่‰ฒไธป้ข˜ไธ‹็š„ๅ†…ๅฎนๅŒบๅŸŸ */ - body.light .ant-layout-content, - .ant-layout.light .ant-layout-content, - .ant-pro-layout.light .ant-layout-content { - background: #f0f2f5 !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - - - - - /* ========== GlobalHeader ๆ ธๅฟƒๆ ทๅผ๏ผˆๅŸบไบŽ .ant-pro-global-header๏ผ‰ ========== */ - /* ๆš—้ป‘ไธป้ข˜ไธ‹็š„ .ant-pro-global-header - ่ฟ™ๆ˜ฏๆŽงๅˆถ้กถ้ƒจๆ ‡้ข˜ๆ ็š„ๅ…ณ้”ฎๆ ทๅผ */ - body.dark .ant-pro-global-header, - body.realdark .ant-pro-global-header, - .ant-layout.dark .ant-pro-global-header, - .ant-layout.realdark .ant-pro-global-header, - .ant-pro-layout.dark .ant-pro-global-header, - .ant-pro-layout.realdark .ant-pro-global-header, - body.dark .ant-layout-header .ant-pro-global-header, - body.realdark .ant-layout-header .ant-pro-global-header, - .ant-pro-layout.dark .ant-layout-header .ant-pro-global-header, - .ant-pro-layout.realdark .ant-layout-header .ant-pro-global-header { - /* ๆ ธๅฟƒ๏ผš่ƒŒๆ™ฏ่‰ฒๅ’Œ่พนๆก† */ - background: #001529 !important; - border-bottom: 1px solid #1f1f1f !important; - box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08) !important; - color: rgba(255, 255, 255, 0.85) !important; - - /* ๅผบๅˆถๆ‰€ๆœ‰ๅญๅ…ƒ็ด ๆ–‡ๅญ—้ขœ่‰ฒ */ - * { - color: rgba(255, 255, 255, 0.85) !important; - } - - /* Logo ๅŒบๅŸŸ */ - .ant-pro-global-header-logo { - background: transparent !important; - color: rgba(255, 255, 255, 0.85) !important; - - h1 { - color: rgba(255, 255, 255, 0.85) !important; - } - - img { - opacity: 0.9; - } - - * { - color: rgba(255, 255, 255, 0.85) !important; - } - } - } - - /* Header ๅ†…ๅฎนๅŒบๅŸŸ๏ผˆไธญ้—ด้ƒจๅˆ†๏ผŒๅŒ…ๅซๅˆทๆ–ฐๆŒ‰้’ฎ็ญ‰๏ผ‰ */ - .ant-pro-global-header-content { - background: transparent !important; - color: rgba(255, 255, 255, 0.85) !important; - - * { - color: rgba(255, 255, 255, 0.85) !important; - } - - /* ๅˆทๆ–ฐๆŒ‰้’ฎ็ญ‰ๅ›พๆ ‡ */ - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - background: rgba(255, 255, 255, 0.08) !important; - border-radius: 4px; - } - } - - /* ๅทฅๅ…ทๆ็คบๅ†…็š„ๅ›พๆ ‡ */ - .ant-tooltip-open .anticon { - color: rgba(255, 255, 255, 0.85) !important; - } - } - - /* Header ๅณไพงๅ†…ๅฎนๅŒบๅŸŸ๏ผˆๅŒ…ๅซๅคดๅƒใ€่ฏญ่จ€้€‰ๆ‹ฉใ€่ฎพ็ฝฎๆŒ‰้’ฎ๏ผ‰ */ - .ant-pro-global-header-index-right { - background: transparent !important; - color: rgba(255, 255, 255, 0.85) !important; - - * { - color: rgba(255, 255, 255, 0.85) !important; - } - - /* ๆ“ไฝœๆŒ‰้’ฎ๏ผˆๅคดๅƒใ€่ฏญ่จ€ใ€่ฎพ็ฝฎ๏ผ‰ */ - .ant-pro-global-header-index-action { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - background: rgba(255, 255, 255, 0.08) !important; - } - - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - } - } - - /* ๅคดๅƒๅŒบๅŸŸ */ - .ant-pro-account-avatar { - color: rgba(255, 255, 255, 0.85) !important; - - span { - color: rgba(255, 255, 255, 0.85) !important; - } - - .antd-pro-global-header-index-avatar { - background: rgba(255, 255, 255, 0.25) !important; - } - } - - /* ไธ‹ๆ‹‰่œๅ•่งฆๅ‘ๅ™จ */ - .ant-pro-drop-down, - .ant-dropdown-trigger { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - background: rgba(255, 255, 255, 0.08) !important; - } - - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - } - } - } - - /* ้“พๆŽฅๆ ทๅผ */ - a { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - } - } - - /* ๆ‰€ๆœ‰ๅ›พๆ ‡ */ - .anticon { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - color: #1890ff !important; - } - } - - /* ๆต…่‰ฒไธป้ข˜ไธ‹็š„ .ant-pro-global-header */ - body.light .ant-pro-global-header, - .ant-layout.light .ant-pro-global-header, - .ant-pro-layout.light .ant-pro-global-header, - body.light .ant-layout-header .ant-pro-global-header, - .ant-pro-layout.light .ant-layout-header .ant-pro-global-header { - background: #fff !important; - border-bottom: 1px solid #e8e8e8 !important; - color: rgba(0, 0, 0, 0.85) !important; - } -} - -/* ========== ๅ…จๅฑ€ๅธƒๅฑ€ไธป้ข˜้€‚้… - ๅผบๅŒ–่ฆ†็›– ========== */ -:global(.ant-pro-layout) { - /* ๆš—้ป‘ไธป้ข˜ไธ‹็š„ๅฎŒๆ•ดๅธƒๅฑ€ */ - &.dark, - &.realdark { - /* 0. ๅŸบ็ก€ Layout ่ƒŒๆ™ฏ - ็กฎไฟๆ•ดไฝ“่ƒŒๆ™ฏๅ˜ๆš— */ - :global(.ant-layout) { - background-color: #001529 !important; - } - - /* 1. ้กถ้ƒจ Header */ - :global(.ant-layout-header) { - background: #001529 !important; - border-bottom: 1px solid #1f1f1f !important; - color: rgba(255, 255, 255, 0.85) !important; - - :global(.ant-pro-global-header) { - background: #001529 !important; - border-bottom: none !important; - color: rgba(255, 255, 255, 0.85) !important; - - * { - color: rgba(255, 255, 255, 0.85) !important; - } - } - } - - /* 2. ไธญ้—ดๅ†…ๅฎนๅŒบๅŸŸ */ - :global(.ant-layout-content) { - background: #141414 !important; - color: rgba(255, 255, 255, 0.85) !important; - } - - :global(.ant-pro-basicLayout-content) { - background: #141414 !important; - color: rgba(255, 255, 255, 0.85) !important; - } - - } - - /* ๆต…่‰ฒไธป้ข˜ไธ‹็š„ๅฎŒๆ•ดๅธƒๅฑ€ */ - &.light { - /* 0. ๅŸบ็ก€ Layout ่ƒŒๆ™ฏ */ - :global(.ant-layout) { - background-color: #f0f2f5 !important; - } - - /* 1. ้กถ้ƒจ Header */ - :global(.ant-layout-header) { - background: #fff !important; - border-bottom: 1px solid #e8e8e8 !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - /* 2. ไธญ้—ดๅ†…ๅฎนๅŒบๅŸŸ */ - :global(.ant-layout-content) { - background: #f0f2f5 !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - :global(.ant-pro-basicLayout-content) { - background: #f0f2f5 !important; - color: rgba(0, 0, 0, 0.85) !important; - } - - } -} - -.ant-pro-global-header-index-right { - margin-right: 8px; - - &.ant-pro-global-header-index-dark { - .ant-pro-global-header-index-action { - color: hsl(0deg 0% 100% / 85%); - - &:hover { - background: #1890ff; - } - } - - /* ๆš—้ป‘ไธป้ข˜ไธ‹็š„ๅคดๅƒไธ‹ๆ‹‰่œๅ• */ - .ant-pro-account-avatar { - color: rgba(255, 255, 255, 0.85); - - .antd-pro-global-header-index-avatar { - background: rgba(255, 255, 255, 0.25) !important; - } - - span { - color: rgba(255, 255, 255, 0.85); - } - } - - /* ่ฏญ่จ€้€‰ๆ‹ฉๅ™จๅ’Œ่ฎพ็ฝฎๆŒ‰้’ฎ */ - .ant-pro-drop-down { - color: rgba(255, 255, 255, 0.85); - - &:hover { - color: #1890ff; - background: rgba(255, 255, 255, 0.08); - } - } - } - - /* ๆต…่‰ฒไธป้ข˜ไธ‹็š„ๅคดๅƒๆ ทๅผ */ - .ant-pro-account-avatar { - .antd-pro-global-header-index-avatar { - margin: ~'calc((@{layout-header-height} - 24px) / 2)' 0; - margin-right: 8px; - color: @primary-color; - vertical-align: top; - background: rgb(255 255 255 / 85%); - } - } - - .menu { - .anticon { - margin-right: 8px; - } - - .ant-dropdown-menu-item { - min-width: 100px; - } - } -} - -/* ๆš—้ป‘ไธป้ข˜ไธ‹็š„ไธ‹ๆ‹‰่œๅ•ๆ ทๅผ */ -:global { - .ant-pro-layout.dark, - .ant-pro-layout.realdark { - .ant-dropdown-menu { - background: #1f1f1f !important; - border: 1px solid #303030 !important; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3) !important; - - .ant-dropdown-menu-item { - color: rgba(255, 255, 255, 0.85) !important; - - &:hover { - background: #262626 !important; - color: #1890ff !important; - } - } - - .ant-dropdown-menu-item-divider { - background: #303030 !important; - } - } - } -} - -/* ๆ‰‹ๆœบ็ซฏ้€‚้… */ -@media (max-width: 768px) { - :global { - /* ไฝฟ็”จๆ›ดๅ…ทไฝ“็š„้€‰ๆ‹ฉๅ™จๅผบๅˆถ่ฆ†็›– */ - .ant-layout-header .ant-pro-global-header .ant-pro-global-header-logo, - .ant-pro-layout .ant-layout-header .ant-pro-global-header .ant-pro-global-header-logo, - body .ant-layout-header .ant-pro-global-header .ant-pro-global-header-logo, - .ant-pro-global-header-logo { - padding: 0 !important; - padding-left: 0 !important; - padding-right: 0 !important; - padding-top: 0 !important; - padding-bottom: 0 !important; - } - } -} - diff --git a/quantdinger_vue/src/layouts/BasicLayout.vue b/quantdinger_vue/src/layouts/BasicLayout.vue deleted file mode 100644 index c188b8b..0000000 --- a/quantdinger_vue/src/layouts/BasicLayout.vue +++ /dev/null @@ -1,1040 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/layouts/BlankLayout.vue b/quantdinger_vue/src/layouts/BlankLayout.vue deleted file mode 100644 index 1bfbfbf..0000000 --- a/quantdinger_vue/src/layouts/BlankLayout.vue +++ /dev/null @@ -1,16 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/layouts/PageView.vue b/quantdinger_vue/src/layouts/PageView.vue deleted file mode 100644 index 86df485..0000000 --- a/quantdinger_vue/src/layouts/PageView.vue +++ /dev/null @@ -1,12 +0,0 @@ - - - diff --git a/quantdinger_vue/src/layouts/RouteView.vue b/quantdinger_vue/src/layouts/RouteView.vue deleted file mode 100644 index edae19e..0000000 --- a/quantdinger_vue/src/layouts/RouteView.vue +++ /dev/null @@ -1,32 +0,0 @@ - diff --git a/quantdinger_vue/src/layouts/UserLayout.vue b/quantdinger_vue/src/layouts/UserLayout.vue deleted file mode 100644 index 66ce38a..0000000 --- a/quantdinger_vue/src/layouts/UserLayout.vue +++ /dev/null @@ -1,264 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/layouts/index.js b/quantdinger_vue/src/layouts/index.js deleted file mode 100644 index 1d62d6c..0000000 --- a/quantdinger_vue/src/layouts/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import UserLayout from './UserLayout' -import BlankLayout from './BlankLayout' -import BasicLayout from './BasicLayout' -import RouteView from './RouteView' -import PageView from './PageView' - -export { UserLayout, BasicLayout, BlankLayout, RouteView, PageView } diff --git a/quantdinger_vue/src/locales/index.js b/quantdinger_vue/src/locales/index.js deleted file mode 100644 index 69beb80..0000000 --- a/quantdinger_vue/src/locales/index.js +++ /dev/null @@ -1,68 +0,0 @@ -import Vue from 'vue' -import VueI18n from 'vue-i18n' -import storage from 'store' -import moment from 'moment' - -// default lang -import enUS from './lang/en-US' - -Vue.use(VueI18n) - -export const defaultLang = 'en-US' - -const messages = { - 'en-US': { - ...enUS - } -} - -const i18n = new VueI18n({ - silentTranslationWarn: true, - locale: defaultLang, - fallbackLocale: defaultLang, - messages -}) - -const loadedLanguages = [defaultLang] - -function setI18nLanguage (lang) { - i18n.locale = lang - const html = document.documentElement - const isRtl = /^ar/i.test(lang) - if (html) { - // request.headers['Accept-Language'] = lang - html.setAttribute('lang', lang) - html.setAttribute('dir', isRtl ? 'rtl' : 'ltr') - } - if (document.body) { - document.body.setAttribute('dir', isRtl ? 'rtl' : 'ltr') - document.body.classList.toggle('rtl', isRtl) - } - return lang -} - -export function loadLanguageAsync (lang = defaultLang) { - return new Promise(resolve => { - // ็ผ“ๅญ˜่ฏญ่จ€่ฎพ็ฝฎ - storage.set('lang', lang) - if (i18n.locale !== lang) { - if (!loadedLanguages.includes(lang)) { - return import(/* webpackChunkName: "lang-[request]" */ `./lang/${lang}`).then(msg => { - const locale = msg.default - i18n.setLocaleMessage(lang, locale) - loadedLanguages.push(lang) - moment.updateLocale(locale.momentName, locale.momentLocale) - return setI18nLanguage(lang) - }) - } - return resolve(setI18nLanguage(lang)) - } - return resolve(lang) - }) -} - -export function i18nRender (key) { - return i18n.t(`${key}`) -} - -export default i18n diff --git a/quantdinger_vue/src/locales/lang/ar-SA.js b/quantdinger_vue/src/locales/lang/ar-SA.js deleted file mode 100644 index 5e57ea4..0000000 --- a/quantdinger_vue/src/locales/lang/ar-SA.js +++ /dev/null @@ -1,1822 +0,0 @@ -import antdArEG from 'ant-design-vue/es/locale-provider/ar_EG' -import momentAR from 'moment/locale/ar' - -const components = { - antLocale: antdArEG, - momentName: 'ar', - momentLocale: momentAR -} -const locale = { - 'submit': 'ุฅุฑุณุงู„', - 'save': 'ุญูุธ', - 'submit.ok': 'ุชู… ุงู„ุชู‚ุฏูŠู… ุจู†ุฌุงุญ', - 'save.ok': 'ุชู… ุงู„ุญูุธ ุจู†ุฌุงุญ', - 'menu.welcome': 'ู…ุฑุญุจุง ุจูƒู…', - 'menu.home': 'ุงู„ุตูุญุฉ ุงู„ุฑุฆูŠุณูŠุฉ', - 'menu.dashboard': 'ู„ูˆุญุฉ ุงู„ู‚ูŠุงุฏุฉ', - 'menu.dashboard.indicator': 'ุชุญู„ูŠู„ ุงู„ู…ุคุดุฑ', - 'menu.dashboard.community': 'ู…ุฌุชู…ุน ุงู„ู…ุคุดุฑุงุช', - 'menu.dashboard.analysis': 'ุชุญู„ูŠู„ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'menu.dashboard.tradingAssistant': 'ู…ุณุงุนุฏ ุงู„ุชุฏุงูˆู„', - 'menu.dashboard.aiTradingAssistant': 'ู…ุณุงุนุฏ ุงู„ุชุฏุงูˆู„ ุจุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'menu.dashboard.signalRobot': 'ุฑูˆุจูˆุช ุงู„ุฅุดุงุฑุฉ', - 'menu.dashboard.monitor': 'ุตูุญุฉ ุงู„ู…ุฑุงู‚ุจุฉ', - 'menu.dashboard.workplace': 'ุทุงูˆู„ุฉ ุงู„ุนู…ู„', - 'menu.form': 'ุตูุญุฉ ุงู„ู†ู…ูˆุฐุฌ', - 'menu.form.basic-form': 'ุงู„ุดูƒู„ ุงู„ุฃุณุงุณูŠ', - 'menu.form.step-form': 'ุดูƒู„ ุฎุทูˆุฉ ุจุฎุทูˆุฉ', - 'menu.form.step-form.info': 'ู†ู…ูˆุฐุฌ ุฎุทูˆุฉ ุจุฎุทูˆุฉ (ุงู…ู„ุฃ ู…ุนู„ูˆู…ุงุช ุงู„ู†ู‚ู„)', - 'menu.form.step-form.confirm': 'ู†ู…ูˆุฐุฌ ุฎุทูˆุฉ ุจุฎุทูˆุฉ (ุชุฃูƒูŠุฏ ู…ุนู„ูˆู…ุงุช ุงู„ู†ู‚ู„)', - 'menu.form.step-form.result': 'ู†ู…ูˆุฐุฌ ุฎุทูˆุฉ ุจุฎุทูˆุฉ (ูƒุงู…ู„)', - 'menu.form.advanced-form': 'ู†ู…ุงุฐุฌ ู…ุชู‚ุฏู…ุฉ', - 'menu.list': 'ุตูุญุฉ ุงู„ู‚ุงุฆู…ุฉ', - 'menu.list.table-list': 'ู†ู…ูˆุฐุฌ ุงู„ุงุณุชูุณุงุฑ', - 'menu.list.basic-list': 'ุงู„ู‚ุงุฆู…ุฉ ุงู„ู‚ูŠุงุณูŠุฉ', - 'menu.list.card-list': 'ู‚ุงุฆู…ุฉ ุงู„ุจุทุงู‚ุงุช', - 'menu.list.search-list': 'ู‚ุงุฆู…ุฉ ุงู„ุจุญุซ', - 'menu.list.search-list.articles': 'ู‚ุงุฆู…ุฉ ุงู„ุจุญุซ (ุงู„ู…ู‚ุงู„ุงุช)', - 'menu.list.search-list.projects': 'ู‚ุงุฆู…ุฉ ุงู„ุจุญุซ (ุงู„ู…ุดุฑูˆุน)', - 'menu.list.search-list.applications': 'ู‚ุงุฆู…ุฉ ุงู„ุจุญุซ (ุงู„ุชุทุจูŠู‚)', - 'menu.profile': 'ุตูุญุฉ ุงู„ุชูุงุตูŠู„', - 'menu.profile.basic': 'ุตูุญุฉ ุงู„ุชูุงุตูŠู„ ุงู„ุฃุณุงุณูŠุฉ', - 'menu.profile.advanced': 'ุตูุญุฉ ุงู„ุชูุงุตูŠู„ ุงู„ู…ุชู‚ุฏู…ุฉ', - 'menu.result': 'ุตูุญุฉ ุงู„ู†ุชุงุฆุฌ', - 'menu.result.success': 'ุตูุญุฉ ุงู„ู†ุฌุงุญ', - 'menu.result.fail': 'ุตูุญุฉ ุงู„ูุดู„', - 'menu.exception': 'ุตูุญุฉ ุงู„ุงุณุชุซู†ุงุก', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'ุฎุทุฃ ุงู„ุฒู†ุงุฏ', - 'menu.account': 'ุงู„ุตูุญุฉ ุงู„ุดุฎุตูŠุฉ', - 'menu.account.center': 'ู…ุฑูƒุฒ ุดุฎุตูŠ', - 'menu.account.settings': 'ุงู„ุฅุนุฏุงุฏุงุช ุงู„ุดุฎุตูŠุฉ', - 'menu.account.trigger': 'ุฎุทุฃ ุงู„ุฒู†ุงุฏ', - 'menu.account.logout': 'ุชุณุฌูŠู„ ุงู„ุฎุฑูˆุฌ', - 'menu.wallet': 'ู…ุญูุธุชูŠ', - 'menu.docs': 'ู…ุฑูƒุฒ ุงู„ูˆุซุงุฆู‚', - 'menu.docs.detail': 'ุชูุงุตูŠู„ ุงู„ูˆุซูŠู‚ุฉ', - 'menu.header.refreshPage': 'ุชุญุฏูŠุซ ุงู„ุตูุญุฉ', - 'menu.invite.friends': 'ุฏุนูˆุฉ ุงู„ุฃุตุฏู‚ุงุก', - 'app.setting.pagestyle': 'ุฅุนุฏุงุฏุงุช ุงู„ู†ู…ุท ุงู„ุดุงู…ู„ุฉ', - 'app.setting.pagestyle.light': 'ู†ู…ุท ุงู„ู‚ุงุฆู…ุฉ ู…ุดุฑู‚', - 'app.setting.pagestyle.dark': 'ู†ู…ุท ุงู„ู‚ุงุฆู…ุฉ ุงู„ู…ุธู„ู…ุฉ', - 'app.setting.pagestyle.realdark': 'ุงู„ูˆุถุน ุงู„ู…ุธู„ู…', - 'app.setting.themecolor': 'ู„ูˆู† ุงู„ู…ูˆุถูˆุน', - 'app.setting.navigationmode': 'ูˆุถุน ุงู„ุชู†ู‚ู„', - 'app.setting.sidemenu.nav': 'ุงู„ุชู†ู‚ู„ ููŠ ุงู„ุดุฑูŠุท ุงู„ุฌุงู†ุจูŠ', - 'app.setting.topmenu.nav': 'ุงู„ุชู†ู‚ู„ ููŠ ุงู„ุดุฑูŠุท ุงู„ุนู„ูˆูŠ', - 'app.setting.content-width': 'ุนุฑุถ ู…ู†ุทู‚ุฉ ุงู„ู…ุญุชูˆู‰', - 'app.setting.content-width.tooltip': 'ูŠูƒูˆู† ู‡ุฐุง ุงู„ุฅุนุฏุงุฏ ูุนุงู„ุงู‹ ูู‚ุท ุนู†ุฏู…ุง ูŠูƒูˆู† [Top Bar Navigation]', - 'app.setting.content-width.fixed': 'ุซุงุจุช', - 'app.setting.content-width.fluid': 'ุงู„ุจุซ', - 'app.setting.fixedheader': 'ุฑุฃุณ ุซุงุจุช', - 'app.setting.fixedheader.tooltip': 'ุดูƒู„ูŠ ุนู†ุฏู…ุง ุฑุฃุณ ุซุงุจุช', - 'app.setting.autoHideHeader': 'ุฅุฎูุงุก ุงู„ุฑุฃุณ ุนู†ุฏ ุงู„ุชู…ุฑูŠุฑ', - 'app.setting.fixedsidebar': 'ุงู„ู‚ุงุฆู…ุฉ ุงู„ุฌุงู†ุจูŠุฉ ุงู„ุซุงุจุชุฉ', - 'app.setting.sidemenu': 'ุชุฎุทูŠุท ุงู„ู‚ุงุฆู…ุฉ ุงู„ุฌุงู†ุจูŠุฉ', - 'app.setting.topmenu': 'ุชุฎุทูŠุท ุงู„ู‚ุงุฆู…ุฉ ุงู„ุนู„ูˆูŠุฉ', - 'app.setting.othersettings': 'ุฅุนุฏุงุฏุงุช ุฃุฎุฑู‰', - 'app.setting.weakmode': 'ูˆุถุน ุถุนู ุงู„ู„ูˆู†', - 'app.setting.multitab': 'ูˆุถุน ุนู„ุงู…ุงุช ุงู„ุชุจูˆูŠุจ ุงู„ู…ุชุนุฏุฏุฉ', - 'app.setting.copy': 'ุฅุนุฏุงุฏุงุช ุงู„ู†ุณุฎ', - 'app.setting.loading': 'ุฌุงุฑู ุชุญู…ูŠู„ ุงู„ู…ูˆุถูˆุน', - 'app.setting.copyinfo': 'ุงู†ุณุฎ ุงู„ุฅุนุฏุงุฏุงุช ุจู†ุฌุงุญ src/config/defaultSettings.js', - 'app.setting.copy.success': 'ุงูƒุชู…ู„ ุงู„ู†ุณุฎ', - 'app.setting.copy.fail': 'ูุดู„ ุงู„ู†ุณุฎ', - 'app.setting.theme.switching': 'ุชุบูŠูŠุฑ ุงู„ู…ูˆุถูˆุน!', - 'app.setting.production.hint': 'ูŠุชู… ุงุณุชุฎุฏุงู… ุดุฑูŠุท ุงู„ุชูƒูˆูŠู† ูู‚ุท ู„ู„ู…ุนุงูŠู†ุฉ ููŠ ุจูŠุฆุฉ ุงู„ุชุทูˆูŠุฑ ูˆู„ู† ูŠุชู… ุนุฑุถู‡ ููŠ ุจูŠุฆุฉ ุงู„ุฅู†ุชุงุฌ. ูŠุฑุฌู‰ ู†ุณุฎ ูˆุชุนุฏูŠู„ ู…ู„ู ุงู„ุชูƒูˆูŠู† ูŠุฏูˆูŠุง.', - 'app.setting.themecolor.daybreak': 'ุงู„ุฃุฒุฑู‚ ุงู„ุฏุงูƒู† (ุงูุชุฑุงุถูŠ)', - 'app.setting.themecolor.dust': 'ุงู„ุบุณู‚', - 'app.setting.themecolor.volcano': 'ุจุฑูƒุงู†', - 'app.setting.themecolor.sunset': 'ุบุฑูˆุจ ุงู„ุดู…ุณ', - 'app.setting.themecolor.cyan': 'ู…ูŠู†ุบูƒูŠู†ุบ', - 'app.setting.themecolor.green': 'ุฃูˆุฑูˆุฑุง ุงู„ุฎุถุฑุงุก', - 'app.setting.themecolor.geekblue': 'ุงู„ู…ู‡ูˆุณ ุงู„ุฃุฒุฑู‚', - 'app.setting.themecolor.purple': 'ุฌูŠุงู†ุบ ุฒูŠ', - 'app.setting.tooltip': 'ุฅุนุฏุงุฏุงุช ุงู„ุตูุญุฉ', - 'user.login.userName': 'ุงุณู… ุงู„ู…ุณุชุฎุฏู…', - 'user.login.password': 'ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ', - 'user.login.username.placeholder': 'ุงู„ุญุณุงุจ: ุงู„ู…ุดุฑู', - 'user.login.password.placeholder': 'ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ: admin ุฃูˆ ant.design', - 'user.login.message-invalid-credentials': 'ูุดู„ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ุŒ ูŠุฑุฌู‰ ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุงู„ุฎุงุต ุจูƒ ูˆุฑู…ุฒ ุงู„ุชุญู‚ู‚', - 'user.login.message-invalid-verification-code': 'ุฎุทุฃ ููŠ ุฑู…ุฒ ุงู„ุชุญู‚ู‚', - 'user.login.tab-login-credentials': 'ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจูƒู„ู…ุฉ ู…ุฑูˆุฑ ุงู„ุญุณุงุจ', - 'user.login.tab-login-email': 'ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'user.login.tab-login-mobile': 'ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจุฑู‚ู… ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„', - 'user.login.captcha.placeholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ุชุญู‚ู‚ ุงู„ุฑุณูˆู…ูŠ', - 'user.login.mobile.placeholder': 'ุฑู‚ู… ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„', - 'user.login.mobile.verification-code.placeholder': 'ุฑู…ุฒ ุงู„ุชุญู‚ู‚', - 'user.login.email.placeholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุงู„ุฎุงุต ุจูƒ', - 'user.login.email.verification-code.placeholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ุชุญู‚ู‚', - 'user.login.email.sending': 'ุฌุงุฑูŠ ุฅุฑุณุงู„ ุฑู…ุฒ ุงู„ุชุญู‚ู‚...', - 'user.login.email.send-success-title': 'ู†ุตุงุฆุญ', - 'user.login.email.send-success': 'ุชู… ุฅุฑุณุงู„ ุฑู…ุฒ ุงู„ุชุญู‚ู‚ ุจู†ุฌุงุญุŒ ูŠุฑุฌู‰ ุงู„ุชุญู‚ู‚ ู…ู† ุจุฑูŠุฏูƒ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'user.login.sms.send-success': 'ุชู… ุฅุฑุณุงู„ ุฑู…ุฒ ุงู„ุชุญู‚ู‚ ุจู†ุฌุงุญุŒ ูŠุฑุฌู‰ ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ุฑุณุงู„ุฉ ุงู„ู†ุตูŠุฉ', - 'user.login.remember-me': 'ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุงู„ุชู„ู‚ุงุฆูŠ', - 'user.login.forgot-password': 'ู†ุณูŠุช ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ', - 'user.login.sign-in-with': 'ุทุฑู‚ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุงู„ุฃุฎุฑู‰', - 'user.login.signup': 'ุชุณุฌูŠู„ ุญุณุงุจ', - 'user.login.login': 'ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„', - 'user.register.register': 'ุณุฌู„', - 'user.register.email.placeholder': 'ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'user.register.password.placeholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ 6 ุฃุญุฑู ุนู„ู‰ ุงู„ุฃู‚ู„. ูŠุฑุฌู‰ ุนุฏู… ุงุณุชุฎุฏุงู… ูƒู„ู…ุงุช ุงู„ู…ุฑูˆุฑ ุงู„ุชูŠ ูŠู…ูƒู† ุชุฎู…ูŠู†ู‡ุง ุจุณู‡ูˆู„ุฉ.', - 'user.register.password.popover-message': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ 6 ุฃุญุฑู ุนู„ู‰ ุงู„ุฃู‚ู„. ูŠุฑุฌู‰ ุนุฏู… ุงุณุชุฎุฏุงู… ูƒู„ู…ุงุช ุงู„ู…ุฑูˆุฑ ุงู„ุชูŠ ูŠู…ูƒู† ุชุฎู…ูŠู†ู‡ุง ุจุณู‡ูˆู„ุฉ.', - 'user.register.confirm-password.placeholder': 'ุชุฃูƒูŠุฏ ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ', - 'user.register.get-verification-code': 'ุงู„ุญุตูˆู„ ุนู„ู‰ ุฑู…ุฒ ุงู„ุชุญู‚ู‚', - 'user.register.sign-in': 'ู‚ู… ุจุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจุงุณุชุฎุฏุงู… ุญุณุงุจ ู…ูˆุฌูˆุฏ', - 'user.register-result.msg': 'ุญุณุงุจูƒ: {email} ุชู… ุงู„ุชุณุฌูŠู„ ุจู†ุฌุงุญ', - 'user.register-result.activation-email': 'ุชู… ุฅุฑุณุงู„ ุฑุณุงู„ุฉ ุงู„ุชูุนูŠู„ ุฅู„ู‰ ุตู†ุฏูˆู‚ ุงู„ุจุฑูŠุฏ ุงู„ุฎุงุต ุจูƒ ูˆู‡ูŠ ุตุงู„ุญุฉ ู„ู…ุฏุฉ 24 ุณุงุนุฉ. ูŠุฑุฌู‰ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุฅู„ู‰ ุจุฑูŠุฏูƒ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุนู„ู‰ ุงู„ููˆุฑ ูˆุงู„ู†ู‚ุฑ ุนู„ู‰ ุงู„ุฑุงุจุท ุงู„ู…ูˆุฌูˆุฏ ููŠ ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ู„ุชูุนูŠู„ ุญุณุงุจูƒ.', - 'user.register-result.back-home': 'ุงู„ุนูˆุฏุฉ ุฅู„ู‰ ุงู„ุตูุญุฉ ุงู„ุฑุฆูŠุณูŠุฉ', - 'user.register-result.view-mailbox': 'ุชุญู‚ู‚ ู…ู† ุตู†ุฏูˆู‚ ุงู„ุจุฑูŠุฏ ุงู„ุฎุงุต ุจูƒ', - 'user.email.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุงู„ุฎุงุต ุจูƒ!', - 'user.email.wrong-format': 'ุชู†ุณูŠู‚ ุนู†ูˆุงู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุฎุงุทุฆ!', - 'user.userName.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงุณู… ุญุณุงุจูƒ ุฃูˆ ุนู†ูˆุงู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุงู„ุฎุงุต ุจูƒ', - 'user.password.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ ุงู„ุฎุงุตุฉ ุจูƒ!', - 'user.password.twice.msg': 'ูƒู„ู…ุงุช ุงู„ู…ุฑูˆุฑ ุงู„ุชูŠ ุชู… ุฅุฏุฎุงู„ู‡ุง ู…ุฑุชูŠู† ุบูŠุฑ ู…ุชุทุงุจู‚ุฉ!', - 'user.password.strength.msg': 'ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ ู„ูŠุณุช ู‚ูˆูŠุฉ ุจู…ุง ููŠู‡ ุงู„ูƒูุงูŠุฉ', - 'user.password.strength.strong': 'ุงู„ู‚ูˆุฉ : ู‚ูˆูŠุฉ', - 'user.password.strength.medium': 'ุงู„ู‚ูˆุฉ: ู…ุชูˆุณุทุฉ', - 'user.password.strength.low': 'ุงู„ู‚ูˆุฉ: ู…ู†ุฎูุถุฉ', - 'user.password.strength.short': 'ุงู„ู‚ูˆุฉ : ู‚ุตูŠุฑุฉ ุฌุฏุงู‹', - 'user.confirm-password.required': 'ุงู„ุฑุฌุงุก ุชุฃูƒูŠุฏ ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ ุงู„ุฎุงุตุฉ ุจูƒ!', - 'user.phone-number.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู‚ู… ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„ ุงู„ุตุญูŠุญ', - 'user.phone-number.wrong-format': 'ุชู†ุณูŠู‚ ุฑู‚ู… ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„ ุฎุงุทุฆ!', - 'user.verification-code.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ุชุญู‚ู‚!', - 'user.captcha.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ุชุญู‚ู‚ ุงู„ุฑุณูˆู…ูŠ!', - 'user.login.infos': 'QuantDinger ู‡ูŠ ุฃุฏุงุฉ ู…ุณุงุนุฏุฉ ู„ุชุญู„ูŠู„ ุงู„ุฃุณู‡ู… ู…ุชุนุฏุฏุฉ ุงู„ูˆูƒู„ุงุก ุชุนู…ู„ ุจุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ูˆู„ุง ุชุชู…ุชุน ุจู…ุคู‡ู„ุงุช ุงุณุชุดุงุฑูŠุฉ ููŠ ู…ุฌุงู„ ุงู„ุงุณุชุซู…ุงุฑ ููŠ ุงู„ุฃูˆุฑุงู‚ ุงู„ู…ุงู„ูŠุฉ. ูŠุชู… ุฅู†ุดุงุก ุฌู…ูŠุน ู†ุชุงุฆุฌ ุงู„ุชุญู„ูŠู„ ูˆุงู„ุฏุฑุฌุงุช ูˆุงู„ุขุฑุงุก ุงู„ู…ุฑุฌุนูŠุฉ ููŠ ุงู„ู…ู†ุตุฉ ุชู„ู‚ุงุฆูŠู‹ุง ุจูˆุงุณุทุฉ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ุงุณุชู†ุงุฏู‹ุง ุฅู„ู‰ ุงู„ุจูŠุงู†ุงุช ุงู„ุชุงุฑูŠุฎูŠุฉ ูˆุชุณุชุฎุฏู… ูู‚ุท ู„ู„ุชุนู„ู… ูˆุงู„ุจุญุซ ูˆุงู„ุชุจุงุฏู„ ุงู„ูู†ูŠุŒ ูˆู„ุง ุชุดูƒู„ ุฃูŠ ู†ุตูŠุญุฉ ุงุณุชุซู…ุงุฑูŠุฉ ุฃูˆ ุฃุณุงุณ ู„ุตู†ุน ุงู„ู‚ุฑุงุฑ. ูŠู†ุทูˆูŠ ุงู„ุงุณุชุซู…ุงุฑ ููŠ ุงู„ุฃุณู‡ู… ุนู„ู‰ ู…ุฎุงุทุฑ ู…ุฎุชู„ูุฉ ู…ุซู„ ู…ุฎุงุทุฑ ุงู„ุณูˆู‚ุŒ ูˆู…ุฎุงุทุฑ ุงู„ุณูŠูˆู„ุฉุŒ ูˆู…ุฎุงุทุฑ ุงู„ุณูŠุงุณุฉุŒ ูˆู…ุง ุฅู„ู‰ ุฐู„ูƒุŒ ู…ู…ุง ู‚ุฏ ูŠุคุฏูŠ ุฅู„ู‰ ุฎุณุงุฑุฉ ุฑุฃุณ ุงู„ู…ุงู„. ูŠุฌุจ ุนู„ู‰ ุงู„ู…ุณุชุฎุฏู…ูŠู† ุงุชุฎุงุฐ ู‚ุฑุงุฑุงุช ู…ุณุชู‚ู„ุฉ ุจู†ุงุกู‹ ุนู„ู‰ ู‚ุฏุฑุชู‡ู… ุนู„ู‰ ุชุญู…ู„ ุงู„ู…ุฎุงุทุฑุŒ ูˆูŠุฌุจ ุฃู† ูŠุชุญู…ู„ ุงู„ู…ุณุชุฎุฏู… ุฃูŠ ุณู„ูˆูƒ ุงุณุชุซู…ุงุฑูŠ ูˆุนูˆุงู‚ุจ ุชู†ุดุฃ ุนู† ุงุณุชุฎุฏุงู… ู‡ุฐู‡ ุงู„ุฃุฏุงุฉ. ุงู„ุณูˆู‚ ู…ุญููˆู ุจุงู„ู…ุฎุงุทุฑ ูˆุงู„ุงุณุชุซู…ุงุฑ ูŠุญุชุงุฌ ุฅู„ู‰ ุงู„ุญุฐุฑ.', - 'user.login.tab-login-web3': 'ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุฅู„ู‰ Web3', - 'user.login.web3.tip': 'ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจุงู„ุชูˆู‚ูŠุน ุจุงุณุชุฎุฏุงู… ุงู„ู…ุญูุธุฉ', - 'user.login.web3.connect': 'ุฑุจุท ุงู„ู…ุญูุธุฉ ูˆุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„', - 'user.login.web3.no-wallet': 'ู„ู… ูŠุชู… ุงู„ูƒุดู ุนู† ุงู„ู…ุญูุธุฉ', - 'user.login.web3.no-address': 'ู„ู… ูŠุชู… ุงู„ุญุตูˆู„ ุนู„ู‰ ุนู†ูˆุงู† ุงู„ู…ุญูุธุฉ', - 'user.login.web3.nonce-failed': 'ูุดู„ ุงู„ุญุตูˆู„ ุนู„ู‰ ุฑู‚ู… ุนุดูˆุงุฆูŠ', - 'user.login.web3.verify-failed': 'ูุดู„ ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ุชูˆู‚ูŠุน', - 'user.login.web3.success': 'ุชู… ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจู†ุฌุงุญ', - 'user.login.web3.failed': 'ูุดู„ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุฅู„ู‰ ุงู„ู…ุญูุธุฉ', - 'nav.no_wallet': 'ู„ู… ูŠุชู… ุงู„ูƒุดู ุนู† ุงู„ู…ุญูุธุฉ', - 'nav.copy': 'ู†ุณุฎ', - 'nav.copy_success': 'ุชู… ุงู„ู†ุณุฎ ุจู†ุฌุงุญ', - 'user.login.oauth.google': 'ู‚ู… ุจุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจุงุณุชุฎุฏุงู… ุฌูˆุฌู„', - 'user.login.oauth.github': 'ู‚ู… ุจุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจุงุณุชุฎุฏุงู… ุฌูŠุซุจ', - 'user.login.oauth.loading': 'ุฌุงุฑู ุฅุนุงุฏุฉ ุงู„ุชูˆุฌูŠู‡ ุฅู„ู‰ ุตูุญุฉ ุงู„ุชููˆูŠุถ...', - 'user.login.oauth.failed': 'ูุดู„ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุจุงุณุชุฎุฏุงู… OAuth', - 'user.login.oauth.get-url-failed': 'ูุดู„ ุงู„ุญุตูˆู„ ุนู„ู‰ ุฑุงุจุท ุงู„ุชุฑุฎูŠุต', - 'user.login.subtitle': 'ุฑุคู‰ ูƒู…ูŠุฉ ู…ุฏููˆุนุฉ ููŠ ุงู„ุฃุณูˆุงู‚ ุงู„ุนุงู„ู…ูŠุฉ', - 'user.login.legal.title': 'ุฅุฎู„ุงุก ุงู„ู…ุณุคูˆู„ูŠุฉ ุงู„ู‚ุงู†ูˆู†ูŠุฉ', - 'user.login.legal.view': 'ุนุฑุถ ุฅุฎู„ุงุก ุงู„ู…ุณุคูˆู„ูŠุฉ ุงู„ู‚ุงู†ูˆู†ูŠุฉ', - 'user.login.legal.collapse': 'ุทูŠ ุฅุฎู„ุงุก ุงู„ู…ุณุคูˆู„ูŠุฉ ุงู„ู‚ุงู†ูˆู†ูŠุฉ', - 'user.login.legal.agree': 'ู„ู‚ุฏ ู‚ุฑุฃุช ูˆูˆุงูู‚ุช ุนู„ู‰ ุฅุฎู„ุงุก ุงู„ู…ุณุคูˆู„ูŠุฉ ุงู„ู‚ุงู†ูˆู†ูŠุฉ', - 'user.login.legal.required': 'ูŠุฑุฌู‰ ู‚ุฑุงุกุฉ ูˆุงู„ุชุญู‚ู‚ ู…ู† ุฅุฎู„ุงุก ุงู„ู…ุณุคูˆู„ูŠุฉ ุงู„ู‚ุงู†ูˆู†ูŠุฉ ุฃูˆู„ุง', - 'user.login.legal.content': 'QuantDinger ู‡ูŠ ุฃุฏุงุฉ ู…ุณุงุนุฏุฉ ู„ุชุญู„ูŠู„ ุงู„ุฃุณู‡ู… ู…ุชุนุฏุฏุฉ ุงู„ูˆูƒู„ุงุก ุชุนู…ู„ ุจุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ูˆู„ุง ุชุชู…ุชุน ุจู…ุคู‡ู„ุงุช ุงุณุชุดุงุฑูŠุฉ ููŠ ู…ุฌุงู„ ุงู„ุงุณุชุซู…ุงุฑ ููŠ ุงู„ุฃูˆุฑุงู‚ ุงู„ู…ุงู„ูŠุฉ. ูŠุชู… ุฅู†ุดุงุก ุฌู…ูŠุน ู†ุชุงุฆุฌ ุงู„ุชุญู„ูŠู„ ูˆุงู„ุชู‚ูŠูŠู…ุงุช ูˆุงู„ุขุฑุงุก ุงู„ู…ุฑุฌุนูŠุฉ ููŠ ุงู„ู…ู†ุตุฉ ุชู„ู‚ุงุฆูŠู‹ุง ุจูˆุงุณุทุฉ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ุงุณุชู†ุงุฏู‹ุง ุฅู„ู‰ ุงู„ุจูŠุงู†ุงุช ุงู„ุชุงุฑูŠุฎูŠุฉ ูˆุชุณุชุฎุฏู… ูู‚ุท ู„ู„ุชุนู„ู… ูˆุงู„ุจุญุซ ูˆุงู„ุชุจุงุฏู„ ุงู„ูู†ูŠุŒ ูˆู„ุง ุชุดูƒู„ ุฃูŠ ู†ุตูŠุญุฉ ุงุณุชุซู…ุงุฑูŠุฉ ุฃูˆ ุฃุณุงุณ ู„ุตู†ุน ุงู„ู‚ุฑุงุฑ. ูŠู†ุทูˆูŠ ุงู„ุงุณุชุซู…ุงุฑ ููŠ ุงู„ุฃุณู‡ู… ุนู„ู‰ ู…ุฎุงุทุฑ ู…ุฎุชู„ูุฉ ู…ุซู„ ู…ุฎุงุทุฑ ุงู„ุณูˆู‚ุŒ ูˆู…ุฎุงุทุฑ ุงู„ุณูŠูˆู„ุฉุŒ ูˆู…ุฎุงุทุฑ ุงู„ุณูŠุงุณุฉุŒ ูˆู…ุง ุฅู„ู‰ ุฐู„ูƒุŒ ู…ู…ุง ู‚ุฏ ูŠุคุฏูŠ ุฅู„ู‰ ุฎุณุงุฑุฉ ุฑุฃุณ ุงู„ู…ุงู„. ูŠุฌุจ ุนู„ู‰ ุงู„ู…ุณุชุฎุฏู…ูŠู† ุงุชุฎุงุฐ ู‚ุฑุงุฑุงุช ู…ุณุชู‚ู„ุฉ ุจู†ุงุกู‹ ุนู„ู‰ ู‚ุฏุฑุชู‡ู… ุนู„ู‰ ุชุญู…ู„ ุงู„ู…ุฎุงุทุฑุŒ ูˆูŠุฌุจ ุฃู† ูŠุชุญู…ู„ ุงู„ู…ุณุชุฎุฏู… ุฃูŠ ุณู„ูˆูƒ ุงุณุชุซู…ุงุฑูŠ ูˆุนูˆุงู‚ุจ ุชู†ุดุฃ ุนู† ุงุณุชุฎุฏุงู… ู‡ุฐู‡ ุงู„ุฃุฏุงุฉ. ุงู„ุณูˆู‚ ู…ุญููˆู ุจุงู„ู…ุฎุงุทุฑ ูˆุงู„ุงุณุชุซู…ุงุฑ ูŠุญุชุงุฌ ุฅู„ู‰ ุงู„ุญุฐุฑ.', - 'user.login.privacy.title': 'ุณูŠุงุณุฉ ุฎุตูˆุตูŠุฉ ุงู„ู…ุณุชุฎุฏู…', - 'user.login.privacy.view': 'ุนุฑุถ ุณูŠุงุณุฉ ุฎุตูˆุตูŠุฉ ุงู„ู…ุณุชุฎุฏู…', - 'user.login.privacy.collapse': 'ุฅุบู„ุงู‚ ุดุฑูˆุท ุฎุตูˆุตูŠุฉ ุงู„ู…ุณุชุฎุฏู…', - 'user.login.privacy.content': 'ู†ุญู† ู†ู‚ุฏุฑ ุฎุตูˆุตูŠุชูƒ ูˆุญู…ุงูŠุฉ ุงู„ุจูŠุงู†ุงุช. 1) ู†ุทุงู‚ ุงู„ุชุฌู…ูŠุน: ูŠุชู… ุฌู…ุน ุงู„ู…ุนู„ูˆู…ุงุช ุงู„ู…ุทู„ูˆุจุฉ ู„ุชู†ููŠุฐ ุงู„ูˆุธูŠูุฉ ูู‚ุท (ู…ุซู„ ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ูˆุฑู‚ู… ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„ ูˆุฑู…ุฒ ุงู„ู…ู†ุทู‚ุฉ ูˆุนู†ูˆุงู† ู…ุญูุธุฉ Web3) ูˆุงู„ุณุฌู„ุงุช ุงู„ุถุฑูˆุฑูŠุฉ ูˆู…ุนู„ูˆู…ุงุช ุงู„ุฌู‡ุงุฒ. 2) ุงู„ุบุฑุถ ู…ู† ุงู„ุงุณุชุฎุฏุงู…: ู„ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุฅู„ู‰ ุงู„ุญุณุงุจ ูˆุงู„ุชุญู‚ู‚ ู…ู† ุงู„ุฃู…ุงู† ูˆุชูˆููŠุฑ ูˆุธูŠูุฉ ุงู„ุฎุฏู…ุฉ ูˆุงุณุชูƒุดุงู ุงู„ุฃุฎุทุงุก ูˆุฅุตู„ุงุญู‡ุง ูˆู…ุชุทู„ุจุงุช ุงู„ุงู…ุชุซุงู„. 3) ุงู„ุชุฎุฒูŠู† ูˆุงู„ุฃู…ุงู†: ูŠุชู… ุชุดููŠุฑ ุงู„ุจูŠุงู†ุงุช ูˆุชุฎุฒูŠู†ู‡ุงุŒ ูˆูŠุชู… ุงุชุฎุงุฐ ุงู„ุฃุฐูˆู†ุงุช ุงู„ู„ุงุฒู…ุฉ ูˆุฅุฌุฑุงุกุงุช ุงู„ุชุญูƒู… ููŠ ุงู„ูˆุตูˆู„ ู„ู…ุญุงูˆู„ุฉ ู…ู†ุน ุงู„ูˆุตูˆู„ ุบูŠุฑ ุงู„ู…ุตุฑุญ ุจู‡ ุฃูˆ ุงู„ูƒุดู ุนู†ู‡ุง ุฃูˆ ูู‚ุฏุงู†ู‡ุง. 4) ุงู„ู…ุดุงุฑูƒุฉ ู…ุน ุฃุทุฑุงู ุซุงู„ุซุฉ: ู…ุง ู„ู… ูŠูƒู† ุฐู„ูƒ ู…ุทู„ูˆุจู‹ุง ุจู…ูˆุฌุจ ุงู„ู‚ูˆุงู†ูŠู† ูˆุงู„ู„ูˆุงุฆุญ ุฃูˆ ุถุฑูˆุฑูŠู‹ุง ู„ุฃุฏุงุก ุงู„ุฎุฏู…ุงุชุŒ ู„ู† ุชุชู… ู…ุดุงุฑูƒุฉ ู…ุนู„ูˆู…ุงุชูƒ ุงู„ุดุฎุตูŠุฉ ู…ุน ุฃุทุฑุงู ุซุงู„ุซุฉุ› ุฅุฐุง ูƒุงู†ุช ู‡ู†ุงูƒ ุฎุฏู…ุงุช ุชุงุจุนุฉ ู„ุฌู‡ุงุช ุฎุงุฑุฌูŠุฉ (ู…ุซู„ ุงู„ู…ุญุงูุธ ูˆู…ู‚ุฏู…ูŠ ุฎุฏู…ุงุช ุงู„ุฑุณุงุฆู„ ุงู„ู†ุตูŠุฉ ุงู„ู‚ุตูŠุฑุฉ)ุŒ ูู„ู† ุชุชู… ู…ุนุงู„ุฌุชู‡ุง ุฅู„ุง ุฅู„ู‰ ุงู„ุญุฏ ุงู„ุฃุฏู†ู‰ ุงู„ู„ุงุฒู… ู„ุชู†ููŠุฐ ุงู„ูˆุธูŠูุฉ. 5) ู…ู„ูุงุช ุชุนุฑูŠู ุงู„ุงุฑุชุจุงุท/ุงู„ุชุฎุฒูŠู† ุงู„ู…ุญู„ูŠ: ุชูุณุชุฎุฏู… ู„ุญุงู„ุฉ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ูˆุตูŠุงู†ุฉ ุงู„ุฌู„ุณุฉ ุงู„ุถุฑูˆุฑูŠุฉ (ู…ุซู„ ุงู„ุฑู…ูˆุฒ ุงู„ู…ู…ูŠุฒุฉุŒ PHPSESSID)ุŒ ูˆูŠู…ูƒู†ูƒ ู…ุณุญู‡ุง ุฃูˆ ุชู‚ูŠูŠุฏู‡ุง ููŠ ุงู„ู…ุชุตูุญ. 6) ุงู„ุญู‚ูˆู‚ ุงู„ุดุฎุตูŠุฉ: ูŠู…ูƒู†ูƒ ู…ู…ุงุฑุณุฉ ุญู‚ูˆู‚ูƒ ููŠ ุงู„ุงุณุชูุณุงุฑ ูˆุงู„ุชุตุญูŠุญ ูˆุงู„ุญุฐู ูˆุณุญุจ ุงู„ู…ูˆุงูู‚ุฉ ูˆู…ุง ุฅู„ู‰ ุฐู„ูƒ ูˆูู‚ู‹ุง ู„ู„ู‚ูˆุงู†ูŠู† ูˆุงู„ู„ูˆุงุฆุญ. 7) ุงู„ุชุบูŠูŠุฑุงุช ูˆุงู„ุฅุดุนุงุฑุงุช: ุนู†ุฏ ุชุญุฏูŠุซ ู‡ุฐู‡ ุงู„ุดุฑูˆุทุŒ ุณูŠุชู… ุนุฑุถู‡ุง ุจุดูƒู„ ุจุงุฑุฒ ุนู„ู‰ ุงู„ุตูุญุฉ. ู…ู† ุฎู„ุงู„ ุงู„ุงุณุชู…ุฑุงุฑ ููŠ ุงุณุชุฎุฏุงู… ู‡ุฐู‡ ุงู„ุฎุฏู…ุฉุŒ ูŠุนุชุจุฑ ุฃู†ูƒ ู‚ุฏ ู‚ุฑุฃุช ุงู„ู…ุญุชูˆู‰ ุงู„ู…ุญุฏุซ ูˆูˆุงูู‚ุช ุนู„ูŠู‡. ุฅุฐุง ูƒู†ุช ู„ุง ุชูˆุงูู‚ ุนู„ู‰ ู‡ุฐู‡ ุงู„ุดุฑูˆุท ุฃูˆ ุฃูŠ ุชุญุฏูŠุซุงุช ู„ู‡ุงุŒ ููŠุฑุฌู‰ ุงู„ุชูˆู‚ู ุนู† ุงุณุชุฎุฏุงู… ุงู„ุฎุฏู…ุฉ ูˆุงู„ุงุชุตุงู„ ุจู†ุง.', - 'account.basicInfo': 'ุงู„ู…ุนู„ูˆู…ุงุช ุงู„ุฃุณุงุณูŠุฉ', - 'account.id': 'ู…ุนุฑู ุงู„ู…ุณุชุฎุฏู…', - 'account.username': 'ุงุณู… ุงู„ู…ุณุชุฎุฏู…', - 'account.nickname': 'ุงู„ู„ู‚ุจ', - 'account.email': 'ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'account.mobile': 'ุฑู‚ู… ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„', - 'account.web3address': 'ุนู†ูˆุงู† ุงู„ู…ุญูุธุฉ', - 'account.pid': 'ู…ุนุฑู ุงู„ู…ุฑุฌุน', - 'account.level': 'ู…ุณุชูˆู‰ ุงู„ู…ุณุชุฎุฏู…', - 'account.money': 'ุงู„ุชูˆุงุฒู†', - 'account.qdtBalance': 'ุฑุตูŠุฏ ูƒูŠูˆ ุฏูŠ ุชูŠ', - 'account.score': 'ุงู„ู†ู‚ุงุท', - 'account.createtime': 'ูˆู‚ุช ุงู„ุชุณุฌูŠู„', - 'account.inviteLink': 'ุฑุงุจุท ุงู„ุฏุนูˆุฉ', - 'account.recharge': 'ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'account.rechargeTip': 'ูŠุฑุฌู‰ ุงุณุชุฎุฏุงู… WeChat ุฃูˆ Alipay ู„ู…ุณุญ ุฑู…ุฒ ุงู„ุงุณุชุฌุงุจุฉ ุงู„ุณุฑูŠุนุฉ ุฃุฏู†ุงู‡ ู„ุฅุนุงุฏุฉ ุงู„ุดุญู†.', - 'account.qrCodePlaceholder': 'ุงู„ุนู†ุตุฑ ุงู„ู†ุงุฆุจ ู„ุฑู…ุฒ ุงู„ุงุณุชุฌุงุจุฉ ุงู„ุณุฑูŠุนุฉ (ุงู„ู…ุญุงูƒุงุฉ)', - 'account.rechargeAmount': 'ู…ุจู„ุบ ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'account.enterAmount': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'account.rechargeHint': 'ุงู„ุญุฏ ุงู„ุฃุฏู†ู‰ ู„ู…ุจู„ุบ ุงู„ุฅูŠุฏุงุน: 1 QDT', - 'account.confirmRecharge': 'ุชุฃูƒูŠุฏ ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'account.enterValidAmount': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุชุนุจุฆุฉ ุตุงู„ุญ', - 'account.rechargeSuccess': 'ุชู… ุฅุนุงุฏุฉ ุงู„ุดุญู† ุจู†ุฌุงุญ! ุชู… ุฅูŠุฏุงุน {amount} QDT', - 'account.settings.menuMap.basic': 'ุงู„ุฅุนุฏุงุฏุงุช ุงู„ุฃุณุงุณูŠุฉ', - 'account.settings.menuMap.security': 'ุฅุนุฏุงุฏุงุช ุงู„ุฃู…ุงู†', - 'account.settings.menuMap.notification': 'ุฅุดุนุงุฑ ุงู„ุฑุณุงู„ุฉ ุงู„ุฌุฏูŠุฏุฉ', - 'account.settings.menuMap.moneyLog': 'ุชูุงุตูŠู„ ุงู„ุตู†ุฏูˆู‚', - 'account.moneyLog.empty': 'ู„ุง ุชูˆุฌุฏ ุชูุงุตูŠู„ ุงู„ุตู†ุฏูˆู‚ ุญุชู‰ ุงู„ุขู†', - 'account.moneyLog.total': '{total} ุงู„ุณุฌู„ุงุช ููŠ ุงู„ู…ุฌู…ูˆุน', - 'account.moneyLog.type.purchase': 'ู…ุคุดุฑ ุงู„ุดุฑุงุก', - 'account.moneyLog.type.recharge': 'ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'account.moneyLog.type.refund': 'ุงุณุชุฑุฏุงุฏ', - 'account.moneyLog.type.reward': 'ู…ูƒุงูุฃุฉ', - 'account.moneyLog.type.income': 'ุฏุฎู„ ุงู„ู…ุคุดุฑ', - 'account.moneyLog.type.commission': 'ุฑุณูˆู… ุงู„ุชุนุงู…ู„ ู…ุน ุงู„ู…ู†ุตุฉ', - 'wallet.balance': 'ุฑุตูŠุฏ ูƒูŠูˆ ุฏูŠ ุชูŠ', - 'wallet.recharge': 'ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'wallet.withdraw': 'ุณุญุจ ุงู„ู†ู‚ูˆุฏ', - 'wallet.filter': 'ุชุตููŠุฉ', - 'wallet.reset': 'ุฅุนุงุฏุฉ ุชุนูŠูŠู†', - 'wallet.totalRecharge': 'ุงู„ุชุบุฐูŠุฉ ุงู„ู…ุชุฑุงูƒู…ุฉ', - 'wallet.totalWithdraw': 'ุนู…ู„ูŠุงุช ุงู„ุณุญุจ ุงู„ุชุฑุงูƒู…ูŠุฉ', - 'wallet.totalIncome': 'ุงู„ุฏุฎู„ ุงู„ุชุฑุงูƒู…ูŠ', - 'wallet.records': 'ุณุฌู„ุงุช ุงู„ู…ุนุงู…ู„ุงุช ูˆุชูุงุตูŠู„ ุงู„ุตู†ุฏูˆู‚', - 'wallet.tradingRecords': 'ุชุงุฑูŠุฎ ุงู„ู…ุนุงู…ู„ุฉ', - 'wallet.moneyLog': 'ุชูุงุตูŠู„ ุงู„ุตู†ุฏูˆู‚', - 'wallet.rechargeTip': 'ูŠุฑุฌู‰ ุงุณุชุฎุฏุงู… WeChat ุฃูˆ Alipay ู„ู…ุณุญ ุฑู…ุฒ ุงู„ุงุณุชุฌุงุจุฉ ุงู„ุณุฑูŠุนุฉ ุฃุฏู†ุงู‡ ู„ุฅุนุงุฏุฉ ุงู„ุดุญู†.', - 'wallet.qrCodePlaceholder': 'ุงู„ุนู†ุตุฑ ุงู„ู†ุงุฆุจ ู„ุฑู…ุฒ ุงู„ุงุณุชุฌุงุจุฉ ุงู„ุณุฑูŠุนุฉ (ุงู„ู…ุญุงูƒุงุฉ)', - 'wallet.rechargeAmount': 'ู…ุจู„ุบ ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'wallet.enterAmount': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'wallet.rechargeHint': 'ุงู„ุญุฏ ุงู„ุฃุฏู†ู‰ ู„ู…ุจู„ุบ ุงู„ุฅูŠุฏุงุน: 1 QDT', - 'wallet.confirmRecharge': 'ุชุฃูƒูŠุฏ ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'wallet.enterValidAmount': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุชุนุจุฆุฉ ุตุงู„ุญ', - 'wallet.rechargeSuccess': 'ุชู… ุฅุนุงุฏุฉ ุงู„ุดุญู† ุจู†ุฌุงุญ! ุชู… ุฅูŠุฏุงุน {amount} QDT', - 'wallet.rechargeFailed': 'ูุดู„ุช ุนู…ู„ูŠุฉ ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'wallet.withdrawTip': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุงู„ุณุญุจ ูˆุนู†ูˆุงู† ุงู„ุณุญุจ', - 'wallet.withdrawAmount': 'ุณุญุจ ุงู„ู…ุจู„ุบ', - 'wallet.enterWithdrawAmount': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุงู„ุณุญุจ', - 'wallet.withdrawHint': 'ุงู„ุญุฏ ุงู„ุฃุฏู†ู‰ ู„ู…ุจู„ุบ ุงู„ุณุญุจ: 1 QDT', - 'wallet.withdrawAddress': 'ุนู†ูˆุงู† ุงู„ุณุญุจ (ุงุฎุชูŠุงุฑูŠ)', - 'wallet.enterWithdrawAddress': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู† ุงู„ุณุญุจ', - 'wallet.confirmWithdraw': 'ุชุฃูƒูŠุฏ ุงู„ุงู†ุณุญุงุจ', - 'wallet.enterValidWithdrawAmount': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุณุญุจ ุตุงู„ุญ', - 'wallet.insufficientBalance': 'ุฑุตูŠุฏ ุบูŠุฑ ูƒุงู', - 'wallet.withdrawSuccess': 'ุชู… ุงู„ุณุญุจ ุจู†ุฌุงุญ! ุชู… ุณุญุจ {ุงู„ู…ุจู„ุบ} QDT', - 'wallet.withdrawFailed': 'ูุดู„ ุงู„ุงู†ุณุญุงุจ', - 'wallet.noTradingRecords': 'ู„ุง ูŠูˆุฌุฏ ุณุฌู„ ุงู„ู…ุนุงู…ู„ุงุช ุญุชู‰ ุงู„ุขู†', - 'wallet.noMoneyLog': 'ู„ุง ุชูˆุฌุฏ ุชูุงุตูŠู„ ุงู„ุตู†ุฏูˆู‚ ุญุชู‰ ุงู„ุขู†', - 'wallet.loadTradingRecordsFailed': 'ูุดู„ ููŠ ุชุญู…ูŠู„ ุณุฌู„ุงุช ุงู„ู…ุนุงู…ู„ุงุช', - 'wallet.loadMoneyLogFailed': 'ูุดู„ ููŠ ุชุญู…ูŠู„ ุชูุงุตูŠู„ ุงู„ุตู†ุฏูˆู‚', - 'wallet.moneyLogTotal': '{total} ุงู„ุณุฌู„ุงุช ููŠ ุงู„ู…ุฌู…ูˆุน', - 'wallet.moneyLogTypeTitle': 'ุงูƒุชุจ', - 'wallet.moneyLogType.all': 'ุฌู…ูŠุน ุงู„ุฃู†ูˆุงุน', - 'wallet.table.time': 'ุงู„ูˆู‚ุช', - 'wallet.table.type': 'ุงูƒุชุจ', - 'wallet.table.price': 'ุงู„ุณุนุฑ', - 'wallet.table.amount': 'ุงู„ูƒู…ูŠุฉ', - 'wallet.table.money': 'ุงู„ู…ุจู„ุบ', - 'wallet.table.balance': 'ุงู„ุชูˆุงุฒู†', - 'wallet.table.memo': 'ู…ู„ุงุญุธุงุช', - 'wallet.table.value': 'ู‚ูŠู…ุฉ', - 'wallet.table.profit': 'ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ', - 'wallet.table.commission': 'ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ', - 'wallet.table.total': '{total} ุงู„ุณุฌู„ุงุช ููŠ ุงู„ู…ุฌู…ูˆุน', - 'wallet.tradeType.buy': 'ุดุฑุงุก', - 'wallet.tradeType.sell': 'ุจูŠุน', - 'wallet.tradeType.liquidation': 'ุงู„ุชุตููŠุฉ ุงู„ู‚ุณุฑูŠุฉ', - 'wallet.tradeType.openLong': 'ู…ูุชูˆุญ ู„ูุชุฑุฉ ุทูˆูŠู„ุฉ', - 'wallet.tradeType.addLong': 'ุบุงุฏูˆุช', - 'wallet.tradeType.closeLong': 'ุจูŠู†ุฏูˆ', - 'wallet.tradeType.closeLongStop': 'ูˆู‚ู ุงู„ุฎุณุงุฑุฉ ูˆุทูˆูŠู„ุฉ', - 'wallet.tradeType.closeLongProfit': 'ุฌู†ูŠ ุงู„ุฑุจุญ ูˆู…ุณุชูˆู‰ ุฃูƒุซุฑ', - 'wallet.tradeType.openShort': 'ูุชุญ ู‚ุตูŠุฑุฉ', - 'wallet.tradeType.addShort': 'ุฅุถุงูุฉ ู‚ุตูŠุฑุฉ', - 'wallet.tradeType.closeShort': 'ูุงุฑุบ', - 'wallet.tradeType.closeShortStop': 'ูˆู‚ู ุงู„ุฎุณุงุฑุฉ', - 'wallet.tradeType.closeShortProfit': 'ุฌู†ูŠ ุงู„ุฃุฑุจุงุญ ูˆุฃุบู„ู‚ ุนู„ู‰ ุงู„ู…ูƒุดูˆู', - 'wallet.moneyLogType.purchase': 'ู…ุคุดุฑ ุงู„ุดุฑุงุก', - 'wallet.moneyLogType.recharge': 'ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'wallet.moneyLogType.withdraw': 'ุณุญุจ ุงู„ู†ู‚ูˆุฏ', - 'wallet.moneyLogType.refund': 'ุงุณุชุฑุฏุงุฏ', - 'wallet.moneyLogType.reward': 'ู…ูƒุงูุฃุฉ', - 'wallet.moneyLogType.income': 'ุงู„ุฏุฎู„', - 'wallet.moneyLogType.commission': 'ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ', - 'wallet.web3Address.required': 'ูŠุฑุฌู‰ ู…ู„ุก ุนู†ูˆุงู† ู…ุญูุธุฉ Web3 ุฃูˆู„ุงู‹', - 'wallet.web3Address.requiredDescription': 'ู‚ุจู„ ุฅุนุงุฏุฉ ุงู„ุดุญู†ุŒ ุชุญุชุงุฌ ุฅู„ู‰ ุฑุจุท ุนู†ูˆุงู† ู…ุญูุธุฉ Web3 ุงู„ุฎุงุต ุจูƒ ู„ุชู„ู‚ูŠ ุฅุนุงุฏุฉ ุงู„ุดุญู†.', - 'wallet.web3Address.placeholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู† ู…ุญูุธุฉ Web3 ุงู„ุฎุงุต ุจูƒ (ูŠุจุฏุฃ ุจู€ 0x)', - 'wallet.web3Address.save': 'ุญูุธ ุนู†ูˆุงู† ุงู„ู…ุญูุธุฉ', - 'wallet.web3Address.saveSuccess': 'ุชู… ุญูุธ ุนู†ูˆุงู† ุงู„ู…ุญูุธุฉ ุจู†ุฌุงุญ', - 'wallet.web3Address.saveFailed': 'ูุดู„ ููŠ ุญูุธ ุนู†ูˆุงู† ุงู„ู…ุญูุธุฉ', - 'wallet.web3Address.invalidFormat': 'ูŠุฑุฌู‰ ุฅุฏุฎุงู„ ุนู†ูˆุงู† ู…ุญูุธุฉ Web3 ุตุงู„ุญ (ุชู†ุณูŠู‚ Ethereum: 42 ุญุฑูู‹ุง ูŠุจุฏุฃ ุจู€ 0xุŒ ุฃูˆ ุชู†ุณูŠู‚ TRC20: 34 ุญุฑูู‹ุง ูŠุจุฏุฃ ุจู€ T)', - 'wallet.selectCoin': 'ุงุฎุชุฑ ุงู„ุนู…ู„ุฉ', - 'wallet.selectChain': 'ุณู„ุณู„ุฉ ุงู„ุงุฎุชูŠุงุฑ', - 'wallet.chain.eth': 'ุฅูŠุซุฑูŠูˆู… (ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'ุด.ู….ุจ', - 'wallet.targetQdtAmount': 'ู…ู‚ุฏุงุฑ QDT ุงู„ุฐูŠ ุชุฑูŠุฏ ุงุณุชุฑุฏุงุฏู‡ (ุงุฎุชูŠุงุฑูŠ)', - 'wallet.targetQdtAmount.placeholder': 'ูŠุฑุฌู‰ ุฅุฏุฎุงู„ ูƒู…ูŠุฉ QDT ุงู„ุชูŠ ุชุฑูŠุฏ ุงุณุชุฑุฏุงุฏู‡ุงุŒ ูˆุณุนุฑ QDT ุงู„ุญุงู„ูŠ: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'ุชุญุชุงุฌ ุฅู„ู‰ ุฅุนุงุฏุฉ ุงู„ุดุญู†: {amount} USDT', - 'wallet.rechargeAddress': 'ุนู†ูˆุงู† ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'wallet.copyAddress': 'ู†ุณุฎ', - 'wallet.copySuccess': 'ุชู… ุงู„ู†ุณุฎ ุจู†ุฌุงุญ!', - 'wallet.copyFailed': 'ูุดู„ ุงู„ู†ุณุฎุŒ ูŠุฑุฌู‰ ุงู„ู†ุณุฎ ูŠุฏูˆูŠู‹ุง', - 'wallet.rechargeAddressHint': 'ูŠุฑุฌู‰ ุงู„ุชุฃูƒุฏ ู…ู† ุงุณุชุฎุฏุงู… {chain} ู„ุฅูŠุฏุงุน {coin} ููŠ ู‡ุฐุง ุงู„ุนู†ูˆุงู†', - 'wallet.qdtPrice.loading': 'ุฌุงุฑ ุงู„ุชุญู…ูŠู„...', - 'wallet.rechargeTip.new': 'ูŠุฑุฌู‰ ุชุญุฏูŠุฏ ุงู„ุนู…ู„ุฉ ูˆุงู„ุณู„ุณู„ุฉุŒ ุซู… ู…ุณุญ ุฑู…ุฒ ุงู„ุงุณุชุฌุงุจุฉ ุงู„ุณุฑูŠุนุฉ ุฃุฏู†ุงู‡ ู„ุฅุนุงุฏุฉ ุงู„ุดุญู†', - 'wallet.exchangeRate': '1 QDT โ‰ˆ {ู…ุนุฏู„} USDT', - 'wallet.withdrawableAmount': 'ุงู„ู…ุจู„ุบ ุงู„ู†ู‚ุฏูŠ ุงู„ู…ุชุงุญ', - 'wallet.totalBalance': 'ุงู„ุฑุตูŠุฏ ุงู„ุฅุฌู…ุงู„ูŠ', - 'wallet.insufficientWithdrawable': 'ุงู„ู…ุจู„ุบ ุงู„ู†ู‚ุฏูŠ ุงู„ุฐูŠ ูŠู…ูƒู† ุณุญุจู‡ ุบูŠุฑ ูƒุงู. ุงู„ู…ุจู„ุบ ุงู„ุญุงู„ูŠ ุงู„ุฐูŠ ูŠู…ูƒู† ุณุญุจู‡ ู‡ูˆ: {amount} QDT', - 'wallet.withdrawAddressRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู† ุงู„ุณุญุจ', - 'wallet.withdrawAddressHint': 'ูŠุฑุฌู‰ ุงู„ุชุฃูƒุฏ ู…ู† ุตุญุฉ ุงู„ุนู†ูˆุงู†. ูˆุจุนุฏ ุงู„ุงู†ุณุญุงุจ ู„ุง ูŠู…ูƒู† ุฅู„ุบุงุคู‡.', - 'wallet.withdrawSubmitSuccess': 'ุชู… ุฅุฑุณุงู„ ุทู„ุจ ุงู„ุณุญุจ ุจู†ุฌุงุญุŒ ุจุฑุฌุงุก ุงู†ุชุธุงุฑ ุงู„ู…ุฑุงุฌุนุฉ', - 'menu.footer.contactUs': 'ุงุชุตู„ ุจู†ุง', - 'menu.footer.getSupport': 'ุงุญุตู„ ุนู„ู‰ ุงู„ุฏุนู…', - 'menu.footer.socialAccounts': 'ุญุณุงุจ ุงุฌุชู…ุงุนูŠ', - 'menu.footer.userAgreement': 'ุงุชูุงู‚ูŠุฉ ุงู„ู…ุณุชุฎุฏู…', - 'menu.footer.privacyPolicy': 'ุณูŠุงุณุฉ ุงู„ุฎุตูˆุตูŠุฉ', - 'menu.footer.support': 'ุงู„ุฏุนู…', - 'menu.footer.featureRequest': 'ุทู„ุจ ุงู„ู…ูŠุฒุฉ', - 'menu.footer.email': 'ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'menu.footer.liveChat': '24/7 ุงู„ุฏุฑุฏุดุฉ ุงู„ุญูŠุฉ', - 'dashboard.analysis.title': 'ุงู„ุชุญู„ูŠู„ ู…ุชุนุฏุฏ ุงู„ุฃุจุนุงุฏ', - 'dashboard.analysis.subtitle': 'ู…ู†ุตุฉ ุชุญู„ูŠู„ ู…ุงู„ูŠ ุดุงู…ู„ุฉ ุชุนุชู…ุฏ ุนู„ู‰ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'dashboard.analysis.selectSymbol': 'ุญุฏุฏ ุฃูˆ ุฃุฏุฎู„ ุงู„ุฑู…ุฒ ุงู„ุฃุณุงุณูŠ', - 'dashboard.analysis.selectModel': 'ุญุฏุฏ ุงู„ู†ู…ูˆุฐุฌ', - 'dashboard.analysis.startAnalysis': 'ุงุจุฏุฃ ุงู„ุชุญู„ูŠู„', - 'dashboard.analysis.history': 'ุงู„ุชุงุฑูŠุฎ', - 'dashboard.analysis.tab.overview': 'ุชุญู„ูŠู„ ุดุงู…ู„', - 'dashboard.analysis.tab.fundamental': 'ุงู„ุฃุณุงุณูŠุงุช', - 'dashboard.analysis.tab.technical': 'ุงู„ุชูƒู†ูˆู„ูˆุฌูŠุง', - 'dashboard.analysis.tab.news': 'ุฃุฎุจุงุฑ', - 'dashboard.analysis.tab.sentiment': 'ุงู„ุนูˆุงุทู', - 'dashboard.analysis.tab.risk': 'ุฎุทุฑ', - 'dashboard.analysis.tab.debate': 'ุงู„ู…ู†ุงู‚ุดุฉ ุงู„ุทูˆูŠู„ุฉ ูˆุงู„ู‚ุตูŠุฑุฉ', - 'dashboard.analysis.tab.decision': 'ุงู„ู‚ุฑุงุฑ ุงู„ู†ู‡ุงุฆูŠ', - 'dashboard.analysis.empty.selectSymbol': 'ุญุฏุฏ ู‡ุฏูู‹ุง ู„ุจุฏุก ุงู„ุชุญู„ูŠู„', - 'dashboard.analysis.empty.selectSymbolDesc': 'ุงุฎุชุฑ ู…ู† ู‚ุงุฆู…ุฉ ุงู„ุฃุณู‡ู… ุงู„ู…ุญุฏุฏุฉ ุฐุงุชูŠู‹ุง ุฃูˆ ุฃุฏุฎู„ ุงู„ูƒูˆุฏ ุงู„ุฃุณุงุณูŠ ู„ู„ุญุตูˆู„ ุนู„ู‰ ุชู‚ุฑูŠุฑ ุชุญู„ูŠู„ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ู…ุชุนุฏุฏ ุงู„ุฃุจุนุงุฏ', - 'dashboard.analysis.empty.startAnalysis': 'ุงู†ู‚ุฑ ููˆู‚ ุงู„ุฒุฑ "ุจุฏุก ุงู„ุชุญู„ูŠู„" ู„ุฅุฌุฑุงุก ุชุญู„ูŠู„ ู…ุชุนุฏุฏ ุงู„ุฃุจุนุงุฏ', - 'dashboard.analysis.empty.startAnalysisDesc': 'ุณู†ุฒูˆุฏูƒ ุจุชุญู„ูŠู„ ุดุงู…ู„ ู…ู† ุฃุจุนุงุฏ ู…ุชุนุฏุฏุฉ ู…ุซู„ ุงู„ุฃุณุงุณูŠุงุช ูˆุงู„ุชูƒู†ูˆู„ูˆุฌูŠุง ูˆุงู„ุฃุฎุจุงุฑ ูˆุงู„ู…ุดุงุนุฑ ูˆุงู„ู…ุฎุงุทุฑ', - 'dashboard.analysis.empty.noData': 'ู„ุง ุชูˆุฌุฏ ุญุงู„ูŠู‹ุง ุฃูŠ ุจูŠุงู†ุงุช ุชุญู„ูŠู„ {type}ุŒ ูŠุฑุฌู‰ ุฅุฌุฑุงุก ุชุญู„ูŠู„ ุดุงู…ู„ ุฃูˆู„ุงู‹', - 'dashboard.analysis.empty.noWatchlist': 'ู„ุง ูŠูˆุฌุฏ ุญุงู„ูŠุง ุฃูŠ ุฃุณู‡ู… ู…ุฎุชุงุฑุฉ ุฐุงุชูŠุง', - 'dashboard.analysis.empty.noHistory': 'ู„ุง ูŠูˆุฌุฏ ุชุงุฑูŠุฎ ุจุนุฏ', - 'dashboard.analysis.empty.watchlistHint': 'ู„ุง ูŠูˆุฌุฏ ุญุงู„ูŠุง ุฃูŠ ุฃุณู‡ู… ู…ุฎุชุงุฑุฉ ุฐุงุชูŠุงุŒ ูŠุฑุฌู‰ ุฃูˆู„ุง', - 'dashboard.analysis.empty.noDebateData': 'ู„ุง ุชูˆุฌุฏ ุจูŠุงู†ุงุช ู…ู†ุงู‚ุดุฉ ุญุชู‰ ุงู„ุขู†', - 'dashboard.analysis.empty.noDecisionData': 'ู„ุง ุชูˆุฌุฏ ุจูŠุงู†ุงุช ุงู„ู‚ุฑุงุฑ ุญุชู‰ ุงู„ุขู†', - 'dashboard.analysis.empty.selectAgent': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ูˆูƒูŠู„ ู„ุนุฑุถ ู†ุชุงุฆุฌ ุงู„ุชุญู„ูŠู„', - 'dashboard.analysis.loading.analyzing': 'ุฌุงุฑู ุงู„ุชุญู„ูŠู„ุŒ ูŠุฑุฌู‰ ุงู„ุงู†ุชุธุงุฑ...', - 'dashboard.analysis.loading.fundamental': 'ุชุญู„ูŠู„ ุงู„ุจูŠุงู†ุงุช ุงู„ุฃุณุงุณูŠุฉ...', - 'dashboard.analysis.loading.technical': 'ุชุญู„ูŠู„ ุงู„ู…ุคุดุฑุงุช ุงู„ูู†ูŠุฉ...', - 'dashboard.analysis.loading.news': 'ุชุญู„ูŠู„ ุจูŠุงู†ุงุช ุงู„ุฃุฎุจุงุฑ...', - 'dashboard.analysis.loading.sentiment': 'ุชุญู„ูŠู„ ู…ุนู†ูˆูŠุงุช ุงู„ุณูˆู‚..', - 'dashboard.analysis.loading.risk': 'ุชู‚ูŠูŠู… ุงู„ู…ุฎุงุทุฑ...', - 'dashboard.analysis.loading.debate': 'ูˆุงู„ู†ู‚ุงุด ุงู„ุทูˆูŠู„ ูˆุงู„ู‚ุตูŠุฑ ู…ุณุชู…ุฑ..', - 'dashboard.analysis.loading.decision': 'ุฅุตุฏุงุฑ ุงู„ู‚ุฑุงุฑ ุงู„ู†ู‡ุงุฆูŠ...', - 'dashboard.analysis.score.overall': 'ุงู„ุชู‚ูŠูŠู… ุงู„ุนุงู…', - 'dashboard.analysis.score.recommendation': 'ู†ุตูŠุญุฉ ุงุณุชุซู…ุงุฑูŠุฉ', - 'dashboard.analysis.score.confidence': 'ุงู„ุซู‚ุฉ', - 'dashboard.analysis.dimension.fundamental': 'ุงู„ุฃุณุงุณูŠุงุช', - 'dashboard.analysis.dimension.technical': 'ุงู„ุชูƒู†ูˆู„ูˆุฌูŠุง', - 'dashboard.analysis.dimension.news': 'ุฃุฎุจุงุฑ', - 'dashboard.analysis.dimension.sentiment': 'ุงู„ุนูˆุงุทู', - 'dashboard.analysis.dimension.risk': 'ุฎุทุฑ', - 'dashboard.analysis.card.dimensionScores': 'ุงู„ุชู‚ูŠูŠู…ุงุช ู„ูƒู„ ุงู„ุจุนุฏ', - 'dashboard.analysis.card.overviewReport': 'ุชู‚ุฑูŠุฑ ุงู„ุชุญู„ูŠู„ ุงู„ุดุงู…ู„', - 'dashboard.analysis.card.financialMetrics': 'ุงู„ู…ุคุดุฑุงุช ุงู„ู…ุงู„ูŠุฉ', - 'dashboard.analysis.card.fundamentalReport': 'ุชู‚ุฑูŠุฑ ุงู„ุชุญู„ูŠู„ ุงู„ุฃุณุงุณูŠ', - 'dashboard.analysis.card.technicalIndicators': 'ุงู„ู…ุคุดุฑุงุช ุงู„ูู†ูŠุฉ', - 'dashboard.analysis.card.technicalReport': 'ุชู‚ุฑูŠุฑ ุงู„ุชุญู„ูŠู„ ุงู„ูู†ูŠ', - 'dashboard.analysis.card.newsList': 'ุฃุฎุจุงุฑ ุฐุงุช ุตู„ุฉ', - 'dashboard.analysis.card.newsReport': 'ุชู‚ุฑูŠุฑ ุชุญู„ูŠู„ ุงู„ุฃุฎุจุงุฑ', - 'dashboard.analysis.card.sentimentIndicators': 'ู…ุคุดุฑ ุงู„ู…ุดุงุนุฑ', - 'dashboard.analysis.card.sentimentReport': 'ุชู‚ุฑูŠุฑ ุชุญู„ูŠู„ ุงู„ู…ุดุงุนุฑ', - 'dashboard.analysis.card.riskMetrics': 'ู…ุคุดุฑุงุช ุงู„ู…ุฎุงุทุฑ', - 'dashboard.analysis.card.riskReport': 'ุชู‚ุฑูŠุฑ ุชู‚ูŠูŠู… ุงู„ู…ุฎุงุทุฑ', - 'dashboard.analysis.card.bullView': 'ุงู„ู†ุธุฑุฉ ุงู„ุตุนูˆุฏูŠุฉ (ุงู„ุซูˆุฑ)', - 'dashboard.analysis.card.bearView': 'ูˆุฌู‡ุฉ ุงู„ู†ุธุฑ ุงู„ู‡ุจูˆุทูŠุฉ (ุงู„ุฏุจ)', - 'dashboard.analysis.card.researchConclusion': 'ุงุณุชู†ุชุงุฌ ุงู„ุจุงุญุซ', - 'dashboard.analysis.card.traderPlan': 'ุฎุทุฉ ุงู„ุชุงุฌุฑ', - 'dashboard.analysis.card.riskDebate': 'ู…ู†ุงู‚ุดุฉ ู„ุฌู†ุฉ ุงู„ู…ุฎุงุทุฑ', - 'dashboard.analysis.card.finalDecision': 'ุงู„ู‚ุฑุงุฑ ุงู„ู†ู‡ุงุฆูŠ', - 'dashboard.analysis.card.tradePlanDetail': 'ุชูุงุตูŠู„ ุฎุทุฉ ุงู„ุชุฏุงูˆู„', - 'dashboard.analysis.tradingPlan.entry_price': 'ุณุนุฑ ุงู„ู‚ุจูˆู„', - 'dashboard.analysis.tradingPlan.position_size': 'ุญุฌู… ุงู„ู…ูˆู‚ู', - 'dashboard.analysis.tradingPlan.stop_loss': 'ูˆู‚ู ุงู„ุฎุณุงุฑุฉ', - 'dashboard.analysis.tradingPlan.take_profit': 'ุฌู†ูŠ ุงู„ุฑุจุญ', - 'dashboard.analysis.label.confidence': 'ุงู„ุซู‚ุฉ', - 'dashboard.analysis.label.keyPoints': 'ุงู„ู†ู‚ุงุท ุงู„ุฃุณุงุณูŠุฉ', - 'dashboard.analysis.label.riskWarning': 'ุชุญุฐูŠุฑ ู…ู† ุงู„ู…ุฎุงุทุฑ', - 'dashboard.analysis.risk.risky': 'ู…ุญููˆู ุจุงู„ู…ุฎุงุทุฑ', - 'dashboard.analysis.risk.neutral': 'ูˆุฌู‡ุฉ ู†ุธุฑ ู…ุญุงูŠุฏุฉ (ู…ุญุงูŠุฏุฉ)', - 'dashboard.analysis.risk.safe': 'ูˆุฌู‡ุฉ ู†ุธุฑ ู…ุญุงูุธุฉ (ุขู…ู†ุฉ)', - 'dashboard.analysis.risk.conclusion': 'ุงู„ุงุณุชู†ุชุงุฌ', - 'dashboard.analysis.feature.fundamental': 'ุงู„ุชุญู„ูŠู„ ุงู„ุฃุณุงุณูŠ', - 'dashboard.analysis.feature.technical': 'ุงู„ุชุญู„ูŠู„ ุงู„ูู†ูŠ', - 'dashboard.analysis.feature.news': 'ุชุญู„ูŠู„ ุงู„ุฃุฎุจุงุฑ', - 'dashboard.analysis.feature.sentiment': 'ุชุญู„ูŠู„ ุงู„ู…ุดุงุนุฑ', - 'dashboard.analysis.feature.risk': 'ุชู‚ูŠูŠู… ุงู„ู…ุฎุงุทุฑ', - 'dashboard.analysis.watchlist.title': 'ุงุฎุชูŠุงุฑ ุงู„ุฃุณู‡ู… ุงู„ุฎุงุตุฉ ุจูŠ', - 'dashboard.analysis.watchlist.add': 'ุฅุถุงูุฉ', - 'dashboard.analysis.watchlist.addStock': 'ุฅุถุงูุฉ ู…ุฎุฒูˆู†', - 'dashboard.analysis.modal.addStock.title': 'ุฅุถุงูุฉ ุฃุณู‡ู… ุงุฎุชูŠุงุฑูŠุฉ', - 'dashboard.analysis.modal.addStock.confirm': 'ุญุณู†ู‹ุง', - 'dashboard.analysis.modal.addStock.cancel': 'ุฅู„ุบุงุก', - 'dashboard.analysis.modal.addStock.market': 'ู†ูˆุน ุงู„ุณูˆู‚', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ุณูˆู‚', - 'dashboard.analysis.modal.addStock.marketRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู†ูˆุน ุงู„ุณูˆู‚', - 'dashboard.analysis.modal.addStock.symbol': 'ุฑู…ุฒ ุงู„ู…ุฎุฒูˆู†', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„: AAPLุŒ TSLAุŒ GOOGLุŒ 000001ุŒ BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ู…ุฎุฒูˆู†', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'ุงู„ุจุญุซ ุนู† ุฑู…ุฒ ุงู„ู‡ุฏู ุฃูˆ ุงู„ุงุณู…', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'ุงุจุญุซ ุนู† ุงู„ุฑู…ุฒ ุงู„ุฃุณุงุณูŠ ุฃูˆ ุฃุฏุฎู„ู‡ (ุนู„ู‰ ุณุจูŠู„ ุงู„ู…ุซุงู„: AAPLุŒ BTC/USDTุŒ EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'ูŠุฏุนู… ุงู„ุจุญุซ ุนู† ุงู„ูƒุงุฆู†ุงุช ููŠ ู‚ุงุนุฏุฉ ุงู„ุจูŠุงู†ุงุชุŒ ุฃูˆ ุฅุฏุฎุงู„ ุงู„ูƒูˆุฏ ู…ุจุงุดุฑุฉ (ุณูŠุญุตู„ ุงู„ู†ุธุงู… ุนู„ู‰ ุงู„ุงุณู… ุชู„ู‚ุงุฆูŠู‹ุง)', - 'dashboard.analysis.modal.addStock.search': 'ุจุญุซ', - 'dashboard.analysis.modal.addStock.searchResults': 'ู†ุชุงุฆุฌ ุงู„ุจุญุซ', - 'dashboard.analysis.modal.addStock.hotSymbols': 'ุฃู‡ุฏุงู ุดุนุจูŠุฉ', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'ู„ุง ุชูˆุฌุฏ ุฃู‡ุฏุงู ุดุนุจูŠุฉ ุญุชู‰ ุงู„ุขู†', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'ู…ุฎุชุงุฑุฉ', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ู‡ุฏู ุฃูˆู„ุงู‹', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู‡ุฏู ุฃูˆ ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ู‡ุฏู ุฃูˆู„ุงู‹', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ู‡ุฏู', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู†ูˆุน ุงู„ุณูˆู‚ ุฃูˆู„ุง', - 'dashboard.analysis.modal.addStock.searchFailed': 'ูุดู„ ุงู„ุจุญุซุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ููŠ ูˆู‚ุช ู„ุงุญู‚', - 'dashboard.analysis.modal.addStock.noSearchResults': 'ู„ู… ูŠุชู… ุงู„ุนุซูˆุฑ ุนู„ู‰ ู‡ุฏู ู…ุทุงุจู‚', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'ุณูŠุญุตู„ ุงู„ู†ุธุงู… ุชู„ู‚ุงุฆูŠู‹ุง ุนู„ู‰ ุงู„ุงุณู…', - 'dashboard.analysis.modal.addStock.addDirectly': 'ุฃุถู ู…ุจุงุดุฑุฉ', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'ุณูŠุชู… ุงู„ุชู‚ุงุท ุงู„ุงุณู… ุชู„ู‚ุงุฆูŠู‹ุง ุนู†ุฏ ุฅุถุงูุชู‡', - 'dashboard.analysis.market.USStock': 'ุงู„ุฃุณู‡ู… ุงู„ุฃู…ุฑูŠูƒูŠุฉ', - 'dashboard.analysis.market.Crypto': 'ุนู…ู„ุฉ ู…ุดูุฑุฉ', - 'dashboard.analysis.market.Forex': 'ุงู„ููˆุฑูƒุณ', - 'dashboard.analysis.market.Futures': 'ุงู„ุนู‚ูˆุฏ ุงู„ุขุฌู„ุฉ', - 'dashboard.analysis.modal.history.title': 'ุณุฌู„ุงุช ุงู„ุชุญู„ูŠู„ ุงู„ุชุงุฑูŠุฎูŠ', - 'dashboard.analysis.modal.history.viewResult': 'ุนุฑุถ ุงู„ู†ุชุงุฆุฌ', - 'dashboard.analysis.modal.history.completeTime': 'ูˆู‚ุช ุงู„ุงู†ุชู‡ุงุก', - 'dashboard.analysis.modal.history.error': 'ุฎุทุฃ', - 'dashboard.analysis.status.pending': 'ููŠ ุงู†ุชุธุงุฑ', - 'dashboard.analysis.status.processing': 'ุงู„ู…ุนุงู„ุฌุฉ', - 'dashboard.analysis.status.completed': 'ู…ูƒุชู…ู„', - 'dashboard.analysis.status.failed': 'ูุดู„', - 'dashboard.analysis.message.selectSymbol': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ู‡ุฏู ุฃูˆู„ุง', - 'dashboard.analysis.message.taskCreated': 'ุชู… ุฅู†ุดุงุก ู…ู‡ู…ุฉ ุงู„ุชุญู„ูŠู„ ูˆูŠุชู… ุชู†ููŠุฐู‡ุง ููŠ ุงู„ุฎู„ููŠุฉ...', - 'dashboard.analysis.message.analysisComplete': 'ุงูƒุชู…ู„ ุงู„ุชุญู„ูŠู„', - 'dashboard.analysis.message.analysisCompleteCache': 'ุงูƒุชู…ู„ ุงู„ุชุญู„ูŠู„ (ุจุงุณุชุฎุฏุงู… ุงู„ุจูŠุงู†ุงุช ุงู„ู…ุฎุฒู†ุฉ ู…ุคู‚ุชู‹ุง)', - 'dashboard.analysis.message.analysisFailed': 'ูุดู„ ุงู„ุชุญู„ูŠู„ุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ููŠ ูˆู‚ุช ู„ุงุญู‚', - 'dashboard.analysis.message.addStockSuccess': 'ุชู…ุช ุงู„ุฅุถุงูุฉ ุจู†ุฌุงุญ', - 'dashboard.analysis.message.addStockFailed': 'ูุดู„ุช ุงู„ุฅุถุงูุฉ', - 'dashboard.analysis.message.removeStockSuccess': 'ุชู…ุช ุงู„ุฅุฒุงู„ุฉ ุจู†ุฌุงุญ', - 'dashboard.analysis.message.removeStockFailed': 'ูุดู„ุช ุนู…ู„ูŠุฉ ุงู„ุฅุฒุงู„ุฉ', - 'dashboard.analysis.message.resumingAnalysis': 'ุฌุงุฑูŠ ุงุณุชุฆู†ุงู ู…ู‡ู…ุฉ ุงู„ุชุญู„ูŠู„...', - 'dashboard.analysis.message.deleteSuccess': 'ุชู… ุงู„ุญุฐู ุจู†ุฌุงุญ', - 'dashboard.analysis.message.deleteFailed': 'ูุดู„ ุงู„ุญุฐู', - 'dashboard.analysis.modal.history.delete': 'ุญุฐู', - 'dashboard.analysis.modal.history.deleteConfirm': 'ู‡ู„ ุฃู†ุช ู…ุชุฃูƒุฏ ุฃู†ูƒ ุชุฑูŠุฏ ุญุฐู ุณุฌู„ ุงู„ุชุญู„ูŠู„ ู‡ุฐุงุŸ', - 'dashboard.analysis.test': 'ู…ุชุฌุฑ ุฑู‚ู… {no}ุŒ ุทุฑูŠู‚ Gongzhuan', - 'dashboard.analysis.introduce': 'ูˆุตู ุงู„ู…ุคุดุฑ', - 'dashboard.analysis.total-sales': 'ุฅุฌู…ุงู„ูŠ ุงู„ู…ุจูŠุนุงุช', - 'dashboard.analysis.day-sales': 'ู…ุชูˆุณุท ุงู„ู…ุจูŠุนุงุช ุงู„ูŠูˆู…ูŠุฉ๏ฟฅ', - 'dashboard.analysis.visits': 'ุงู„ุฒูŠุงุฑุงุช', - 'dashboard.analysis.visits-trend': 'ุงุชุฌุงู‡ุงุช ุงู„ู…ุฑูˆุฑ', - 'dashboard.analysis.visits-ranking': 'ุชุฑุชูŠุจ ุฒูŠุงุฑุฉ ุงู„ู…ุชุฌุฑ', - 'dashboard.analysis.day-visits': 'ุฒูŠุงุฑุงุช ูŠูˆู…ูŠุฉ', - 'dashboard.analysis.week': 'ุฃุณุจูˆุนูŠุฉ ุนู„ู‰ ุฃุณุงุณ ุณู†ูˆูŠ', - 'dashboard.analysis.day': 'ุณู†ุฉ ุจุนุฏ ุณู†ุฉ', - 'dashboard.analysis.payments': 'ุนุฏุฏ ุงู„ุฏูุนุงุช', - 'dashboard.analysis.conversion-rate': 'ู…ุนุฏู„ ุงู„ุชุญูˆูŠู„', - 'dashboard.analysis.operational-effect': 'ุขุซุงุฑ ุงู„ู†ุดุงุท ุงู„ุชุดุบูŠู„ูŠ', - 'dashboard.analysis.sales-trend': 'ุงุชุฌุงู‡ุงุช ุงู„ู…ุจูŠุนุงุช', - 'dashboard.analysis.sales-ranking': 'ุชุฑุชูŠุจ ู…ุจูŠุนุงุช ุงู„ู…ุชุฌุฑ', - 'dashboard.analysis.all-year': 'ุนู„ู‰ ู…ุฏุงุฑ ุงู„ุณู†ุฉ', - 'dashboard.analysis.all-month': 'ู‡ุฐุง ุงู„ุดู‡ุฑ', - 'dashboard.analysis.all-week': 'ู‡ุฐุง ุงู„ุงุณุจูˆุน', - 'dashboard.analysis.all-day': 'ุงู„ูŠูˆู…', - 'dashboard.analysis.search-users': 'ุนุฏุฏ ู…ุณุชุฎุฏู…ูŠ ุงู„ุจุญุซ', - 'dashboard.analysis.per-capita-search': 'ุนู…ู„ูŠุงุช ุงู„ุจุญุซ ู„ู„ูุฑุฏ', - 'dashboard.analysis.online-top-search': 'ุนู…ู„ูŠุงุช ุงู„ุจุญุซ ุงู„ุดุงุฆุนุฉ ุนู„ู‰ ุงู„ุฅู†ุชุฑู†ุช', - 'dashboard.analysis.the-proportion-of-sales': 'ู†ุณุจุฉ ูุฆุฉ ุงู„ู…ุจูŠุนุงุช', - 'dashboard.analysis.dropdown-option-one': 'ุงู„ุนู…ู„ูŠุฉ ุงู„ุฃูˆู„ู‰', - 'dashboard.analysis.dropdown-option-two': 'ุงู„ุนู…ู„ูŠุฉ 2', - 'dashboard.analysis.channel.all': 'ุฌู…ูŠุน ุงู„ู‚ู†ูˆุงุช', - 'dashboard.analysis.channel.online': 'ุนู„ู‰ ุงู„ุงู†ุชุฑู†ุช', - 'dashboard.analysis.channel.stores': 'ู…ุชุฌุฑ', - 'dashboard.analysis.sales': 'ุงู„ู…ุจูŠุนุงุช', - 'dashboard.analysis.traffic': 'ุชุฏูู‚ ุงู„ุฑูƒุงุจ', - 'dashboard.analysis.table.rank': 'ุงู„ุชุฑุชูŠุจ', - 'dashboard.analysis.table.search-keyword': 'ุงู„ุจุญุซ ุนู† ุงู„ูƒู„ู…ุงุช ุงู„ุฑุฆูŠุณูŠุฉ', - 'dashboard.analysis.table.users': 'ุนุฏุฏ ุงู„ู…ุณุชุฎุฏู…ูŠู†', - 'dashboard.analysis.table.weekly-range': 'ุฒูŠุงุฏุฉ ุฃุณุจูˆุนูŠุฉ', - 'dashboard.indicator.selectSymbol': 'ุญุฏุฏ ุฃูˆ ุฃุฏุฎู„ ุงู„ุฑู…ุฒ ุงู„ุฃุณุงุณูŠ', - 'dashboard.indicator.emptyWatchlistHint': 'ู„ุง ูŠูˆุฌุฏ ุญุงู„ูŠุง ุฃูŠ ุฃุณู‡ู… ู…ุฎุชุงุฑุฉ ุฐุงุชูŠุงุŒ ูŠุฑุฌู‰ ุฅุถุงูุชู‡ุง ุฃูˆู„ุง', - 'dashboard.indicator.hint.selectSymbol': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู‡ุฏู ู„ุจุฏุก ุงู„ุชุญู„ูŠู„', - 'dashboard.indicator.hint.selectSymbolDesc': 'ุญุฏุฏ ุฃูˆ ุฃุฏุฎู„ ุฑู…ุฒ ุงู„ุณู‡ู… ููŠ ู…ุฑุจุน ุงู„ุจุญุซ ุฃุนู„ุงู‡ ู„ุนุฑุถ ู…ุฎุทุทุงุช K-line ูˆุงู„ู…ุคุดุฑุงุช ุงู„ูู†ูŠุฉ', - 'dashboard.indicator.retry': 'ุญุงูˆู„ ู…ุฑุฉ ุฃุฎุฑู‰', - 'dashboard.indicator.panel.title': 'ุงู„ู…ุคุดุฑุงุช ุงู„ูู†ูŠุฉ', - 'dashboard.indicator.panel.realtimeOn': 'ู‚ู… ุจุฅูŠู‚ุงู ุชุดุบูŠู„ ุงู„ุชุญุฏูŠุซุงุช ููŠ ุงู„ูˆู‚ุช ุงู„ูุนู„ูŠ', - 'dashboard.indicator.panel.realtimeOff': 'ุชู…ูƒูŠู† ุงู„ุชุญุฏูŠุซุงุช ููŠ ุงู„ูˆู‚ุช ุงู„ุญู‚ูŠู‚ูŠ', - 'dashboard.indicator.panel.themeLight': 'ุงู„ุชุจุฏูŠู„ ุฅู„ู‰ ุงู„ู…ุธู‡ุฑ ุงู„ุฏุงูƒู†', - 'dashboard.indicator.panel.themeDark': 'ุงู„ุชุจุฏูŠู„ ุฅู„ู‰ ู…ูˆุถูˆุน ุงู„ุถูˆุก', - 'dashboard.indicator.section.enabled': 'ู…ู…ูƒู‘ู†', - 'dashboard.indicator.section.added': 'ุงู„ู…ุคุดุฑุงุช ุงู„ุชูŠ ุฃุถูุชู‡ุง', - 'dashboard.indicator.section.custom': 'ุงู„ู…ุคุดุฑุงุช ุงู„ุชูŠ ุฃู†ุดุฃุชู‡ุง ุจู†ูุณูƒ', - 'dashboard.indicator.section.bought': 'ุงู„ู…ุคุดุฑุงุช ุงู„ุชูŠ ุงุดุชุฑูŠุชู‡ุง', - 'dashboard.indicator.section.myCreated': 'ุงู„ู…ุคุดุฑุงุช ุงู„ุชูŠ ู‚ู…ุช ุจุฅู†ุดุงุฆู‡ุง', - 'dashboard.indicator.empty': 'ู„ุง ูŠูˆุฌุฏ ู…ุคุดุฑ ุญุชู‰ ุงู„ุขู†ุŒ ูŠุฑุฌู‰ ุฅุถุงูุฉ ุฃูˆ ุฅู†ุดุงุก ู…ุคุดุฑ ุฃูˆู„ุงู‹', - 'dashboard.indicator.buy': 'ู…ุคุดุฑ ุงู„ุดุฑุงุก', - 'dashboard.indicator.action.start': 'ุงุจุฏุฃ', - 'dashboard.indicator.action.stop': 'ุฅุบู„ุงู‚', - 'dashboard.indicator.action.edit': 'ุชุญุฑูŠุฑ', - 'dashboard.indicator.action.delete': 'ุญุฐู', - 'dashboard.indicator.action.backtest': 'com.backtest', - 'dashboard.indicator.status.normal': 'ุนุงุฏูŠ', - 'dashboard.indicator.status.normalPermanent': 'ุนุงุฏูŠ (ุตุงู„ุญ ุจุดูƒู„ ุฏุงุฆู…)', - 'dashboard.indicator.status.expired': 'ุงู†ุชู‡ุช ุตู„ุงุญูŠุชู‡ุง', - 'dashboard.indicator.expiry.permanent': 'ุตุงู„ุญุฉ ุจุดูƒู„ ุฏุงุฆู…', - 'dashboard.indicator.expiry.noExpiry': 'ู„ุง ูŠูˆุฌุฏ ูˆู‚ุช ุงู†ุชู‡ุงุก ุงู„ุตู„ุงุญูŠุฉ', - 'dashboard.indicator.expiry.expired': 'ุงู†ุชู‡ุช ุงู„ุตู„ุงุญูŠุฉ: {ุงู„ุชุงุฑูŠุฎ}', - 'dashboard.indicator.expiry.expiresOn': 'ูˆู‚ุช ุงู†ุชู‡ุงุก ุงู„ุตู„ุงุญูŠุฉ: {ุงู„ุชุงุฑูŠุฎ}', - 'dashboard.indicator.delete.confirmTitle': 'ุชุฃูƒูŠุฏ ุงู„ุญุฐู', - 'dashboard.indicator.delete.confirmContent': 'ู‡ู„ ุฃู†ุช ู…ุชุฃูƒุฏ ุฃู†ูƒ ุชุฑูŠุฏ ุญุฐู ุงู„ู…ุคุดุฑ "{name}"ุŸ ู‡ุฐู‡ ุงู„ุนู…ู„ูŠุฉ ู„ุง ุฑุฌุนุฉ ููŠู‡ุง.', - 'dashboard.indicator.delete.confirmOk': 'ุญุฐู', - 'dashboard.indicator.delete.confirmCancel': 'ุฅู„ุบุงุก', - 'dashboard.indicator.delete.success': 'ุชู… ุงู„ุญุฐู ุจู†ุฌุงุญ', - 'dashboard.indicator.delete.failed': 'ูุดู„ ุงู„ุญุฐู', - 'dashboard.indicator.save.success': 'ุชู… ุงู„ุญูุธ ุจู†ุฌุงุญ', - 'dashboard.indicator.save.failed': 'ูุดู„ ุงู„ุญูุธ', - 'dashboard.indicator.error.loadWatchlistFailed': 'ูุดู„ ุชุญู…ูŠู„ ุงู„ุฃุณู‡ู… ุงู„ุงุฎุชูŠุงุฑูŠุฉ', - 'dashboard.indicator.error.chartNotReady': 'ู„ู… ุชุชู… ุชู‡ูŠุฆุฉ ู…ูƒูˆู† ุงู„ู…ุฎุทุท. ูŠุฑุฌู‰ ุชุญุฏูŠุฏ ุงู„ู‡ุฏู ุฃูˆู„ุงู‹ ูˆุงู†ุชุธุฑ ุญุชู‰ ูŠุชู… ุชุญู…ูŠู„ ุงู„ู…ุฎุทุท.', - 'dashboard.indicator.error.chartMethodNotReady': 'ุทุฑูŠู‚ุฉ ู…ูƒูˆู† ุงู„ู…ุฎุทุท ู„ูŠุณุช ุฌุงู‡ุฒุฉุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ู„ุงุญู‚ู‹ุง', - 'dashboard.indicator.error.chartExecuteNotReady': 'ุทุฑูŠู‚ุฉ ุชู†ููŠุฐ ู…ูƒูˆู† ุงู„ุฑุณู… ุงู„ุจูŠุงู†ูŠ ู„ูŠุณุช ุฌุงู‡ุฒุฉุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ู„ุงุญู‚ู‹ุง', - 'dashboard.indicator.error.parseFailed': 'ุบูŠุฑ ู‚ุงุฏุฑ ุนู„ู‰ ุชุญู„ูŠู„ ูƒูˆุฏ ุจุงูŠุซูˆู†', - 'dashboard.indicator.error.parseFailedCheck': 'ุบูŠุฑ ู‚ุงุฏุฑ ุนู„ู‰ ุชุญู„ูŠู„ ูƒูˆุฏ ุจุงูŠุซูˆู†ุŒ ูŠุฑุฌู‰ ุงู„ุชุญู‚ู‚ ู…ู† ุชู†ุณูŠู‚ ุงู„ูƒูˆุฏ', - 'dashboard.indicator.error.addIndicatorFailed': 'ูุดู„ ููŠ ุฅุถุงูุฉ ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.error.runIndicatorFailed': 'ูุดู„ ู…ุคุดุฑ ุงู„ุชุดุบูŠู„', - 'dashboard.indicator.error.pleaseLogin': 'ุงู„ุฑุฌุงุก ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุฃูˆู„ุง', - 'dashboard.indicator.error.loadDataFailed': 'ูุดู„ ุชุญู…ูŠู„ ุงู„ุจูŠุงู†ุงุช', - 'dashboard.indicator.error.loadDataFailedDesc': 'ูŠุฑุฌู‰ ุงู„ุชุญู‚ู‚ ู…ู† ุงุชุตุงู„ ุงู„ุดุจูƒุฉ', - 'dashboard.indicator.error.pythonEngineFailed': 'ูุดู„ ู…ุญุฑูƒ Python ููŠ ุงู„ุชุญู…ูŠู„ ูˆู‚ุฏ ู„ุง ุชูƒูˆู† ูˆุธูŠูุฉ ุงู„ู…ุคุดุฑ ู…ุชุงุญุฉ.', - 'dashboard.indicator.error.chartInitFailed': 'ูุดู„ุช ุชู‡ูŠุฆุฉ ุงู„ู…ุฎุทุท', - 'dashboard.indicator.warning.enterCode': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ู…ุคุดุฑ ุฃูˆู„ุง', - 'dashboard.indicator.warning.pyodideLoadFailed': 'ูุดู„ ู…ุญุฑูƒ ุจุงูŠุซูˆู† ููŠ ุงู„ุชุญู…ูŠู„', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'ู‡ุฐู‡ ุงู„ู…ูŠุฒุฉ ุบูŠุฑ ู…ุชูˆูุฑุฉ ููŠ ู…ู†ุทู‚ุชูƒ ุงู„ุญุงู„ูŠุฉ ุฃูˆ ุจูŠุฆุฉ ุงู„ุดุจูƒุฉ ุงู„ุญุงู„ูŠุฉ', - 'dashboard.indicator.warning.chartNotInitialized': 'ู„ู… ุชุชู… ุชู‡ูŠุฆุฉ ุงู„ู…ุฎุทุท ูˆู„ุง ูŠู…ูƒู† ุงุณุชุฎุฏุงู… ุฃุฏุงุฉ ุฑุณู… ุงู„ุฎุท.', - 'dashboard.indicator.success.runIndicator': 'ูŠุนู…ู„ ุงู„ู…ุคุดุฑ ุจู†ุฌุงุญ', - 'dashboard.indicator.success.clearDrawings': 'ุชู… ู…ุณุญ ูƒุงูุฉ ุงู„ุฑุณูˆู…ุงุช ุงู„ุฎุทูŠุฉ', - 'dashboard.indicator.sma': 'SMA (ู…ุฌู…ูˆุนุฉ ุงู„ู…ุชูˆุณุทุงุช ุงู„ู…ุชุญุฑูƒุฉ)', - 'dashboard.indicator.ema': 'EMA (ู…ุฌู…ูˆุนุฉ ุงู„ู…ุชูˆุณุท ุงู„ู…ุชุญุฑูƒ ุงู„ุฃุณูŠ)', - 'dashboard.indicator.rsi': 'ู…ุคุดุฑ ุงู„ู‚ูˆุฉ ุงู„ู†ุณุจูŠุฉ (ุงู„ู‚ูˆุฉ ุงู„ู†ุณุจูŠุฉ)', - 'dashboard.indicator.macd': 'ู…ุงูƒุฏ', - 'dashboard.indicator.bb': 'ุจูˆู„ูŠู†ุฌุฑ ุจุงู†ุฏ', - 'dashboard.indicator.atr': 'ATR (ู…ุชูˆุณุท ุงู„ู…ุฏู‰ ุงู„ุญู‚ูŠู‚ูŠ)', - 'dashboard.indicator.cci': 'CCI (ู…ุคุดุฑ ู‚ู†ุงุฉ ุงู„ุณู„ุน)', - 'dashboard.indicator.williams': 'ูˆูŠู„ูŠุงู…ุฒ %R (ู…ุคุดุฑ ูˆูŠู„ูŠุงู…ุฒ)', - 'dashboard.indicator.mfi': 'ู…ุคุณุณุงุช ุงู„ุชู…ูˆูŠู„ ุงู„ุฃุตุบุฑ (ู…ุคุดุฑ ุชุฏูู‚ ุงู„ุฃู…ูˆุงู„)', - 'dashboard.indicator.adx': 'ADX (ู…ุคุดุฑ ุงู„ุงุชุฌุงู‡ ุงู„ู…ุชูˆุณุท)', - 'dashboard.indicator.obv': 'OBV (ู…ูˆุฌุฉ ุงู„ุทุงู‚ุฉ)', - 'dashboard.indicator.adosc': 'ADOSC (ู…ุฐุจุฐุจ ุงู„ุชุฌู…ูŠุน/ุงู„ุฅุฑุณุงู„)', - 'dashboard.indicator.ad': 'AD (ุฎุท ุงู„ุชุฌู…ูŠุน/ุงู„ุชูˆุฒูŠุน)', - 'dashboard.indicator.kdj': 'KDJ (ู…ุคุดุฑ ุณุชูˆูƒุงุณุชูŠูƒ)', - 'dashboard.indicator.signal.buy': 'ุดุฑุงุก', - 'dashboard.indicator.signal.sell': 'ุจูŠุน', - 'dashboard.indicator.signal.supertrendBuy': 'ุดุฑุงุก ุณูˆุจุฑ ุชุฑูŠู†ุฏ', - 'dashboard.indicator.signal.supertrendSell': 'ุจูŠุน ุณูˆุจุฑ ุชุฑูŠู†ุฏ', - 'dashboard.indicator.chart.kline': 'ุฎุท K', - 'dashboard.indicator.chart.volume': 'ุงู„ุญุฌู…', - 'dashboard.indicator.chart.uptrend': 'ุงู„ุงุชุฌุงู‡ ุงู„ุตุนูˆุฏูŠ', - 'dashboard.indicator.chart.downtrend': 'ุงู„ุงุชุฌุงู‡ ุงู„ู‡ุงุจุท', - 'dashboard.indicator.tooltip.time': 'ุงู„ูˆู‚ุช', - 'dashboard.indicator.tooltip.open': 'ู…ูุชูˆุญ', - 'dashboard.indicator.tooltip.close': 'ุชู„ู‚ูŠ', - 'dashboard.indicator.tooltip.high': 'ุนุงู„ูŠุฉ', - 'dashboard.indicator.tooltip.low': 'ู…ู†ุฎูุถ', - 'dashboard.indicator.tooltip.volume': 'ุงู„ุญุฌู…', - 'dashboard.indicator.drawing.line': 'ู‚ุทุนุฉ ุงู„ุฎุท', - 'dashboard.indicator.drawing.horizontalLine': 'ุฎุท ุฃูู‚ูŠ', - 'dashboard.indicator.drawing.verticalLine': 'ุฎุท ุนู…ูˆุฏูŠ', - 'dashboard.indicator.drawing.ray': 'ุฑุงูŠ', - 'dashboard.indicator.drawing.straightLine': 'ุฎุท ู…ุณุชู‚ูŠู…', - 'dashboard.indicator.drawing.parallelLine': 'ุฎุทูˆุท ู…ุชูˆุงุฒูŠุฉ', - 'dashboard.indicator.drawing.priceLine': 'ุฎุท ุงู„ุณุนุฑ', - 'dashboard.indicator.drawing.priceChannel': 'ู‚ู†ุงุฉ ุงู„ุณุนุฑ', - 'dashboard.indicator.drawing.fibonacciLine': 'ุฎุทูˆุท ููŠุจูˆู†ุงุชุดูŠ', - 'dashboard.indicator.drawing.clearAll': 'ู…ุณุญ ูƒุงูุฉ ุงู„ุฑุณูˆู…ุงุช ุงู„ุฎุทูŠุฉ', - 'dashboard.indicator.market.USStock': 'ุงู„ุฃุณู‡ู… ุงู„ุฃู…ุฑูŠูƒูŠุฉ', - 'dashboard.indicator.market.Crypto': 'ุนู…ู„ุฉ ู…ุดูุฑุฉ', - 'dashboard.indicator.market.Forex': 'ุงู„ููˆุฑูƒุณ', - 'dashboard.indicator.market.Futures': 'ุงู„ุนู‚ูˆุฏ ุงู„ุขุฌู„ุฉ', - 'dashboard.indicator.create': 'ุฅู†ุดุงุก ู…ุคุดุฑ', - 'dashboard.indicator.editor.title': 'ุฅู†ุดุงุก/ุชุญุฑูŠุฑ ุงู„ู…ุคุดุฑุงุช', - 'dashboard.indicator.editor.name': 'ุงุณู… ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.editor.nameRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงุณู… ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.editor.namePlaceholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงุณู… ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.editor.description': 'ูˆุตู ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.editor.descriptionPlaceholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ูˆุตู ู„ู„ู…ุคุดุฑ (ุงุฎุชูŠุงุฑูŠ)', - 'dashboard.indicator.editor.code': 'ูƒูˆุฏ ุจุงูŠุซูˆู†', - 'dashboard.indicator.editor.codeRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.editor.codePlaceholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุจุงูŠุซูˆู†', - 'dashboard.indicator.editor.run': 'ุชุดุบูŠู„', - 'dashboard.indicator.editor.runHint': 'ุงู†ู‚ุฑ ููˆู‚ ุฒุฑ ุงู„ุชุดุบูŠู„ ู„ู…ุนุงูŠู†ุฉ ุชุฃุซูŠุฑ ุงู„ู…ุคุดุฑ ุนู„ู‰ ู…ุฎุทุท K-line', - 'dashboard.indicator.editor.guide': 'ุฏู„ูŠู„ ุงู„ุชุทูˆูŠุฑ', - 'dashboard.indicator.editor.guideTitle': 'ุฏู„ูŠู„ ุชุทูˆูŠุฑ ู…ุคุดุฑ ุจุงูŠุซูˆู†', - 'dashboard.indicator.editor.save': 'ุญูุธ', - 'dashboard.indicator.editor.cancel': 'ุฅู„ุบุงุก', - 'dashboard.indicator.editor.unnamed': 'ู…ุคุดุฑ ุจุฏูˆู† ุงุณู…', - 'dashboard.indicator.editor.publishToCommunity': 'ู†ุดุฑ ุฅู„ู‰ ุงู„ู…ุฌุชู…ุน', - 'dashboard.indicator.editor.publishToCommunityHint': 'ุจู…ุฌุฑุฏ ุงู„ู†ุดุฑุŒ ูŠู…ูƒู† ู„ู„ู…ุณุชุฎุฏู…ูŠู† ุงู„ุขุฎุฑูŠู† ุนุฑุถ ูˆุงุณุชุฎุฏุงู… ุงู„ู…ุคุดุฑ ุงู„ุฎุงุต ุจูƒ ููŠ ุงู„ู…ุฌุชู…ุน', - 'dashboard.indicator.editor.indicatorType': 'ู†ูˆุน ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.editor.indicatorTypeRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู†ูˆุน ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู†ูˆุน ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.editor.previewImage': 'ู…ุนุงูŠู†ุฉ', - 'dashboard.indicator.editor.uploadImage': 'ุชุญู…ูŠู„ ุงู„ุตูˆุฑ', - 'dashboard.indicator.editor.previewImageHint': 'ุงู„ุญุฌู… ุงู„ู…ูˆุตู‰ ุจู‡: 800ร—400ุŒ ูˆู„ุง ูŠุฒูŠุฏ ุนู† 2 ู…ูŠุฌุงุจุงูŠุช', - 'dashboard.indicator.editor.pricing': 'ุณุนุฑ ุงู„ุจูŠุน (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'ู…ุฌุงู†ุง', - 'dashboard.indicator.editor.pricingType.permanent': 'ุฏุงุฆู…', - 'dashboard.indicator.editor.pricingType.monthly': 'ุงู„ุฏูุน ุงู„ุดู‡ุฑูŠ', - 'dashboard.indicator.editor.price': 'ุงู„ุณุนุฑ', - 'dashboard.indicator.editor.priceRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ุณุนุฑ', - 'dashboard.indicator.editor.pricePlaceholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ุณุนุฑ', - 'dashboard.indicator.editor.pricingHint': 'ุนู„ู‰ ุงู„ุฑุบู… ู…ู† ุฃู† ุณุนุฑ ุงู„ู…ุคุดุฑุงุช ุงู„ู…ุฌุงู†ูŠุฉ ู‡ูˆ 0ุŒ ุฅู„ุง ุฃู† ุงู„ู…ู†ุตุฉ ุณุชูƒุงูุฆูƒ (QDT) ุจู†ุงุกู‹ ุนู„ู‰ ุงุณุชุฎุฏุงู… ุงู„ู…ุคุดุฑ ุงู„ุฎุงุต ุจูƒ ูˆู…ุนุฏู„ ุงู„ุซู†ุงุก.', - 'dashboard.indicator.editor.aiGenerate': 'ุฌูŠู„ ุฐูƒูŠ', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'ุฃุฎุจุฑู†ูŠ ุจุฃููƒุงุฑูƒ ูˆุณุฃู‚ูˆู… ุจุฅู†ุดุงุก ุฑู…ุฒ ู…ุคุดุฑ ุจุงูŠุซูˆู† ู„ูƒ', - 'dashboard.indicator.editor.aiGenerateBtn': 'ูƒูˆุฏ ุชู… ุฅู†ุดุงุคู‡ ุจูˆุงุณุทุฉ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'dashboard.indicator.editor.aiPromptRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฃููƒุงุฑูƒ', - 'dashboard.indicator.editor.aiGenerateSuccess': 'ุชู… ุฅู†ุดุงุก ุงู„ูƒูˆุฏ ุจู†ุฌุงุญ', - 'dashboard.indicator.editor.aiGenerateError': 'ูุดู„ ุฅู†ุดุงุก ุงู„ูƒูˆุฏุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ู„ุงุญู‚ู‹ุง', - 'dashboard.indicator.backtest.title': 'ุงุฎุชุจุงุฑ ุฎู„ููŠ ู„ู„ู…ุคุดุฑ', - 'dashboard.indicator.backtest.config': 'ู…ุนู„ู…ุงุช ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ', - 'dashboard.indicator.backtest.startDate': 'ุชุงุฑูŠุฎ ุงู„ุจุฏุก', - 'dashboard.indicator.backtest.endDate': 'ุชุงุฑูŠุฎ ุงู„ุงู†ุชู‡ุงุก', - 'dashboard.indicator.backtest.selectStartDate': 'ุญุฏุฏ ุชุงุฑูŠุฎ ุงู„ุจุฏุก', - 'dashboard.indicator.backtest.selectEndDate': 'ุญุฏุฏ ุชุงุฑูŠุฎ ุงู„ุงู†ุชู‡ุงุก', - 'dashboard.indicator.backtest.startDateRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุชุงุฑูŠุฎ ุงู„ุจุฏุก', - 'dashboard.indicator.backtest.endDateRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุชุงุฑูŠุฎ ุงู„ุงู†ุชู‡ุงุก', - 'dashboard.indicator.backtest.initialCapital': 'ุฑุฃุณ ุงู„ู…ุงู„ ุงู„ุฃูˆู„ูŠ', - 'dashboard.indicator.backtest.initialCapitalRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ุฃู…ูˆุงู„ ุงู„ุฃูˆู„ูŠุฉ', - 'dashboard.indicator.backtest.commission': 'ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ', - 'dashboard.indicator.backtest.leverage': 'ู†ุณุจุฉ ุงู„ุฑุงูุนุฉ ุงู„ู…ุงู„ูŠุฉ', - 'dashboard.indicator.backtest.tradeDirection': 'ุงุชุฌุงู‡ ุงู„ุชุฏุงูˆู„', - 'dashboard.indicator.backtest.longOnly': 'ุงุฐู‡ุจ ู„ูุชุฑุฉ ุทูˆูŠู„ุฉ', - 'dashboard.indicator.backtest.shortOnly': 'ู‚ุตูŠุฑุฉ', - 'dashboard.indicator.backtest.both': 'ููŠ ุงุชุฌุงู‡ูŠู†', - 'dashboard.indicator.backtest.run': 'ุงุจุฏุฃ ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ', - 'dashboard.indicator.backtest.rerun': 'ุจุงูƒ ุชุณุช ู…ุฑุฉ ุฃุฎุฑู‰', - 'dashboard.indicator.backtest.close': 'ุฅุบู„ุงู‚', - 'dashboard.indicator.backtest.running': 'ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ ู„ู„ู…ุคุดุฑ ู‚ูŠุฏ ุงู„ุชู‚ุฏู…...', - 'dashboard.indicator.backtest.results': 'ู†ุชุงุฆุฌ ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ', - 'dashboard.indicator.backtest.totalReturn': 'ุงู„ุนุงุฆุฏ ุงู„ุฅุฌู…ุงู„ูŠ', - 'dashboard.indicator.backtest.annualReturn': 'ุงู„ุฏุฎู„ ุงู„ุณู†ูˆูŠ', - 'dashboard.indicator.backtest.maxDrawdown': 'ุงู„ุญุฏ ุงู„ุฃู‚ุตู‰ ู„ู„ุณุญุจ', - 'dashboard.indicator.backtest.sharpeRatio': 'ู†ุณุจุฉ ุดุงุฑุจ', - 'dashboard.indicator.backtest.winRate': 'ู…ุนุฏู„ ุงู„ููˆุฒ', - 'dashboard.indicator.backtest.profitFactor': 'ู†ุณุจุฉ ุงู„ุฑุจุญ ุฅู„ู‰ ุงู„ุฎุณุงุฑุฉ', - 'dashboard.indicator.backtest.totalTrades': 'ุนุฏุฏ ุงู„ู…ุนุงู…ู„ุงุช', - 'dashboard.indicator.totalReturn': 'ุงู„ุนุงุฆุฏ ุงู„ุฅุฌู…ุงู„ูŠ', - 'dashboard.indicator.annualReturn': 'ู…ุนุฏู„ ุงู„ุนุงุฆุฏ ุงู„ุณู†ูˆูŠ', - 'dashboard.indicator.maxDrawdown': 'ุงู„ุญุฏ ุงู„ุฃู‚ุตู‰ ู„ู„ุณุญุจ', - 'dashboard.indicator.sharpeRatio': 'ู†ุณุจุฉ ุดุงุฑุจ', - 'dashboard.indicator.winRate': 'ู…ุนุฏู„ ุงู„ููˆุฒ', - 'dashboard.indicator.profitFactor': 'ู†ุณุจุฉ ุงู„ุฑุจุญ ุฅู„ู‰ ุงู„ุฎุณุงุฑุฉ', - 'dashboard.indicator.totalTrades': 'ุฅุฌู…ุงู„ูŠ ุนุฏุฏ ุงู„ู…ุนุงู…ู„ุงุช', - 'dashboard.indicator.backtest.totalCommission': 'ุฅุฌู…ุงู„ูŠ ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ', - 'dashboard.indicator.backtest.equityCurve': 'ู…ู†ุญู†ู‰ ุงู„ุนุงุฆุฏ', - 'dashboard.indicator.backtest.strategy': 'ุฏุฎู„ ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.backtest.benchmark': 'ุงู„ุนูˆุฏุฉ ุงู„ู…ุฑุฌุนูŠุฉ', - 'dashboard.indicator.backtest.tradeHistory': 'ุชุงุฑูŠุฎ ุงู„ู…ุนุงู…ู„ุฉ', - 'dashboard.indicator.backtest.tradeTime': 'ุงู„ูˆู‚ุช', - 'dashboard.indicator.backtest.tradeType': 'ุงูƒุชุจ', - 'dashboard.indicator.backtest.buy': 'ุดุฑุงุก', - 'dashboard.indicator.backtest.sell': 'ุจูŠุน', - 'dashboard.indicator.backtest.liquidation': 'ุงู„ุชุตููŠุฉ', - 'dashboard.indicator.backtest.openLong': 'ู…ูุชูˆุญ ู„ูุชุฑุฉ ุทูˆูŠู„ุฉ', - 'dashboard.indicator.backtest.closeLong': 'ุจูŠู†ุฏูˆ', - 'dashboard.indicator.backtest.closeLongStop': 'ู‚ุฑูŠุจ ู…ู† ุงู„ุดุฑุงุก (ูˆู‚ู ุงู„ุฎุณุงุฑุฉ)', - 'dashboard.indicator.backtest.closeLongProfit': 'ุฅุบู„ุงู‚ ุงู„ู…ุฒูŠุฏ (ุฌู†ูŠ ุงู„ุฃุฑุจุงุญ)', - 'dashboard.indicator.backtest.addLong': 'ุฅุถุงูุฉ ู…ูˆู‚ู ุทูˆูŠู„', - 'dashboard.indicator.backtest.openShort': 'ูุชุญ ู‚ุตูŠุฑุฉ', - 'dashboard.indicator.backtest.closeShort': 'ูุงุฑุบ', - 'dashboard.indicator.backtest.closeShortStop': 'ุฅุบู„ุงู‚ (ูˆู‚ู ุงู„ุฎุณุงุฑุฉ)', - 'dashboard.indicator.backtest.closeShortProfit': 'ุฅุบู„ุงู‚ (ุฌู†ูŠ ุงู„ุฃุฑุจุงุญ)', - 'dashboard.indicator.backtest.addShort': 'ุฅุถุงูุฉ ู…ูˆู‚ู ู‚ุตูŠุฑ', - 'dashboard.indicator.backtest.price': 'ุงู„ุณุนุฑ', - 'dashboard.indicator.backtest.amount': 'ุงู„ูƒู…ูŠุฉ', - 'dashboard.indicator.backtest.balance': 'ุฑุตูŠุฏ ุงู„ุญุณุงุจ', - 'dashboard.indicator.backtest.profit': 'ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ', - 'dashboard.indicator.backtest.success': 'ุชู… ุงู„ุงู†ุชู‡ุงุก ู…ู† ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ', - 'dashboard.indicator.backtest.failed': 'ูุดู„ ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ู„ุงุญู‚ู‹ุง', - 'dashboard.indicator.backtest.noIndicatorCode': 'ู„ุง ูŠูˆุฌุฏ ุฑู…ุฒ ู‚ุงุจู„ ู„ู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ ู„ู‡ุฐุง ุงู„ู…ุคุดุฑ', - 'dashboard.indicator.backtest.noSymbol': 'ูŠุฑุฌู‰ ุชุญุฏูŠุฏ ู‡ุฏู ุงู„ู…ุนุงู…ู„ุฉ ุฃูˆู„ุงู‹', - 'dashboard.indicator.backtest.dateRangeExceeded': 'ูŠุชุฌุงูˆุฒ ุงู„ู†ุทุงู‚ ุงู„ุฒู…ู†ูŠ ู„ู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ ุงู„ุญุฏ ุงู„ุฃู‚ุตู‰: ูŠู…ูƒู† ุงุฎุชุจุงุฑ ุงู„ูุชุฑุฉ ุงู„ุฒู…ู†ูŠุฉ {timeframe} ุจุญุฏ ุฃู‚ุตู‰ {maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'ู…ุฑูƒุฒ ุงู„ูˆุซุงุฆู‚', - 'dashboard.docs.search.placeholder': 'ุจุญุซ ููŠ ุงู„ู…ุณุชู†ุฏุงุช...', - 'dashboard.docs.category.all': 'ุงู„ูƒู„', - 'dashboard.docs.category.guide': 'ุฏู„ูŠู„ ุงู„ุชุทูˆูŠุฑ', - 'dashboard.docs.category.api': 'ูˆุซุงุฆู‚ ูˆุงุฌู‡ุฉ ุจุฑู…ุฌุฉ ุงู„ุชุทุจูŠู‚ุงุช', - 'dashboard.docs.category.tutorial': 'ุงู„ุจุฑู†ุงู…ุฌ ุงู„ุชุนู„ูŠู…ูŠ', - 'dashboard.docs.category.faq': 'ุงู„ุฃุณุฆู„ุฉ ุงู„ุดุงุฆุนุฉ', - 'dashboard.docs.featured.title': 'ุงู„ูˆุซุงุฆู‚ ุงู„ู…ูˆุตู‰ ุจู‡ุง', - 'dashboard.docs.featured.tag': 'ู…ูˆุตู‰ ุจู‡', - 'dashboard.docs.list.views': 'ุชุตูุญ', - 'dashboard.docs.list.author': 'ุงู„ู…ุคู„ู', - 'dashboard.docs.list.empty': 'ู„ุง ุชูˆุฌุฏ ูˆุซูŠู‚ุฉ ุจุนุฏ', - 'dashboard.docs.list.backToAll': 'ุงู„ุนูˆุฏุฉ ุฅู„ู‰ ุฌู…ูŠุน ุงู„ูˆุซุงุฆู‚', - 'dashboard.docs.list.total': '{count} ู…ู† ุงู„ู…ุณุชู†ุฏุงุช ููŠ ุงู„ู…ุฌู…ูˆุน', - 'dashboard.docs.detail.back': 'ุงู„ุนูˆุฏุฉ ุฅู„ู‰ ู‚ุงุฆู…ุฉ ุงู„ู…ุณุชู†ุฏุงุช', - 'dashboard.docs.detail.updatedAt': 'ุชู… ุงู„ุชุญุฏูŠุซ ุนู„ู‰', - 'dashboard.docs.detail.related': 'ุงู„ูˆุซุงุฆู‚ ุฐุงุช ุงู„ุตู„ุฉ', - 'dashboard.docs.detail.notFound': 'ุงู„ูˆุซูŠู‚ุฉ ุบูŠุฑ ู…ูˆุฌูˆุฏุฉ', - 'dashboard.docs.detail.error': 'ุงู„ู…ุณุชู†ุฏ ุบูŠุฑ ู…ูˆุฌูˆุฏ ุฃูˆ ุชู… ุญุฐูู‡', - 'dashboard.docs.search.result': 'ู†ุชุงุฆุฌ ุงู„ุจุญุซ', - 'dashboard.docs.search.keyword': 'ุงู„ูƒู„ู…ุงุช ุงู„ุฑุฆูŠุณูŠุฉ', - 'community.filter.indicatorType': 'ู†ูˆุน ุงู„ู…ุคุดุฑ', - 'community.filter.all': 'ุงู„ูƒู„', - 'community.filter.other': 'ุฎูŠุงุฑุงุช ุฃุฎุฑู‰', - 'community.filter.pricing': 'ู†ูˆุน ุงู„ุชุณุนูŠุฑ', - 'community.filter.allPricing': 'ุฌู…ูŠุน ุงู„ุชุณุนูŠุฑ', - 'community.filter.sortBy': 'ุงู„ุชุฑุชูŠุจ ุญุณุจ', - 'community.filter.search': 'ุจุญุซ', - 'community.filter.searchPlaceholder': 'ุงู„ุจุญุซ ุนู† ุงุณู… ุงู„ู…ู‚ูŠุงุณ', - 'community.indicatorType.trend': 'ู†ูˆุน ุงู„ุงุชุฌุงู‡', - 'community.indicatorType.momentum': 'ู†ูˆุน ุงู„ุฒุฎู…', - 'community.indicatorType.volatility': 'ุงู„ุชู‚ู„ุจ', - 'community.indicatorType.volume': 'ุงู„ุญุฌู…', - 'community.indicatorType.custom': 'ุชุฎุตูŠุต', - 'community.pricing.free': 'ู…ุฌุงู†ุง', - 'community.pricing.paid': 'ุงุฏูุน', - 'community.sort.downloads': 'ุงู„ุชู†ุฒูŠู„ุงุช', - 'community.sort.rating': 'ุงู„ุชู‚ูŠูŠู…', - 'community.sort.newest': 'ุฃุญุฏุซ ุงู„ุฅุตุฏุงุฑุงุช', - 'community.pagination.total': '{total} ู…ุคุดุฑุงุช ููŠ ุงู„ู…ุฌู…ูˆุน', - 'community.noDescription': 'ู„ุง ูŠูˆุฌุฏ ูˆุตู ุจุนุฏ', - 'community.detail.type': 'ุงูƒุชุจ', - 'community.detail.pricing': 'ุงู„ุชุณุนูŠุฑ', - 'community.detail.rating': 'ุงู„ุชู‚ูŠูŠู…', - 'community.detail.downloads': 'ุงู„ุชู†ุฒูŠู„ุงุช', - 'community.detail.author': 'ุงู„ู…ุคู„ู', - 'community.detail.description': 'ู…ู‚ุฏู…ุฉ', - 'community.detail.detailContent': 'ูˆุตู ุชูุตูŠู„ูŠ', - 'community.detail.backtestStats': 'ุฅุญุตุงุฆูŠุงุช ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ', - 'community.action.purchase': 'ู…ุคุดุฑ ุงู„ุดุฑุงุก', - 'community.action.addToMyIndicators': 'ุฃุถู ุฅู„ู‰ ู…ุคุดุฑุงุชูŠ', - 'community.action.favorite': 'ุงู„ู…ุฌู…ูˆุนุฉ', - 'community.action.unfavorite': 'ุฅู„ุบุงุก ุงู„ู…ูุถู„ุฉ', - 'community.action.buyNow': 'ุงุดุชุฑูŠ ุงู„ุขู†', - 'community.action.renew': 'ุงู„ุชุฌุฏูŠุฏ', - 'community.purchase.price': 'ุงู„ุณุนุฑ', - 'community.purchase.permanent': 'ุฏุงุฆู…', - 'community.purchase.monthly': 'ุดู‡ุฑ', - 'community.purchase.confirmBuy': 'ู‡ู„ ุชุฑูŠุฏ ุชุฃูƒูŠุฏ ุดุฑุงุก ู‡ุฐุง ุงู„ู…ุคุดุฑ ({price} QDT)ุŸ', - 'community.purchase.confirmRenew': 'ู‡ู„ ุชุฑูŠุฏ ุชุฃูƒูŠุฏ ุชุฌุฏูŠุฏ ู‡ุฐุง ุงู„ู…ุคุดุฑ ({price} QDT/month)ุŸ', - 'community.purchase.confirmFree': 'ู‡ู„ ุชุฑูŠุฏ ุชุฃูƒูŠุฏ ุฅุถุงูุฉ ู‡ุฐุง ุงู„ู…ุคุดุฑ ุงู„ู…ุฌุงู†ูŠุŸ', - 'community.purchase.confirmTitle': 'ุชุฃูƒูŠุฏ ุงู„ุฅุฌุฑุงุก', - 'community.purchase.owned': 'ู„ู‚ุฏ ู‚ู…ุช ุจุดุฑุงุก ู‡ุฐุง ุงู„ู…ุคุดุฑ (ุตุงู„ุญ ุจุดูƒู„ ุฏุงุฆู…)', - 'community.purchase.ownIndicator': 'ู‡ุฐุง ู‡ูˆ ุงู„ู…ู‚ูŠุงุณ ุงู„ุฐูŠ ู†ุดุฑุชู‡', - 'community.purchase.expired': 'ู„ู‚ุฏ ุงู†ุชู‡ุช ุตู„ุงุญูŠุฉ ุงุดุชุฑุงูƒูƒ', - 'community.purchase.expiresOn': 'ูˆู‚ุช ุงู†ุชู‡ุงุก ุงู„ุตู„ุงุญูŠุฉ: {ุงู„ุชุงุฑูŠุฎ}', - 'community.tabs.detail': 'ุชูุงุตูŠู„ ุงู„ู…ุคุดุฑ', - 'community.tabs.backtest': 'ุจูŠุงู†ุงุช ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ', - 'community.tabs.ratings': 'ู…ุฑุงุฌุนุงุช ุงู„ู…ุณุชุฎุฏู…', - 'community.rating.myRating': 'ุชู‚ูŠูŠู…ูŠ', - 'community.rating.stars': '{ุนุฏ} ุงู„ู†ุฌูˆู…', - 'community.rating.commentPlaceholder': 'ุดุงุฑูƒ ุชุฌุฑุจุชูƒ...', - 'community.rating.submit': 'ุฅุฑุณุงู„ ุงู„ุชู‚ูŠูŠู…', - 'community.rating.modify': 'ุชุนุฏูŠู„', - 'community.rating.saveModify': 'ุญูุธ ุงู„ุชุบูŠูŠุฑุงุช', - 'community.rating.cancel': 'ุฅู„ุบุงุก', - 'community.rating.selectRating': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ุชู‚ูŠูŠู…', - 'community.rating.success': 'ุงู„ุชู‚ูŠูŠู… ู†ุงุฌุญ', - 'community.rating.modifySuccess': 'ุชู… ุชุนุฏูŠู„ ุงู„ู…ุฑุงุฌุนุฉ ุจู†ุฌุงุญ', - 'community.rating.failed': 'ูุดู„ ุงู„ุชู‚ูŠูŠู…', - 'community.rating.noRatings': 'ู„ุง ุชูˆุฌุฏ ุชุนู„ูŠู‚ุงุช ุญุชู‰ ุงู„ุขู†', - 'community.backtest.note': 'ุงู„ุจูŠุงู†ุงุช ุงู„ู…ุฐูƒูˆุฑุฉ ุฃุนู„ุงู‡ ู‡ูŠ ู†ุชุงุฆุฌ ุงุฎุชุจุงุฑ ุฎู„ููŠ ุชุงุฑูŠุฎูŠุฉ ูˆู‡ูŠ ู„ู„ุฅุดุงุฑุฉ ูู‚ุท ูˆู„ุง ุชู…ุซู„ ุฃุฑุจุงุญู‹ุง ู…ุณุชู‚ุจู„ูŠุฉ.', - 'community.backtest.noData': 'ู„ุง ุชูˆุฌุฏ ุจูŠุงู†ุงุช ุจุงูƒุชุณุช ุญุชู‰ ุงู„ุขู†', - 'community.backtest.uploadHint': 'ู„ู… ูŠู‚ู… ุงู„ู…ุคู„ู ุจุชุญู…ูŠู„ ุจูŠุงู†ุงุช ุงู„ุงุฎุชุจุงุฑ ุงู„ุฎู„ููŠ ุญุชู‰ ุงู„ุขู†', - 'community.message.loadFailed': 'ูุดู„ ุชุญู…ูŠู„ ู‚ุงุฆู…ุฉ ุงู„ู…ุคุดุฑุงุช', - 'community.message.purchaseProcessing': 'ุฌุงุฑู ู…ุนุงู„ุฌุฉ ุทู„ุจ ุงู„ุดุฑุงุก...', - 'community.message.downloadSuccess': 'ุชู…ุช ุฅุถุงูุฉ ุงู„ู…ู‚ูŠุงุณ ุฅู„ู‰ ู‚ุงุฆู…ุฉ ุงู„ู…ู‚ุงูŠูŠุณ ุงู„ุฎุงุตุฉ ุจูŠ', - 'community.message.favoriteSuccess': 'ุชู… ุงู„ุชุฌู…ูŠุน ุจู†ุฌุงุญ', - 'community.message.unfavoriteSuccess': 'ุชู… ุฅู„ุบุงุก ุงู„ุชุฌู…ูŠุน ุจู†ุฌุงุญ', - 'community.message.operationSuccess': 'ุงู„ุนู…ู„ูŠุฉ ู†ุงุฌุญุฉ', - 'community.message.operationFailed': 'ูุดู„ุช ุงู„ุนู…ู„ูŠุฉ', - 'community.banner.readOnly': 'ู„ู„ู‚ุฑุงุกุฉ ูู‚ุท', - 'community.banner.loginHint': 'ู„ู„ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„ ุฃูˆ ุงู„ุชุณุฌูŠู„ุŒ ูŠุฑุฌู‰ ุงู„ู†ู‚ุฑ ุนู„ู‰ ุงู„ุฒุฑ ู„ู„ุงู†ุชู‚ุงู„ ุฅู„ู‰ ุตูุญุฉ ู…ุณุชู‚ู„ุฉ ู„ุชุฌู†ุจ ู…ุดุงูƒู„ CSRF', - 'community.banner.jumpButton': 'ุงู„ุงู†ุชู‚ุงู„ ุฅู„ู‰ ุชุณุฌูŠู„ ุงู„ุฏุฎูˆู„/ุงู„ุชุณุฌูŠู„', - 'dashboard.totalEquity': 'ุฅุฌู…ุงู„ูŠ ุญู‚ูˆู‚ ุงู„ู…ู„ูƒูŠุฉ', - 'dashboard.totalPnL': 'ุฅุฌู…ุงู„ูŠ ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ', - 'dashboard.aiStrategies': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'dashboard.indicatorStrategies': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ู…ุคุดุฑ', - 'dashboard.running': 'ุงู„ุฌุฑูŠ', - 'dashboard.pnlHistory': 'ุงู„ุฃุฑุจุงุญ ูˆุงู„ุฎุณุงุฆุฑ ุงู„ุชุงุฑูŠุฎูŠุฉ', - 'dashboard.strategyPerformance': 'ู†ุณุจุฉ ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ ููŠ ุงู„ุงุณุชุฑุงุชูŠุฌูŠุฉ', - 'dashboard.recentTrades': 'ุงู„ู…ุนุงู…ู„ุงุช ุงู„ุฃุฎูŠุฑุฉ', - 'dashboard.currentPositions': 'ุงู„ูˆุถุน ุงู„ุญุงู„ูŠ', - 'dashboard.table.time': 'ุงู„ูˆู‚ุช', - 'dashboard.table.strategy': 'ุงุณู… ุงู„ุณูŠุงุณุฉ', - 'dashboard.table.symbol': 'ุงู„ู‡ุฏู', - 'dashboard.table.type': 'ุงูƒุชุจ', - 'dashboard.table.side': 'ุงู„ุงุชุฌุงู‡', - 'dashboard.table.size': 'ุงู„ูุงุฆุฏุฉ ุงู„ู…ูุชูˆุญุฉ', - 'dashboard.table.entryPrice': 'ู…ุชูˆุณุท ุณุนุฑ ุงู„ุงูุชุชุงุญ', - 'dashboard.table.price': 'ุงู„ุณุนุฑ', - 'dashboard.table.amount': 'ุงู„ูƒู…ูŠุฉ', - 'dashboard.table.profit': 'ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ', - 'dashboard.pendingOrders': 'ุณุฌู„ ุชู†ููŠุฐ ุงู„ุทู„ุจุงุช', - 'dashboard.totalOrders': 'ุฅุฌู…ุงู„ูŠ {total} ุทู„ุจ', - 'dashboard.viewError': 'ุนุฑุถ ุงู„ุฎุทุฃ', - 'dashboard.filled': 'ุชู… ุงู„ุชู†ููŠุฐ', - 'dashboard.orderTable.time': 'ูˆู‚ุช ุงู„ุฅู†ุดุงุก', - 'dashboard.orderTable.strategy': 'ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ', - 'dashboard.orderTable.symbol': 'ุฒูˆุฌ ุงู„ุชุฏุงูˆู„', - 'dashboard.orderTable.signalType': 'ู†ูˆุน ุงู„ุฅุดุงุฑุฉ', - 'dashboard.orderTable.amount': 'ุงู„ูƒู…ูŠุฉ', - 'dashboard.orderTable.price': 'ุณุนุฑ ุงู„ุชู†ููŠุฐ', - 'dashboard.orderTable.status': 'ุงู„ุญุงู„ุฉ', - 'dashboard.orderTable.executedAt': 'ูˆู‚ุช ุงู„ุชู†ููŠุฐ', - 'dashboard.signalType.openLong': 'ูุชุญ Long', - 'dashboard.signalType.openShort': 'ูุชุญ Short', - 'dashboard.signalType.closeLong': 'ุฅุบู„ุงู‚ Long', - 'dashboard.signalType.closeShort': 'ุฅุบู„ุงู‚ Short', - 'dashboard.signalType.addLong': 'ุฅุถุงูุฉ Long', - 'dashboard.signalType.addShort': 'ุฅุถุงูุฉ Short', - 'dashboard.status.pending': 'ู‚ูŠุฏ ุงู„ุงู†ุชุธุงุฑ', - 'dashboard.status.processing': 'ู‚ูŠุฏ ุงู„ู…ุนุงู„ุฌุฉ', - 'dashboard.status.completed': 'ู…ูƒุชู…ู„', - 'dashboard.status.failed': 'ูุดู„', - 'dashboard.status.cancelled': 'ู…ู„ุบูŠ', - 'dashboard.table.pnl': 'ุงู„ุฑุจุญ ุฃูˆ ุงู„ุฎุณุงุฑุฉ ุบูŠุฑ ุงู„ู…ุญู‚ู‚ุฉ', - 'form.basic-form.basic.title': 'ุงู„ุดูƒู„ ุงู„ุฃุณุงุณูŠ', - 'form.basic-form.basic.description': 'ุชูุณุชุฎุฏู… ุตูุญุงุช ุงู„ู†ู…ุงุฐุฌ ู„ุฌู…ุน ุงู„ู…ุนู„ูˆู…ุงุช ู…ู† ุงู„ู…ุณุชุฎุฏู…ูŠู† ุฃูˆ ุงู„ุชุญู‚ู‚ ู…ู†ู‡ุง. ุชูุณุชุฎุฏู… ุงู„ู†ู…ุงุฐุฌ ุงู„ุฃุณุงุณูŠุฉ ุจุดูƒู„ ุดุงุฆุน ููŠ ุณูŠู†ุงุฑูŠูˆู‡ุงุช ุงู„ู†ู…ุงุฐุฌ ุงู„ุชูŠ ุชุญุชูˆูŠ ุนู„ู‰ ุนุฏุฏ ู‚ู„ูŠู„ ู…ู† ุนู†ุงุตุฑ ุงู„ุจูŠุงู†ุงุช.', - 'form.basic-form.title.label': 'ุงู„ุนู†ูˆุงู†', - 'form.basic-form.title.placeholder': 'ุฅุนุทุงุก ุงู„ู‡ุฏู ุงุณู…ุง', - 'form.basic-form.title.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู†', - 'form.basic-form.date.label': 'ุชุงุฑูŠุฎ ุงู„ุจุฏุก ูˆุงู„ุงู†ุชู‡ุงุก', - 'form.basic-form.placeholder.start': 'ุชุงุฑูŠุฎ ุงู„ุจุฏุก', - 'form.basic-form.placeholder.end': 'ุชุงุฑูŠุฎ ุงู„ุงู†ุชู‡ุงุก', - 'form.basic-form.date.required': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุชุงุฑูŠุฎูŠ ุงู„ุจุฏุก ูˆุงู„ุงู†ุชู‡ุงุก', - 'form.basic-form.goal.label': 'ูˆุตู ุงู„ู‡ุฏู', - 'form.basic-form.goal.placeholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฃู‡ุฏุงู ุงู„ุนู…ู„ ุงู„ู…ุฑุญู„ูŠุฉ', - 'form.basic-form.goal.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ูˆุตู ุงู„ู‡ุฏู', - 'form.basic-form.standard.label': 'ู‚ูŠุงุณ', - 'form.basic-form.standard.placeholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ู…ู‚ุงูŠูŠุณ', - 'form.basic-form.standard.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ู…ู‚ุงูŠูŠุณ', - 'form.basic-form.client.label': 'ุงู„ุนู…ูŠู„', - 'form.basic-form.client.required': 'ูŠุฑุฌู‰ ูˆุตู ุงู„ุนู…ู„ุงุก ุงู„ุฐูŠู† ุชุฎุฏู…ู‡ู…', - 'form.basic-form.label.tooltip': 'ู…ุชู„ู‚ูŠ ุงู„ุฎุฏู…ุฉ ุงู„ู…ุณุชู‡ุฏููŠู†', - 'form.basic-form.client.placeholder': 'ูŠุฑุฌู‰ ูˆุตู ุงู„ุนู…ู„ุงุก ุงู„ุฐูŠู† ุชุฎุฏู…ู‡ู…ุŒ ูˆุงู„ุนู…ู„ุงุก ุงู„ุฏุงุฎู„ูŠูŠู† ู…ุจุงุดุฑุฉู‹ @ุงู„ุงุณู…/ุฑู‚ู… ุงู„ูˆุธูŠูุฉ', - 'form.basic-form.invites.label': 'ุฏุนูˆุฉ ุงู„ู…ุฑุงุฌุนูŠู†', - 'form.basic-form.invites.placeholder': 'ูŠุฑุฌู‰ ุฅุฑุณุงู„ @ุงู„ุงุณู…/ุฑู‚ู… ุงู„ู…ูˆุธู ู…ุจุงุดุฑุฉู‹ุŒ ูˆูŠู…ูƒู†ูƒ ุฏุนูˆุฉ ู…ุง ูŠุตู„ ุฅู„ู‰ 5 ุฃุดุฎุงุต', - 'form.basic-form.weight.label': 'ุงู„ูˆุฒู†', - 'form.basic-form.weight.placeholder': 'ู…ู† ูุถู„ูƒ ุฃุฏุฎู„', - 'form.basic-form.public.label': 'ุชุณุชู‡ุฏู ุงู„ุฌู…ู‡ูˆุฑ', - 'form.basic-form.label.help': 'ุชุชู… ู…ุดุงุฑูƒุฉ ุงู„ุนู…ู„ุงุก ูˆุงู„ู…ุฑุงุฌุนูŠู† ุจุดูƒู„ ุงูุชุฑุงุถูŠ', - 'form.basic-form.radio.public': 'ุนุงู…', - 'form.basic-form.radio.partially-public': 'ุนุงู…ุฉ ุฌุฒุฆูŠุง', - 'form.basic-form.radio.private': 'ุฎุงุต', - 'form.basic-form.publicUsers.placeholder': 'ู…ูุชูˆุญ ู„', - 'form.basic-form.option.A': 'ุฒู…ูŠู„ 1', - 'form.basic-form.option.B': 'ุฒู…ูŠู„ 2', - 'form.basic-form.option.C': 'ุฒู…ูŠู„ ุซู„ุงุซุฉ', - 'form.basic-form.email.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุงู„ุฎุงุต ุจูƒ!', - 'form.basic-form.email.wrong-format': 'ุชู†ุณูŠู‚ ุนู†ูˆุงู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุฎุงุทุฆ!', - 'form.basic-form.userName.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงุณู… ุงู„ู…ุณุชุฎุฏู…!', - 'form.basic-form.password.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ ุงู„ุฎุงุตุฉ ุจูƒ!', - 'form.basic-form.password.twice': 'ูƒู„ู…ุงุช ุงู„ู…ุฑูˆุฑ ุงู„ุชูŠ ุชู… ุฅุฏุฎุงู„ู‡ุง ู…ุฑุชูŠู† ุบูŠุฑ ู…ุชุทุงุจู‚ุฉ!', - 'form.basic-form.strength.msg': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ 6 ุฃุญุฑู ุนู„ู‰ ุงู„ุฃู‚ู„. ูŠุฑุฌู‰ ุนุฏู… ุงุณุชุฎุฏุงู… ูƒู„ู…ุงุช ุงู„ู…ุฑูˆุฑ ุงู„ุชูŠ ูŠู…ูƒู† ุชุฎู…ูŠู†ู‡ุง ุจุณู‡ูˆู„ุฉ.', - 'form.basic-form.strength.strong': 'ุงู„ู‚ูˆุฉ : ู‚ูˆูŠุฉ', - 'form.basic-form.strength.medium': 'ุงู„ู‚ูˆุฉ: ู…ุชูˆุณุทุฉ', - 'form.basic-form.strength.short': 'ุงู„ู‚ูˆุฉ : ู‚ุตูŠุฑุฉ ุฌุฏุงู‹', - 'form.basic-form.confirm-password.required': 'ุงู„ุฑุฌุงุก ุชุฃูƒูŠุฏ ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ ุงู„ุฎุงุตุฉ ุจูƒ!', - 'form.basic-form.phone-number.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู‚ู… ู‡ุงุชููƒ ุงู„ู…ุญู…ูˆู„!', - 'form.basic-form.phone-number.wrong-format': 'ุชู†ุณูŠู‚ ุฑู‚ู… ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„ ุฎุงุทุฆ!', - 'form.basic-form.verification-code.required': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู…ุฒ ุงู„ุชุญู‚ู‚!', - 'form.basic-form.form.get-captcha': 'ุงู„ุญุตูˆู„ ุนู„ู‰ ุฑู…ุฒ ุงู„ุชุญู‚ู‚', - 'form.basic-form.captcha.second': 'ุซูˆุงู†ูŠ', - 'form.basic-form.form.optional': '(ุงุฎุชูŠุงุฑูŠ)', - 'form.basic-form.form.submit': 'ุฅุฑุณุงู„', - 'form.basic-form.form.save': 'ุญูุธ', - 'form.basic-form.email.placeholder': 'ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'form.basic-form.password.placeholder': 'ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ ู…ูƒูˆู†ุฉ ู…ู† 6 ุฃุญุฑู ุนู„ู‰ ุงู„ุฃู‚ู„ุŒ ุญุณุงุณุฉ ู„ุญุงู„ุฉ ุงู„ุฃุญุฑู', - 'form.basic-form.confirm-password.placeholder': 'ุชุฃูƒูŠุฏ ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ', - 'form.basic-form.phone-number.placeholder': 'ุฑู‚ู… ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„', - 'form.basic-form.verification-code.placeholder': 'ุฑู…ุฒ ุงู„ุชุญู‚ู‚', - 'result.success.title': 'ุชู… ุงู„ุชู‚ุฏูŠู… ุจู†ุฌุงุญ', - 'result.success.description': 'ูŠุชู… ุงุณุชุฎุฏุงู… ุตูุญุฉ ู†ุชุงุฆุฌ ุงู„ุฅุฑุณุงู„ ู„ุชู‚ุฏูŠู… ุชุนู„ูŠู‚ุงุช ุนู„ู‰ ู†ุชุงุฆุฌ ุงู„ู…ุนุงู„ุฌุฉ ู„ุณู„ุณู„ุฉ ู…ู† ู…ู‡ุงู… ุงู„ุชุดุบูŠู„. ุฅุฐุง ูƒุงู†ุช ุนู…ู„ูŠุฉ ุจุณูŠุทุฉ ูู‚ุทุŒ ูุงุณุชุฎุฏู… ุฑุณุงู„ุฉ ุงู„ู…ู„ุงุญุธุงุช ุงู„ุนุงู…ุฉ ุงู„ุณุฑูŠุนุฉ. ูŠู…ูƒู† ู„ู…ู†ุทู‚ุฉ ุงู„ู†ุต ู‡ุฐู‡ ุนุฑุถ ุชุนู„ูŠู…ุงุช ุชูƒู…ูŠู„ูŠุฉ ุจุณูŠุทุฉ. ุฅุฐุง ูƒุงู†ุช ู‡ู†ุงูƒ ุญุงุฌุฉ ู„ุนุฑุถ "ุงู„ู…ุณุชู†ุฏุงุช"ุŒ ููŠู…ูƒู† ู„ู„ู…ู†ุทู‚ุฉ ุงู„ุฑู…ุงุฏูŠุฉ ุฃุฏู†ุงู‡ ุนุฑุถ ู…ุญุชูˆู‰ ุฃูƒุซุฑ ุชุนู‚ูŠุฏู‹ุง.', - 'result.success.operate-title': 'ุงุณู… ุงู„ู…ุดุฑูˆุน', - 'result.success.operate-id': 'ู…ุนุฑู ุงู„ู…ุดุฑูˆุน', - 'result.success.principal': 'ุงู„ุดุฎุต ุงู„ู…ุณุคูˆู„', - 'result.success.operate-time': 'ุงู„ูˆู‚ุช ุงู„ูุนุงู„', - 'result.success.step1-title': 'ุฅู†ุดุงุก ู…ุดุฑูˆุน', - 'result.success.step1-operator': 'ุชุดูˆ ู„ูŠู„ูŠ', - 'result.success.step2-title': 'ุงู„ู…ุฑุงุฌุนุฉ ุงู„ุฃูˆู„ูŠุฉ ู„ู„ู‚ุณู…', - 'result.success.step2-operator': 'ุชุดูˆ ู…ุงูˆู…ุงูˆ', - 'result.success.step2-extra': 'ุนุงุฌู„', - 'result.success.step3-title': 'ุงู„ู…ุฑุงุฌุนุฉ ุงู„ู…ุงู„ูŠุฉ', - 'result.success.step4-title': 'ูƒุงู…ู„', - 'result.success.btn-return': 'ุงู„ุนูˆุฏุฉ ุฅู„ู‰ ุงู„ู‚ุงุฆู…ุฉ', - 'result.success.btn-project': 'ุนุฑุถ ุงู„ุนู†ุงุตุฑ', - 'result.success.btn-print': 'ุทุจุงุนุฉ', - 'result.fail.error.title': 'ูุดู„ ุงู„ุชู‚ุฏูŠู…', - 'result.fail.error.description': 'ูŠุฑุฌู‰ ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ู…ุนู„ูˆู…ุงุช ุงู„ุชุงู„ูŠุฉ ูˆุชุนุฏูŠู„ู‡ุง ู‚ุจู„ ุฅุนุงุฏุฉ ุงู„ุฅุฑุณุงู„.', - 'result.fail.error.hint-title': 'ูŠุญุชูˆูŠ ุงู„ู…ุญุชูˆู‰ ุงู„ุฐูŠ ุฃุฑุณู„ุชู‡ ุนู„ู‰ ุงู„ุฃุฎุทุงุก ุงู„ุชุงู„ูŠุฉ:', - 'result.fail.error.hint-text1': 'ู„ู‚ุฏ ุชู… ุชุฌู…ูŠุฏ ุญุณุงุจูƒ', - 'result.fail.error.hint-btn1': 'ุฐูˆุจุงู† ุงู„ุฌู„ูŠุฏ ุนู„ู‰ ุงู„ููˆุฑ', - 'result.fail.error.hint-text2': 'ุญุณุงุจูƒ ู„ูŠุณ ู…ุคู‡ู„ุงู‹ ุจุนุฏ ู„ู„ุชู‚ุฏูŠู…', - 'result.fail.error.hint-btn2': 'ู‚ู… ุจุงู„ุชุฑู‚ูŠุฉ ุงู„ุขู†', - 'result.fail.error.btn-text': 'ุงู„ุนูˆุฏุฉ ุฅู„ู‰ ุงู„ุชุนุฏูŠู„', - 'account.settings.menuMap.custom': 'ุงู„ุชุฎุตูŠุต', - 'account.settings.menuMap.binding': 'ุฑุจุท ุงู„ุญุณุงุจ', - 'account.settings.basic.avatar': 'ุงู„ุตูˆุฑุฉ ุงู„ุฑู…ุฒูŠุฉ', - 'account.settings.basic.change-avatar': 'ุชุบูŠูŠุฑ ุงู„ุตูˆุฑุฉ ุงู„ุฑู…ุฒูŠุฉ', - 'account.settings.basic.email': 'ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'account.settings.basic.email-message': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุงู„ุฎุงุต ุจูƒ!', - 'account.settings.basic.nickname': 'ุงู„ู„ู‚ุจ', - 'account.settings.basic.nickname-message': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ู„ู‚ุจ ุงู„ุฎุงุต ุจูƒ!', - 'account.settings.basic.profile': 'ุงู„ู…ู„ู ุงู„ุดุฎุตูŠ', - 'account.settings.basic.profile-message': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ู„ู ุงู„ุชุนุฑูŠู ุงู„ุดุฎุตูŠ ุงู„ุฎุงุต ุจูƒ!', - 'account.settings.basic.profile-placeholder': 'ุงู„ู…ู„ู ุงู„ุดุฎุตูŠ', - 'account.settings.basic.country': 'ุงู„ุจู„ุฏ/ุงู„ู…ู†ุทู‚ุฉ', - 'account.settings.basic.country-message': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุจู„ุฏูƒ ุฃูˆ ู…ู†ุทู‚ุชูƒ!', - 'account.settings.basic.geographic': 'ุงู„ู…ุญุงูุธุฉ ูˆุงู„ู…ุฏูŠู†ุฉ', - 'account.settings.basic.geographic-message': 'ู…ู† ูุถู„ูƒ ุฃุฏุฎู„ ู…ุญุงูุธุชูƒ ูˆู…ุฏูŠู†ุชูƒ!', - 'account.settings.basic.address': 'ุนู†ูˆุงู† ุงู„ุดุงุฑุน', - 'account.settings.basic.address-message': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู† ุงู„ุดุงุฑุน ุงู„ุฎุงุต ุจูƒ!', - 'account.settings.basic.phone': 'ุฑู‚ู… ุงู„ุงุชุตุงู„', - 'account.settings.basic.phone-message': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุฑู‚ู… ุงู„ุงุชุตุงู„ ุงู„ุฎุงุต ุจูƒ!', - 'account.settings.basic.update': 'ุชุญุฏูŠุซ ุงู„ู…ุนู„ูˆู…ุงุช ุงู„ุฃุณุงุณูŠุฉ', - 'account.settings.basic.update.success': 'ุชู… ุชุญุฏูŠุซ ุงู„ู…ุนู„ูˆู…ุงุช ุงู„ุฃุณุงุณูŠุฉ ุจู†ุฌุงุญ', - 'account.settings.security.strong': 'ู‚ูˆูŠ', - 'account.settings.security.medium': 'ููŠ', - 'account.settings.security.weak': 'ุถุนูŠู', - 'account.settings.security.password': 'ูƒู„ู…ุฉ ู…ุฑูˆุฑ ุงู„ุญุณุงุจ', - 'account.settings.security.password-description': 'ู‚ูˆุฉ ูƒู„ู…ุฉ ุงู„ู…ุฑูˆุฑ ุงู„ุญุงู„ูŠุฉ:', - 'account.settings.security.phone': 'ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„ ุงู„ุฃู…ู†', - 'account.settings.security.phone-description': 'ุงู„ู‡ุงุชู ุงู„ู…ุญู…ูˆู„ ุงู„ู…ุฑุชุจุท ุจุงู„ูุนู„:', - 'account.settings.security.question': 'ุงู„ู‚ุถุงูŠุง ุงู„ุฃู…ู†ูŠุฉ', - 'account.settings.security.question-description': 'ู„ู… ูŠุชู… ุชุนูŠูŠู† ุฃูŠ ุฃุณุฆู„ุฉ ุฃู…ู†ูŠุฉุŒ ุงู„ุฃู…ุฑ ุงู„ุฐูŠ ูŠู…ูƒู† ุฃู† ูŠุญู…ูŠ ุฃู…ุงู† ุงู„ุญุณุงุจ ุจุดูƒู„ ูุนุงู„.', - 'account.settings.security.email': 'ุฑุจุท ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'account.settings.security.email-description': 'ุนู†ูˆุงู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ุงู„ู…ุฑุชุจุท ุจุงู„ูุนู„:', - 'account.settings.security.mfa': 'ุฌู‡ุงุฒ ุงู… ุงู ุงูŠู‡', - 'account.settings.security.mfa-description': 'ุฌู‡ุงุฒ MFA ุบูŠุฑ ู…ู‚ูŠุฏ. ุจุนุฏ ุงู„ุฑุจุทุŒ ูŠู…ูƒู†ูƒ ุงู„ุชุฃูƒูŠุฏ ู…ุฑุฉ ุฃุฎุฑู‰.', - 'account.settings.security.modify': 'ุชุนุฏูŠู„', - 'account.settings.security.set': 'ุงู„ุฅุนุฏุงุฏุงุช', - 'account.settings.security.bind': 'ู…ู„ุฒู…ุฉ', - 'account.settings.binding.taobao': 'ุฑุจุท ุชุงูˆุจุงูˆ', - 'account.settings.binding.taobao-description': 'ุญุณุงุจ ุชุงูˆุจุงูˆ ุบูŠุฑ ู…ู„ุฒู… ุญุงู„ูŠุง', - 'account.settings.binding.alipay': 'ุฑุจุท ุนู„ูŠุจุงูŠ', - 'account.settings.binding.alipay-description': 'ุญุณุงุจ Alipay ุบูŠุฑ ู…ู„ุฒู… ุญุงู„ูŠุง', - 'account.settings.binding.dingding': 'ู…ู„ุฒู…ุฉ DingTalk', - 'account.settings.binding.dingding-description': 'ู„ุง ูŠูˆุฌุฏ ุญุณุงุจ DingTalk ู…ุฑุชุจุท ุญุงู„ูŠู‹ุง', - 'account.settings.binding.bind': 'ู…ู„ุฒู…ุฉ', - 'account.settings.notification.password': 'ูƒู„ู…ุฉ ู…ุฑูˆุฑ ุงู„ุญุณุงุจ', - 'account.settings.notification.password-description': 'ุณูŠุชู… ุฅุฎุทุงุฑ ุงู„ุฑุณุงุฆู„ ุงู„ูˆุงุฑุฏุฉ ู…ู† ุงู„ู…ุณุชุฎุฏู…ูŠู† ุงู„ุขุฎุฑูŠู† ููŠ ุดูƒู„ ุฑุณุงุฆู„ ู…ูˆู‚ุน.', - 'account.settings.notification.messages': 'ุฑุณุงุฆู„ ุงู„ู†ุธุงู…', - 'account.settings.notification.messages-description': 'ุณูŠุชู… ุฅุฎุทุงุฑ ุฑุณุงุฆู„ ุงู„ู†ุธุงู… ููŠ ุดูƒู„ ุฑุณุงุฆู„ ุงู„ู…ูˆู‚ุน.', - 'account.settings.notification.todo': 'ุงู„ู…ู‡ุงู… ุงู„ูˆุงุฌุจุฉ', - 'account.settings.notification.todo-description': 'ุณูŠุชู… ุฅุฎุทุงุฑ ุงู„ู…ู‡ุงู… ุงู„ูˆุงุฌุจุฉ ููŠ ุดูƒู„ ุฑุณุงุฆู„ ุฏุงุฎู„ ุงู„ู…ูˆู‚ุน', - 'account.settings.settings.open': 'ู…ูุชูˆุญ', - 'account.settings.settings.close': 'ู‚ุฑูŠุจ', - 'trading-assistant.title': 'ู…ุณุงุนุฏ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.strategyList': 'ู‚ุงุฆู…ุฉ ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ', - 'trading-assistant.createStrategy': 'ุฅู†ุดุงุก ุณูŠุงุณุฉ', - 'trading-assistant.noStrategy': 'ู„ุง ุชูˆุฌุฏ ุงุณุชุฑุงุชูŠุฌูŠุฉ ุญุชู‰ ุงู„ุขู†', - 'trading-assistant.selectStrategy': 'ูŠุฑุฌู‰ ุชุญุฏูŠุฏ ุงุณุชุฑุงุชูŠุฌูŠุฉ ู…ู† ุงู„ูŠุณุงุฑ ู„ุนุฑุถ ุงู„ุชูุงุตูŠู„', - 'trading-assistant.startStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุฅุทู„ุงู‚', - 'trading-assistant.stopStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุชูˆู‚ู', - 'trading-assistant.editStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุชุญุฑูŠุฑ', - 'trading-assistant.deleteStrategy': 'ุญุฐู ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.status.running': 'ุงู„ุฌุฑูŠ', - 'trading-assistant.status.stopped': 'ุชูˆู‚ู', - 'trading-assistant.status.error': 'ุฎุทุฃ', - 'trading-assistant.strategyType.IndicatorStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ู…ุคุดุฑ ุงู„ูู†ูŠ', - 'trading-assistant.strategyType.PromptBasedStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ูƒู„ู…ุงุช ุงู„ุฏู„ุงู„ูŠุฉ', - 'trading-assistant.strategyType.GridStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุดุจูƒุฉ', - 'trading-assistant.tabs.tradingRecords': 'ุชุงุฑูŠุฎ ุงู„ู…ุนุงู…ู„ุฉ', - 'trading-assistant.tabs.positions': 'ุณุฌู„ ุงู„ู…ูˆู‚ู', - 'trading-assistant.tabs.equityCurve': 'ู…ู†ุญู†ู‰ ุงู„ุฃุณู‡ู…', - 'trading-assistant.form.step1': 'ุญุฏุฏ ุงู„ู…ุคุดุฑุงุช', - 'trading-assistant.form.step2': 'ุชูƒูˆูŠู† ุงู„ุตุฑู', - 'trading-assistant.form.step3': 'ู…ุนู„ู…ุงุช ุงู„ุงุณุชุฑุงุชูŠุฌูŠุฉ', - 'trading-assistant.form.indicator': 'ุญุฏุฏ ุงู„ู…ุคุดุฑุงุช', - 'trading-assistant.form.indicatorHint': 'ูŠู…ูƒู†ูƒ ูู‚ุท ุชุญุฏูŠุฏ ุงู„ู…ุคุดุฑุงุช ุงู„ูู†ูŠุฉ ุงู„ุชูŠ ุงุดุชุฑูŠุชู‡ุง ุฃูˆ ุฃู†ุดุฃุชู‡ุง', - 'trading-assistant.form.qdtCostHints': 'ุณูŠุคุฏูŠ ุงุณุชุฎุฏุงู… ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุฅู„ู‰ ุงุณุชู‡ู„ุงูƒ QDTุŒ ูŠุฑุฌู‰ ุงู„ุชุฃูƒุฏ ู…ู† ุฃู† ุงู„ุญุณุงุจ ุจู‡ ุฑุตูŠุฏ ูƒุงูู ู…ู† QDT', - 'trading-assistant.form.indicatorDescription': 'ูˆุตู ุงู„ู…ุคุดุฑ', - 'trading-assistant.form.noDescription': 'ู„ุง ูŠูˆุฌุฏ ูˆุตู ุจุนุฏ', - 'trading-assistant.form.exchange': 'ุงุฎุชุฑ ุงู„ุตุฑู', - 'trading-assistant.form.apiKey': 'ู…ูุชุงุญ ูˆุงุฌู‡ุฉ ุจุฑู…ุฌุฉ ุงู„ุชุทุจูŠู‚ุงุช', - 'trading-assistant.form.secretKey': 'ุงู„ู…ูุชุงุญ ุงู„ุณุฑูŠ', - 'trading-assistant.form.passphrase': 'ุนุจุงุฑุฉ ุงู„ู…ุฑูˆุฑ', - 'trading-assistant.form.testConnection': 'ุงุชุตุงู„ ุงู„ุงุฎุชุจุงุฑ', - 'trading-assistant.form.strategyName': 'ุงุณู… ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.form.symbol': 'ุฒูˆุฌ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.form.symbolHint': 'ุญุงู„ูŠู‹ุงุŒ ูŠุชู… ุฏุนู… ุฃุฒูˆุงุฌ ุชุฏุงูˆู„ ุงู„ุนู…ู„ุงุช ุงู„ู…ุดูุฑุฉ ูู‚ุท', - 'trading-assistant.form.initialCapital': 'ุญุฌู… ุงู„ุงุณุชุซู…ุงุฑ', - 'trading-assistant.form.marketType': 'ู†ูˆุน ุงู„ุณูˆู‚', - 'trading-assistant.form.marketTypeFutures': 'ุงู„ุนู‚ุฏ', - 'trading-assistant.form.marketTypeSpot': 'ุจู‚ุนุฉ', - 'trading-assistant.form.marketTypeHint': 'ูŠุฏุนู… ุงู„ุนู‚ุฏ ุงู„ุชุฏุงูˆู„ ููŠ ุงุชุฌุงู‡ูŠู† ูˆุงู„ุฑุงูุนุฉ ุงู„ู…ุงู„ูŠุฉุŒ ููŠ ุญูŠู† ุฃู† ุงู„ุณุนุฑ ุงู„ููˆุฑูŠ ูŠุฏุนู… ูู‚ุท ุงู„ู…ุฑุงูƒุฒ ุงู„ุทูˆูŠู„ุฉ ูˆุงู„ุฑุงูุนุฉ ุงู„ู…ุงู„ูŠุฉ ุซุงุจุชุฉ ุนู†ุฏ 1x', - 'trading-assistant.form.leverage': 'ุงู„ุงุณุชูุงุฏุฉ ุงู„ู…ุชุนุฏุฏุฉ', - 'trading-assistant.form.leverageHint': 'ุงู„ุนู‚ุฏ: 1-125 ู…ุฑุฉุŒ ุงู„ุจู‚ุนุฉ: ุซุงุจุชุฉ 1 ู…ุฑุฉ', - 'trading-assistant.form.spotLeverageFixed': 'ุงู„ุฑุงูุนุฉ ุงู„ู…ุงู„ูŠุฉ ู„ู„ุชุฏุงูˆู„ ุงู„ููˆุฑูŠ ุซุงุจุชุฉ ุนู†ุฏ 1x', - 'trading-assistant.form.spotOnlyLongHint': 'ุงู„ุชุฏุงูˆู„ ุงู„ููˆุฑูŠ ูŠุฏุนู… ูู‚ุท ุงู„ู…ุฑุงูƒุฒ ุงู„ุทูˆูŠู„ุฉ', - 'trading-assistant.form.tradeDirection': 'ุงุชุฌุงู‡ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.form.tradeDirectionLong': 'ุทูˆูŠู„ุฉ ูู‚ุท', - 'trading-assistant.form.tradeDirectionShort': 'ู‚ุตูŠุฑุฉ ูู‚ุท', - 'trading-assistant.form.tradeDirectionBoth': 'ู…ุนุงู…ู„ุฉ ููŠ ุงุชุฌุงู‡ูŠู†', - 'trading-assistant.form.timeframe': 'ุงู„ูุชุฑุฉ ุงู„ุฒู…ู†ูŠุฉ', - 'trading-assistant.form.klinePeriod': 'ูุชุฑุฉ K-Line', - 'trading-assistant.form.timeframe1m': '1 ุฏู‚ูŠู‚ุฉ', - 'trading-assistant.form.timeframe5m': '5 ุฏู‚ุงุฆู‚', - 'trading-assistant.form.timeframe15m': '15 ุฏู‚ูŠู‚ุฉ', - 'trading-assistant.form.timeframe30m': '30 ุฏู‚ูŠู‚ุฉ', - 'trading-assistant.form.timeframe1H': '1 ุณุงุนุฉ', - 'trading-assistant.form.timeframe4H': '4 ุณุงุนุงุช', - 'trading-assistant.form.timeframe1D': 'ูŠูˆู… ูˆุงุญุฏ', - 'trading-assistant.form.selectStrategyType': 'ุงุฎุชุฑ ู†ูˆุน ุงู„ุงุณุชุฑุงุชูŠุฌูŠุฉ', - 'trading-assistant.form.indicatorStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ู…ุคุดุฑ', - 'trading-assistant.form.indicatorStrategyDesc': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุชุฏุงูˆู„ ุขู„ูŠุฉ ุชุนุชู…ุฏ ุนู„ู‰ ุงู„ู…ุคุดุฑุงุช ุงู„ูู†ูŠุฉ', - 'trading-assistant.form.aiStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ AI', - 'trading-assistant.form.aiStrategyDesc': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุชุฏุงูˆู„ ุขู„ูŠุฉ ุชุนุชู…ุฏ ุนู„ู‰ ุงุชุฎุงุฐ ุงู„ู‚ุฑุงุฑ ุงู„ุฐูƒูŠ ู„ู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'trading-assistant.form.enableAiFilter': 'ุชูุนูŠู„ ู…ุฑุดุญ ุงุชุฎุงุฐ ุงู„ู‚ุฑุงุฑ ุงู„ุฐูƒูŠ ู„ู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'trading-assistant.form.enableAiFilterHint': 'ุนู†ุฏ ุงู„ุชูุนูŠู„ุŒ ุณูŠุชู… ุชุตููŠุฉ ุฅุดุงุฑุงุช ุงู„ู…ุคุดุฑ ุจูˆุงุณุทุฉ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ู„ุชุญุณูŠู† ุฌูˆุฏุฉ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.form.aiFilterPrompt': 'ู…ูˆุฌู‡ ู…ุฎุตุต', - 'trading-assistant.form.aiFilterPromptHint': 'ุชูˆููŠุฑ ุชุนู„ูŠู…ุงุช ู…ุฎุตุตุฉ ู„ุชุตููŠุฉ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠุŒ ุงุชุฑูƒู‡ ูุงุฑุบู‹ุง ู„ุงุณุชุฎุฏุงู… ุงู„ุฅุนุฏุงุฏ ุงู„ุงูุชุฑุงุถูŠ ู„ู„ู†ุธุงู…', - 'trading-assistant.validation.strategyTypeRequired': 'ูŠุฑุฌู‰ ุงุฎุชูŠุงุฑ ู†ูˆุน ุงู„ุงุณุชุฑุงุชูŠุฌูŠุฉ', - 'trading-assistant.form.advancedSettings': 'ุงู„ุฅุนุฏุงุฏุงุช ุงู„ู…ุชู‚ุฏู…ุฉ', - 'trading-assistant.form.orderMode': 'ูˆุถุน ุงู„ุทู„ุจ', - 'trading-assistant.form.orderModeMaker': 'ุตุงู†ุน', - 'trading-assistant.form.orderModeTaker': 'ุณุนุฑ ุงู„ุณูˆู‚ (ุงู„ู…ุชู„ู‚ูŠ)', - 'trading-assistant.form.orderModeHint': 'ูŠุณุชุฎุฏู… ูˆุถุน ุงู„ุฃู…ุฑ ุงู„ู…ุนู„ู‚ ุฃูˆุงู…ุฑ ุงู„ุญุฏ ูˆุชูƒูˆู† ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ ุฃู‚ู„ุ› ูŠุชู… ุชู†ููŠุฐ ูˆุถุน ุณุนุฑ ุงู„ุณูˆู‚ ุนู„ู‰ ุงู„ููˆุฑ ูˆุชูƒูˆู† ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ ุฃุนู„ู‰.', - 'trading-assistant.form.makerWaitSec': 'ูˆู‚ุช ุงู„ุงู†ุชุธุงุฑ ู„ู„ุฃูˆุงู…ุฑ ุงู„ู…ุนู„ู‚ุฉ (ุซูˆุงู†ูŠ)', - 'trading-assistant.form.makerWaitSecHint': 'ุงู„ูˆู‚ุช ุงู„ู„ุงุฒู… ู„ุงู†ุชุธุงุฑ ุงู„ู…ุนุงู…ู„ุฉ ุจุนุฏ ุชู‚ุฏูŠู… ุงู„ุทู„ุจ. ู‚ู… ุจุงู„ุฅู„ุบุงุก ูˆุญุงูˆู„ ู…ุฑุฉ ุฃุฎุฑู‰ ุจุนุฏ ุงู†ุชู‡ุงุก ุงู„ู…ู‡ู„ุฉ.', - 'trading-assistant.form.makerRetries': 'ุนุฏุฏ ู…ุฑุงุช ุฅุนุงุฏุฉ ุงู„ู…ุญุงูˆู„ุฉ ู„ู„ุฃูˆุงู…ุฑ ุงู„ู…ุนู„ู‚ุฉ', - 'trading-assistant.form.makerRetriesHint': 'ุงู„ุญุฏ ุงู„ุฃู‚ุตู‰ ู„ุนุฏุฏ ู…ุฑุงุช ุฅุนุงุฏุฉ ุงู„ู…ุญุงูˆู„ุฉ ุนู†ุฏู…ุง ู„ุง ูŠุชู… ุชู†ููŠุฐ ุงู„ุฃู…ุฑ ุงู„ู…ุนู„ู‚', - 'trading-assistant.form.fallbackToMarket': 'ูŠูุดู„ ุงู„ุฃู…ุฑ ุงู„ู…ุนู„ู‚ ูˆูŠุชู… ุชุฎููŠุถ ุณุนุฑ ุงู„ุณูˆู‚.', - 'trading-assistant.form.fallbackToMarketHint': 'ุนู†ุฏู…ุง ู„ุง ูŠุชู… ุฅูƒู…ุงู„ ุฃู…ุฑ ุงู„ูุชุญ/ุงู„ุฅุบู„ุงู‚ ุงู„ู…ุนู„ู‚ุŒ ู…ุง ุฅุฐุง ูƒุงู† ูŠู†ุจุบูŠ ุชุฎููŠุถู‡ ุฅู„ู‰ ุฃู…ุฑ ุณูˆู‚ ู„ุถู…ุงู† ุงูƒุชู…ุงู„ ุงู„ู…ุนุงู…ู„ุฉ.', - 'trading-assistant.form.marginMode': 'ูˆุถุน ุงู„ู‡ุงู…ุด', - 'trading-assistant.form.marginModeCross': 'ู…ุณุชูˆุฏุน ูƒุงู…ู„', - 'trading-assistant.form.marginModeIsolated': 'ู…ูˆู‚ู ู…ุนุฒูˆู„', - 'trading-assistant.form.stopLossPct': 'ู†ุณุจุฉ ูˆู‚ู ุงู„ุฎุณุงุฑุฉ (ูช)', - 'trading-assistant.form.stopLossPctHint': 'ู‚ู… ุจุชุนูŠูŠู† ู†ุณุจุฉ ูˆู‚ู ุงู„ุฎุณุงุฑุฉุŒ 0 ูŠุนู†ูŠ ุนุฏู… ุชู…ูƒูŠู† ูˆู‚ู ุงู„ุฎุณุงุฑุฉ', - 'trading-assistant.form.takeProfitPct': 'ู†ุณุจุฉ ุฌู†ูŠ ุงู„ุฃุฑุจุงุญ (%)', - 'trading-assistant.form.takeProfitPctHint': 'ู‚ู… ุจุชุนูŠูŠู† ู†ุณุจุฉ ุฃุฎุฐ ุงู„ุฑุจุญุŒ 0 ูŠุนู†ูŠ ุชุนุทูŠู„ ุฃุฎุฐ ุงู„ุฑุจุญ', - 'trading-assistant.form.signalMode': 'ูˆุถุน ุงู„ุฅุดุงุฑุฉ', - 'trading-assistant.form.signalModeConfirmed': 'ุชุฃูƒูŠุฏ ุงู„ูˆุถุน', - 'trading-assistant.form.signalModeAggressive': 'ุงู„ูˆุถุน ุงู„ุนุฏูˆุงู†ูŠ', - 'trading-assistant.form.signalModeHint': 'ูˆุถุน ุงู„ุชุฃูƒูŠุฏ: ูŠุชุญู‚ู‚ ูู‚ุท ู…ู† ุฎุทูˆุท K ุงู„ู…ูƒุชู…ู„ุฉุ› ุงู„ูˆุถุน ุงู„ุนุฏูˆุงู†ูŠ: ูŠุชุญู‚ู‚ ุฃูŠุถู‹ุง ู…ู† ุชุดูƒูŠู„ ุฎุทูˆุท K', - 'trading-assistant.form.cancel': 'ุฅู„ุบุงุก', - 'trading-assistant.form.prev': 'ุงู„ุฎุทูˆุฉ ุงู„ุณุงุจู‚ุฉ', - 'trading-assistant.form.next': 'ุงู„ุฎุทูˆุฉ ุงู„ุชุงู„ูŠุฉ', - 'trading-assistant.form.confirmCreate': 'ุชุฃูƒูŠุฏ ุงู„ุฅู†ุดุงุก', - 'trading-assistant.form.confirmEdit': 'ุชุฃูƒูŠุฏ ุงู„ุชุบูŠูŠุฑุงุช', - 'trading-assistant.messages.createSuccess': 'ุชู… ุฅู†ุดุงุก ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุจู†ุฌุงุญ', - 'trading-assistant.messages.createFailed': 'ูุดู„ ููŠ ุฅู†ุดุงุก ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.messages.updateSuccess': 'ุชู… ุชุญุฏูŠุซ ุงู„ุณูŠุงุณุฉ ุจู†ุฌุงุญ', - 'trading-assistant.messages.updateFailed': 'ูุดู„ ุชุญุฏูŠุซ ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.messages.deleteSuccess': 'ุชู… ุญุฐู ุงู„ุณูŠุงุณุฉ ุจู†ุฌุงุญ', - 'trading-assistant.messages.deleteFailed': 'ูุดู„ ุณูŠุงุณุฉ ุงู„ุญุฐู', - 'trading-assistant.messages.startSuccess': 'ุจุฏุฃุช ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุจู†ุฌุงุญ', - 'trading-assistant.messages.startFailed': 'ูุดู„ ููŠ ุจุฏุก ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.messages.stopSuccess': 'ุชู… ุฅูŠู‚ุงู ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุจู†ุฌุงุญ', - 'trading-assistant.messages.stopFailed': 'ูุดู„ุช ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุชูˆู‚ู', - 'trading-assistant.messages.loadFailed': 'ูุดู„ ุงู„ุญุตูˆู„ ุนู„ู‰ ู‚ุงุฆู…ุฉ ุงู„ุณูŠุงุณุงุช', - 'trading-assistant.messages.runningWarning': 'ุงู„ุงุณุชุฑุงุชูŠุฌูŠุฉ ู‚ูŠุฏ ุงู„ุชุดุบูŠู„. ูŠุฑุฌู‰ ุฅูŠู‚ุงู ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ู‚ุจู„ ุชุนุฏูŠู„ู‡ุง.', - 'trading-assistant.messages.deleteConfirmWithName': 'ู‡ู„ ุฃู†ุช ู…ุชุฃูƒุฏ ุฃู†ูƒ ุชุฑูŠุฏ ุญุฐู ุงู„ุณูŠุงุณุฉ "{name}"ุŸ ู‡ุฐู‡ ุงู„ุนู…ู„ูŠุฉ ู„ุง ุฑุฌุนุฉ ููŠู‡ุง.', - 'trading-assistant.messages.deleteConfirm': 'ู‡ู„ ุฃู†ุช ู…ุชุฃูƒุฏ ุฃู†ูƒ ุชุฑูŠุฏ ุญุฐู ู‡ุฐู‡ ุงู„ุณูŠุงุณุฉุŸ ู‡ุฐู‡ ุงู„ุนู…ู„ูŠุฉ ู„ุง ุฑุฌุนุฉ ููŠู‡ุง.', - 'trading-assistant.messages.loadTradesFailed': 'ูุดู„ ููŠ ุงู„ุญุตูˆู„ ุนู„ู‰ ุณุฌู„ุงุช ุงู„ู…ุนุงู…ู„ุงุช', - 'trading-assistant.messages.loadPositionsFailed': 'ูุดู„ ุงู„ุญุตูˆู„ ุนู„ู‰ ุณุฌู„ ุงู„ู…ูˆู‚ู', - 'trading-assistant.messages.loadEquityFailed': 'ูุดู„ ููŠ ุงู„ุญุตูˆู„ ุนู„ู‰ ู…ู†ุญู†ู‰ ุงู„ุฃุณู‡ู…', - 'trading-assistant.messages.loadIndicatorsFailed': 'ูุดู„ ุชุญู…ูŠู„ ู‚ุงุฆู…ุฉ ุงู„ู…ุคุดุฑุงุชุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ููŠ ูˆู‚ุช ู„ุงุญู‚', - 'trading-assistant.messages.spotLimitations': 'ุชู… ุถุจุท ุงู„ุชุฏุงูˆู„ ุงู„ููˆุฑูŠ ุชู„ู‚ุงุฆูŠู‹ุง ุนู„ู‰ ุฑุงูุนุฉ ู…ุงู„ูŠุฉ ุทูˆูŠู„ุฉ ูู‚ุท ุจู…ู‚ุฏุงุฑ 1x', - 'trading-assistant.messages.autoFillApiConfig': 'ุชู…ุช ุชุนุจุฆุฉ ุชูƒูˆูŠู† ูˆุงุฌู‡ุฉ ุจุฑู…ุฌุฉ ุงู„ุชุทุจูŠู‚ุงุช ุงู„ุชุงุฑูŠุฎูŠุฉ ู„ู„ุจูˆุฑุตุฉ ุชู„ู‚ุงุฆูŠู‹ุง', - 'trading-assistant.placeholders.selectIndicator': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู…ุคุดุฑ', - 'trading-assistant.placeholders.selectExchange': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ุชุจุงุฏู„', - 'trading-assistant.placeholders.inputApiKey': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ูุชุงุญ API', - 'trading-assistant.placeholders.inputSecretKey': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ู…ูุชุงุญ ุงู„ุณุฑูŠ', - 'trading-assistant.placeholders.inputPassphrase': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนุจุงุฑุฉ ุงู„ู…ุฑูˆุฑ', - 'trading-assistant.placeholders.inputStrategyName': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงุณู… ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.placeholders.selectSymbol': 'ูŠุฑุฌู‰ ุงุฎุชูŠุงุฑ ุฒูˆุฌ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.placeholders.selectTimeframe': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ูุชุฑุฉ ุงู„ุฒู…ู†ูŠุฉ', - 'trading-assistant.placeholders.selectKlinePeriod': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ูุชุฑุฉ K-Line', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ูˆุฌู‡ ู…ุฎุตุต (ุงุฎุชูŠุงุฑูŠ)', - 'trading-assistant.validation.indicatorRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู…ุคุดุฑ', - 'trading-assistant.validation.exchangeRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ุชุจุงุฏู„', - 'trading-assistant.validation.apiKeyRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ูุชุงุญ API', - 'trading-assistant.validation.secretKeyRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ู…ูุชุงุญ ุงู„ุณุฑูŠ', - 'trading-assistant.validation.passphraseRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนุจุงุฑุฉ ุงู„ู…ุฑูˆุฑ', - 'trading-assistant.validation.exchangeConfigIncomplete': 'ูŠุฑุฌู‰ ู…ู„ุก ู…ุนู„ูˆู…ุงุช ุชูƒูˆูŠู† ุงู„ุชุจุงุฏู„ ุงู„ูƒุงู…ู„ุฉ', - 'trading-assistant.validation.testConnectionRequired': 'ูŠุฑุฌู‰ ุงู„ู†ู‚ุฑ ุนู„ู‰ ุฒุฑ "ุงุฎุชุจุงุฑ ุงู„ุงุชุตุงู„" ุฃูˆู„ุงู‹ ูˆุงู„ุชุฃูƒุฏ ู…ู† ู†ุฌุงุญ ุงู„ุงุชุตุงู„', - 'trading-assistant.validation.testConnectionFailed': 'ูุดู„ ุงุฎุชุจุงุฑ ุงู„ุงุชุตุงู„ุŒ ูŠุฑุฌู‰ ุงู„ุชุญู‚ู‚ ู…ู† ุงู„ุชูƒูˆูŠู† ูˆุฅุนุงุฏุฉ ุงู„ู…ุญุงูˆู„ุฉ', - 'trading-assistant.validation.strategyNameRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงุณู… ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.validation.symbolRequired': 'ูŠุฑุฌู‰ ุงุฎุชูŠุงุฑ ุฒูˆุฌ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.validation.initialCapitalRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุงู„ุงุณุชุซู…ุงุฑ', - 'trading-assistant.validation.leverageRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู†ุณุจุฉ ุงู„ุฑุงูุนุฉ ุงู„ู…ุงู„ูŠุฉ', - 'trading-assistant.table.time': 'ุงู„ูˆู‚ุช', - 'trading-assistant.table.type': 'ุงูƒุชุจ', - 'trading-assistant.table.price': 'ุงู„ุณุนุฑ', - 'trading-assistant.table.amount': 'ุงู„ูƒู…ูŠุฉ', - 'trading-assistant.table.value': 'ุงู„ู…ุจู„ุบ', - 'trading-assistant.table.commission': 'ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ', - 'trading-assistant.table.symbol': 'ุฒูˆุฌ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.table.side': 'ุงู„ุงุชุฌุงู‡', - 'trading-assistant.table.size': 'ูƒู…ูŠุฉ ุงู„ู…ูˆู‚ู', - 'trading-assistant.table.entryPrice': 'ุณุนุฑ ุงู„ุงูุชุชุงุญ', - 'trading-assistant.table.currentPrice': 'ุงู„ุณุนุฑ ุงู„ุญุงู„ูŠ', - 'trading-assistant.table.unrealizedPnl': 'ุงู„ุฑุจุญ ุฃูˆ ุงู„ุฎุณุงุฑุฉ ุบูŠุฑ ุงู„ู…ุญู‚ู‚ุฉ', - 'trading-assistant.table.pnlPercent': 'ู†ุณุจุฉ ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ', - 'trading-assistant.table.buy': 'ุดุฑุงุก', - 'trading-assistant.table.sell': 'ุจูŠุน', - 'trading-assistant.table.long': 'ุงุฐู‡ุจ ู„ูุชุฑุฉ ุทูˆูŠู„ุฉ', - 'trading-assistant.table.short': 'ู‚ุตูŠุฑุฉ', - 'trading-assistant.table.noPositions': 'ู„ุง ุชูˆุฌุฏ ู…ู†ุงุตุจ ุญุชู‰ ุงู„ุขู†', - 'trading-assistant.detail.title': 'ุชูุงุตูŠู„ ุงู„ุงุณุชุฑุงุชูŠุฌูŠุฉ', - 'trading-assistant.detail.strategyName': 'ุงุณู… ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.detail.strategyType': 'ู†ูˆุน ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ', - 'trading-assistant.detail.status': 'ุงู„ุญุงู„ุฉ', - 'trading-assistant.detail.tradingMode': 'ู†ู…ูˆุฐุฌ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.detail.exchange': 'ุชุจุงุฏู„', - 'trading-assistant.detail.initialCapital': 'ุฑุฃุณ ุงู„ู…ุงู„ ุงู„ุฃูˆู„ูŠ', - 'trading-assistant.detail.totalInvestment': 'ุฅุฌู…ุงู„ูŠ ู…ุจู„ุบ ุงู„ุงุณุชุซู…ุงุฑ', - 'trading-assistant.detail.currentEquity': 'ุตุงููŠ ุงู„ู‚ูŠู…ุฉ ุงู„ุญุงู„ูŠุฉ', - 'trading-assistant.detail.totalPnl': 'ุฅุฌู…ุงู„ูŠ ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ', - 'trading-assistant.detail.indicatorName': 'ุงุณู… ุงู„ู…ุคุดุฑ', - 'trading-assistant.detail.maxLeverage': 'ุงู„ุญุฏ ุงู„ุฃู‚ุตู‰ ู„ู„ุฑุงูุนุฉ ุงู„ู…ุงู„ูŠุฉ', - 'trading-assistant.detail.decideInterval': 'ุงู„ูุงุตู„ ุงู„ุฒู…ู†ูŠ ู„ู„ู‚ุฑุงุฑ', - 'trading-assistant.detail.symbols': 'ูƒุงุฆู† ุงู„ู…ุนุงู…ู„ุฉ', - 'trading-assistant.detail.createdAt': 'ูˆู‚ุช ุงู„ุฎู„ู‚', - 'trading-assistant.detail.updatedAt': 'ูˆู‚ุช ุงู„ุชุญุฏูŠุซ', - 'trading-assistant.detail.llmConfig': 'ุชูƒูˆูŠู† ู†ู…ูˆุฐุฌ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'trading-assistant.detail.exchangeConfig': 'ุชูƒูˆูŠู† ุงู„ุตุฑู', - 'trading-assistant.detail.provider': 'ู…ุฒูˆุฏ', - 'trading-assistant.detail.modelId': 'ู…ุนุฑู ุงู„ู†ู…ูˆุฐุฌ', - 'trading-assistant.detail.close': 'ุฅุบู„ุงู‚', - 'trading-assistant.detail.loadFailed': 'ูุดู„ ุงู„ุญุตูˆู„ ุนู„ู‰ ุชูุงุตูŠู„ ุงู„ุณูŠุงุณุฉ', - 'trading-assistant.equity.noData': 'ู„ุง ุชูˆุฌุฏ ุจูŠุงู†ุงุช ุนู† ุตุงููŠ ุงู„ู‚ูŠู…ุฉ ุญุชู‰ ุงู„ุขู†', - 'trading-assistant.equity.equity': 'ุตุงููŠ ุงู„ู‚ูŠู…ุฉ', - 'trading-assistant.exchange.tradingMode': 'ู†ู…ูˆุฐุฌ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.exchange.virtual': 'ู…ุญุงูƒุงุฉ ุงู„ุชุฏุงูˆู„', - 'trading-assistant.exchange.live': 'ู…ุนุงู…ู„ุฉ ุญู‚ูŠู‚ูŠุฉ', - 'trading-assistant.exchange.selectExchange': 'ุงุฎุชุฑ ุงู„ุตุฑู', - 'trading-assistant.exchange.walletAddress': 'ุนู†ูˆุงู† ุงู„ู…ุญูุธุฉ', - 'trading-assistant.exchange.walletAddressPlaceholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนู†ูˆุงู† ู…ุญูุธุชูƒ (ูŠุจุฏุฃ ุจู€ 0x)', - 'trading-assistant.exchange.privateKey': 'ู…ูุชุงุญ ุฎุงุต', - 'trading-assistant.exchange.privateKeyPlaceholder': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ู…ูุชุงุญ ุงู„ุฎุงุต (64 ุญุฑูู‹ุง)', - 'trading-assistant.exchange.testConnection': 'ุงุชุตุงู„ ุงู„ุงุฎุชุจุงุฑ', - 'trading-assistant.exchange.connectionSuccess': 'ุชู… ุงู„ุงุชุตุงู„ ุจู†ุฌุงุญ', - 'trading-assistant.exchange.connectionFailed': 'ูุดู„ ุงู„ุงุชุตุงู„', - 'trading-assistant.exchange.testFailed': 'ูุดู„ ุงุฎุชุจุงุฑ ุงู„ุงุชุตุงู„', - 'trading-assistant.exchange.fillComplete': 'ูŠุฑุฌู‰ ู…ู„ุก ู…ุนู„ูˆู…ุงุช ุชูƒูˆูŠู† ุงู„ุชุจุงุฏู„ ุงู„ูƒุงู…ู„ุฉ', - 'trading-assistant.strategyTypeOptions.ai': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุชุนุชู…ุฏ ุนู„ู‰ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'trading-assistant.strategyTypeOptions.indicator': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ู…ุคุดุฑ ุงู„ูู†ูŠ', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'ุฅู† ูˆุธูŠูุฉ ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ู…ุจู†ูŠุฉ ุนู„ู‰ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ู‚ูŠุฏ ุงู„ุชุทูˆูŠุฑุŒ ู„ุฐุง ุชุฑู‚ุจูˆุง ุฐู„ูƒ', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'ู…ูŠุฒุงุช ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ู…ุนุชู…ุฏุฉ ุนู„ู‰ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ู‚ูŠุฏ ุงู„ุชุทูˆูŠุฑ', - 'trading-assistant.indicatorType.trend': 'ุงู„ุงุชุฌุงู‡', - 'trading-assistant.indicatorType.momentum': 'ุงู„ุฒุฎู…', - 'trading-assistant.indicatorType.volatility': 'ุงู„ุชู‚ู„ุจ', - 'trading-assistant.indicatorType.volume': 'ุงู„ุญุฌู…', - 'trading-assistant.indicatorType.custom': 'ุชุฎุตูŠุต', - 'trading-assistant.exchangeNames': { - 'okx': 'ุฃูˆูƒูŠ ุฅูƒุณ', - 'binance': 'ุจูŠู†ุงู†ุณ', - 'hyperliquid': 'ุงู„ุณุงุฆู„ ุงู„ุฒุงุฆุฏ', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'ูƒูˆูŠู† ุจูŠุณ', - 'gate': 'ุจูˆุงุจุฉ.io', - 'mexc': 'ู…ูŠูƒุณูƒ', - 'kraken': 'ูƒุฑุงูƒู†', - 'bitfinex': 'ุจูŠุชููŠู†ูƒุณ', - 'bybit': 'ุจุงูŠุจูŠุช', - 'kucoin': 'ูƒูŠูˆ ูƒูˆูŠู†', - 'huobi': 'ู‡ูˆุจูŠ', - 'bitget': 'ุจูŠุชุฌูŠุช', - 'bitmex': 'ุจูŠุชู…ูŠูƒุณ', - 'deribit': 'ุฏูŠุฑุจูŠุช', - 'phemex': 'ููŠู…ูŠูƒุณ', - 'bitmart': 'ุจูŠุชู…ุงุฑุช', - 'bitstamp': 'ุจูŠุชุณุชุงู…ุจ', - 'bittrex': 'ุจูŠุชุฑูŠูƒุณ', - 'poloniex': 'ุจูˆู„ูˆู†ูŠูƒุณ', - 'gemini': 'ุงู„ุฌูˆุฒุงุก', - 'cryptocom': 'ุชุดููŠุฑ.ูƒูˆู…', - 'bitflyer': 'bitFlyer', - 'upbit': 'ุฃูˆุจูŠุช', - 'bithumb': 'ุจูŠุชู‡ุงู…ุจ', - 'coinone': 'ุนู…ู„ุฉ ูˆุงุญุฏุฉ', - 'zb': 'ZB', - 'lbank': 'ุจู†ูƒ ุฅู„', - 'bibox': 'ุจูŠุจูˆูƒุณ', - 'bigone': 'BigONE', - 'bitrue': 'ุตุญูŠุญ', - 'coinex': 'ูƒูˆูŠู† ุฅูƒุณ', - 'digifinex': 'DigiFinex', - 'ftx': 'ุฅู ุชูŠ ุฅูƒุณ', - 'ftxus': 'ุฅู ุชูŠ ุฅูƒุณ ุงู„ูˆู„ุงูŠุงุช ุงู„ู…ุชุญุฏุฉ', - 'binanceus': 'ุจูŠู†ุงู†ุณ ุงู„ูˆู„ุงูŠุงุช ุงู„ู…ุชุญุฏุฉ', - 'binancecoinm': 'ุนู…ู„ุฉ ุจูŠู†ุงู†ุณ-M', - 'binanceusdm': 'Binance USDโ“ˆ-M', - 'deepcoin': 'ุฏูŠุจูƒูˆูŠู†' - }, - 'ai-trading-assistant.title': 'ู…ุณุงุนุฏ ุงู„ุชุฏุงูˆู„ ุจุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'ai-trading-assistant.strategyList': 'ู‚ุงุฆู…ุฉ ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ', - 'ai-trading-assistant.createStrategy': 'ุฅู†ุดุงุก ุณูŠุงุณุฉ', - 'ai-trading-assistant.noStrategy': 'ู„ุง ุชูˆุฌุฏ ุงุณุชุฑุงุชูŠุฌูŠุฉ ุญุชู‰ ุงู„ุขู†', - 'ai-trading-assistant.selectStrategy': 'ูŠุฑุฌู‰ ุชุญุฏูŠุฏ ุงุณุชุฑุงุชูŠุฌูŠุฉ ู…ู† ุงู„ูŠุณุงุฑ ู„ุนุฑุถ ุงู„ุชูุงุตูŠู„', - 'ai-trading-assistant.startStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุฅุทู„ุงู‚', - 'ai-trading-assistant.stopStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุชูˆู‚ู', - 'ai-trading-assistant.editStrategy': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุชุญุฑูŠุฑ', - 'ai-trading-assistant.deleteStrategy': 'ุญุฐู ุงู„ุณูŠุงุณุฉ', - 'ai-trading-assistant.status.running': 'ุงู„ุฌุฑูŠ', - 'ai-trading-assistant.status.stopped': 'ุชูˆู‚ู', - 'ai-trading-assistant.status.error': 'ุฎุทุฃ', - 'ai-trading-assistant.tabs.tradingRecords': 'ุชุงุฑูŠุฎ ุงู„ู…ุนุงู…ู„ุฉ', - 'ai-trading-assistant.tabs.positions': 'ุณุฌู„ ุงู„ู…ูˆู‚ู', - 'ai-trading-assistant.tabs.aiDecisions': 'ุณุฌู„ ู‚ุฑุงุฑ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'ai-trading-assistant.tabs.equityCurve': 'ู…ู†ุญู†ู‰ ุงู„ุฃุณู‡ู…', - 'ai-trading-assistant.form.createTitle': 'ุฅู†ุดุงุก ุงุณุชุฑุงุชูŠุฌูŠุงุช ุงู„ุชุฏุงูˆู„ ุจุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'ai-trading-assistant.form.editTitle': 'ุชุญุฑูŠุฑ ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุชุฏุงูˆู„ ุจุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'ai-trading-assistant.form.strategyName': 'ุงุณู… ุงู„ุณูŠุงุณุฉ', - 'ai-trading-assistant.form.modelId': 'ู†ู…ูˆุฐุฌ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'ai-trading-assistant.form.modelIdHint': 'ุงุณุชุฎุฏู… ุฎุฏู…ุฉ OpenRouter ุงู„ุฎุงุตุฉ ุจุงู„ู†ุธุงู… ุฏูˆู† ุชูƒูˆูŠู† ู…ูุชุงุญ API', - 'ai-trading-assistant.form.decideInterval': 'ุงู„ูุงุตู„ ุงู„ุฒู…ู†ูŠ ู„ู„ู‚ุฑุงุฑ', - 'ai-trading-assistant.form.decideInterval5m': '5 ุฏู‚ุงุฆู‚', - 'ai-trading-assistant.form.decideInterval10m': '10 ุฏู‚ุงุฆู‚', - 'ai-trading-assistant.form.decideInterval30m': '30 ุฏู‚ูŠู‚ุฉ', - 'ai-trading-assistant.form.decideInterval1h': '1 ุณุงุนุฉ', - 'ai-trading-assistant.form.decideInterval4h': '4 ุณุงุนุงุช', - 'ai-trading-assistant.form.decideInterval1d': 'ูŠูˆู… ูˆุงุญุฏ', - 'ai-trading-assistant.form.decideInterval1w': '1 ุฃุณุจูˆุน', - 'ai-trading-assistant.form.decideIntervalHint': 'ุงู„ูุงุตู„ ุงู„ุฒู…ู†ูŠ ู„ู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ู„ุงุชุฎุงุฐ ุงู„ู‚ุฑุงุฑุงุช', - 'ai-trading-assistant.form.runPeriod': 'ุชุดุบูŠู„ ุฏูˆุฑุฉ', - 'ai-trading-assistant.form.runPeriodHint': 'ูˆู‚ุช ุงู„ุจุฏุก ูˆูˆู‚ุช ุงู„ุงู†ุชู‡ุงุก ู„ุชุดุบูŠู„ ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ', - 'ai-trading-assistant.form.startDate': 'ุชุงุฑูŠุฎ ุงู„ุจุฏุก', - 'ai-trading-assistant.form.endDate': 'ุชุงุฑูŠุฎ ุงู„ุงู†ุชู‡ุงุก', - 'ai-trading-assistant.form.qdtCostTitle': 'ุชุนู„ูŠู…ุงุช ุฎุตู… QDT', - 'ai-trading-assistant.form.qdtCostHint': 'ุณูŠุชู… ุฎุตู… {cost} QDT ู„ูƒู„ ู‚ุฑุงุฑ ู„ู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ. ูŠุฑุฌู‰ ุงู„ุชุฃูƒุฏ ู…ู† ุฃู† ุญุณุงุจูƒ ูŠุญุชูˆูŠ ุนู„ู‰ ุฑุตูŠุฏ QDT ูƒุงูู. ุฃุซู†ุงุก ุชู†ููŠุฐ ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉุŒ ุณูŠุชู… ุฎุตู… ุงู„ุฑุณูˆู… ููŠ ุงู„ูˆู‚ุช ุงู„ูุนู„ูŠ ู„ูƒู„ ู‚ุฑุงุฑ.', - 'ai-trading-assistant.form.apiKey': 'ู…ูุชุงุญ ูˆุงุฌู‡ุฉ ุจุฑู…ุฌุฉ ุงู„ุชุทุจูŠู‚ุงุช', - 'ai-trading-assistant.form.exchange': 'ุงุฎุชุฑ ุงู„ุตุฑู', - 'ai-trading-assistant.form.secretKey': 'ุงู„ู…ูุชุงุญ ุงู„ุณุฑูŠ', - 'ai-trading-assistant.form.passphrase': 'ุนุจุงุฑุฉ ุงู„ู…ุฑูˆุฑ', - 'ai-trading-assistant.form.testConnection': 'ุงุชุตุงู„ ุงู„ุงุฎุชุจุงุฑ', - 'ai-trading-assistant.form.symbol': 'ุฒูˆุฌ ุงู„ุชุฏุงูˆู„', - 'ai-trading-assistant.form.symbolHint': 'ุญุฏุฏ ุฒูˆุฌ ุงู„ุชุฏุงูˆู„ ู„ู„ุชุฏุงูˆู„', - 'ai-trading-assistant.form.initialCapital': 'ุงู„ู…ุจู„ุบ ุงู„ู…ุณุชุซู…ุฑ (ุงู„ู‡ุงู…ุด)', - 'ai-trading-assistant.form.leverage': 'ุงู„ุงุณุชูุงุฏุฉ ุงู„ู…ุชุนุฏุฏุฉ', - 'ai-trading-assistant.form.timeframe': 'ุงู„ูุชุฑุฉ ุงู„ุฒู…ู†ูŠุฉ', - 'ai-trading-assistant.form.timeframe1m': '1 ุฏู‚ูŠู‚ุฉ', - 'ai-trading-assistant.form.timeframe5m': '5 ุฏู‚ุงุฆู‚', - 'ai-trading-assistant.form.timeframe15m': '15 ุฏู‚ูŠู‚ุฉ', - 'ai-trading-assistant.form.timeframe30m': '30 ุฏู‚ูŠู‚ุฉ', - 'ai-trading-assistant.form.timeframe1H': '1 ุณุงุนุฉ', - 'ai-trading-assistant.form.timeframe4H': '4 ุณุงุนุงุช', - 'ai-trading-assistant.form.timeframe1D': 'ูŠูˆู… ูˆุงุญุฏ', - 'ai-trading-assistant.form.marketType': 'ู†ูˆุน ุงู„ุณูˆู‚', - 'ai-trading-assistant.form.marketTypeFutures': 'ุงู„ุนู‚ุฏ', - 'ai-trading-assistant.form.marketTypeSpot': 'ุจู‚ุนุฉ', - 'ai-trading-assistant.form.totalPnl': 'ุฅุฌู…ุงู„ูŠ ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ', - 'ai-trading-assistant.form.customPrompt': 'ูƒู„ู…ุงุช ู…ูˆุฌู‡ุฉ ู…ุฎุตุตุฉ', - 'ai-trading-assistant.form.customPromptHint': 'ุงุฎุชูŠุงุฑูŠุŒ ูŠูุณุชุฎุฏู… ู„ุชุฎุตูŠุต ุงุณุชุฑุงุชูŠุฌูŠุงุช ุงู„ุชุฏุงูˆู„ ุจุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ ูˆู…ู†ุทู‚ ุงุชุฎุงุฐ ุงู„ู‚ุฑุงุฑ', - 'ai-trading-assistant.form.cancel': 'ุฅู„ุบุงุก', - 'ai-trading-assistant.form.prev': 'ุงู„ุฎุทูˆุฉ ุงู„ุณุงุจู‚ุฉ', - 'ai-trading-assistant.form.next': 'ุงู„ุฎุทูˆุฉ ุงู„ุชุงู„ูŠุฉ', - 'ai-trading-assistant.form.confirmCreate': 'ุชุฃูƒูŠุฏ ุงู„ุฅู†ุดุงุก', - 'ai-trading-assistant.form.confirmEdit': 'ุชุฃูƒูŠุฏ ุงู„ุชุบูŠูŠุฑุงุช', - 'ai-trading-assistant.messages.createSuccess': 'ุชู… ุฅู†ุดุงุก ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุจู†ุฌุงุญ', - 'ai-trading-assistant.messages.createFailed': 'ูุดู„ ููŠ ุฅู†ุดุงุก ุงู„ุณูŠุงุณุฉ', - 'ai-trading-assistant.messages.updateSuccess': 'ุชู… ุชุญุฏูŠุซ ุงู„ุณูŠุงุณุฉ ุจู†ุฌุงุญ', - 'ai-trading-assistant.messages.updateFailed': 'ูุดู„ ุชุญุฏูŠุซ ุงู„ุณูŠุงุณุฉ', - 'ai-trading-assistant.messages.deleteSuccess': 'ุชู… ุญุฐู ุงู„ุณูŠุงุณุฉ ุจู†ุฌุงุญ', - 'ai-trading-assistant.messages.deleteFailed': 'ูุดู„ ุณูŠุงุณุฉ ุงู„ุญุฐู', - 'ai-trading-assistant.messages.startSuccess': 'ุจุฏุฃุช ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุจู†ุฌุงุญ', - 'ai-trading-assistant.messages.startFailed': 'ูุดู„ ููŠ ุจุฏุก ุงู„ุณูŠุงุณุฉ', - 'ai-trading-assistant.messages.stopSuccess': 'ุชู… ุฅูŠู‚ุงู ุงู„ุฅุณุชุฑุงุชูŠุฌูŠุฉ ุจู†ุฌุงุญ', - 'ai-trading-assistant.messages.stopFailed': 'ูุดู„ุช ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุชูˆู‚ู', - 'ai-trading-assistant.messages.loadFailed': 'ูุดู„ ุงู„ุญุตูˆู„ ุนู„ู‰ ู‚ุงุฆู…ุฉ ุงู„ุณูŠุงุณุงุช', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'ูุดู„ ููŠ ุงู„ุญุตูˆู„ ุนู„ู‰ ุณุฌู„ ู‚ุฑุงุฑ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'ai-trading-assistant.messages.deleteConfirm': 'ู‡ู„ ุฃู†ุช ู…ุชุฃูƒุฏ ุฃู†ูƒ ุชุฑูŠุฏ ุญุฐู ู‡ุฐู‡ ุงู„ุณูŠุงุณุฉุŸ ู‡ุฐู‡ ุงู„ุนู…ู„ูŠุฉ ู„ุง ุฑุฌุนุฉ ููŠู‡ุง.', - 'ai-trading-assistant.placeholders.inputStrategyName': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงุณู… ุงู„ุณูŠุงุณุฉ', - 'ai-trading-assistant.placeholders.selectModelId': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู†ู…ูˆุฐุฌ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ูุงุตู„ ุงู„ุฒู…ู†ูŠ ู„ู„ู‚ุฑุงุฑ', - 'ai-trading-assistant.placeholders.startTime': 'ูˆู‚ุช ุงู„ุจุฏุก', - 'ai-trading-assistant.placeholders.endTime': 'ูˆู‚ุช ุงู„ู†ู‡ุงูŠุฉ', - 'ai-trading-assistant.placeholders.inputApiKey': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ูุชุงุญ API', - 'ai-trading-assistant.placeholders.selectExchange': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ุชุจุงุฏู„', - 'ai-trading-assistant.placeholders.inputSecretKey': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ู…ูุชุงุญ ุงู„ุณุฑูŠ', - 'ai-trading-assistant.placeholders.inputPassphrase': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุนุจุงุฑุฉ ุงู„ู…ุฑูˆุฑ', - 'ai-trading-assistant.placeholders.selectSymbol': 'ูŠุฑุฌู‰ ุชุญุฏูŠุฏ ุฒูˆุฌ ุชุฏุงูˆู„ุŒ ู…ุซู„: BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ูุชุฑุฉ ุงู„ุฒู…ู†ูŠุฉ', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ูƒู„ู…ุฉ ู…ุทุงู„ุจุฉ ู…ุฎุตุตุฉ (ุงุฎุชูŠุงุฑูŠ)', - 'ai-trading-assistant.validation.strategyNameRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงุณู… ุงู„ุณูŠุงุณุฉ', - 'ai-trading-assistant.validation.modelIdRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ู†ู…ูˆุฐุฌ ุงู„ุฐูƒุงุก ุงู„ุงุตุทู†ุงุนูŠ', - 'ai-trading-assistant.validation.runPeriodRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุฏูˆุฑุฉ ุงู„ุชุดุบูŠู„', - 'ai-trading-assistant.validation.apiKeyRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ูุชุงุญ API', - 'ai-trading-assistant.validation.exchangeRequired': 'ุงู„ุฑุฌุงุก ุชุญุฏูŠุฏ ุงู„ุชุจุงุฏู„', - 'ai-trading-assistant.validation.secretKeyRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุงู„ู…ูุชุงุญ ุงู„ุณุฑูŠ', - 'ai-trading-assistant.validation.symbolRequired': 'ูŠุฑุฌู‰ ุงุฎุชูŠุงุฑ ุฒูˆุฌ ุงู„ุชุฏุงูˆู„', - 'ai-trading-assistant.validation.initialCapitalRequired': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ู…ุจู„ุบ ุงู„ุงุณุชุซู…ุงุฑ', - 'ai-trading-assistant.table.time': 'ุงู„ูˆู‚ุช', - 'ai-trading-assistant.table.type': 'ุงูƒุชุจ', - 'ai-trading-assistant.table.price': 'ุงู„ุณุนุฑ', - 'ai-trading-assistant.table.amount': 'ุงู„ูƒู…ูŠุฉ', - 'ai-trading-assistant.table.value': 'ุงู„ู…ุจู„ุบ', - 'ai-trading-assistant.table.symbol': 'ุฒูˆุฌ ุงู„ุชุฏุงูˆู„', - 'ai-trading-assistant.table.side': 'ุงู„ุงุชุฌุงู‡', - 'ai-trading-assistant.table.size': 'ูƒู…ูŠุฉ ุงู„ู…ูˆู‚ู', - 'ai-trading-assistant.table.entryPrice': 'ุณุนุฑ ุงู„ุงูุชุชุงุญ', - 'ai-trading-assistant.table.currentPrice': 'ุงู„ุณุนุฑ ุงู„ุญุงู„ูŠ', - 'ai-trading-assistant.table.unrealizedPnl': 'ุงู„ุฑุจุญ ุฃูˆ ุงู„ุฎุณุงุฑุฉ ุบูŠุฑ ุงู„ู…ุญู‚ู‚ุฉ', - 'ai-trading-assistant.table.profit': 'ุงู„ุฑุจุญ ูˆุงู„ุฎุณุงุฑุฉ', - 'ai-trading-assistant.table.openLong': 'ู…ูุชูˆุญ ู„ูุชุฑุฉ ุทูˆูŠู„ุฉ', - 'ai-trading-assistant.table.closeLong': 'ุจูŠู†ุฏูˆ', - 'ai-trading-assistant.table.openShort': 'ูุชุญ ู‚ุตูŠุฑุฉ', - 'ai-trading-assistant.table.closeShort': 'ูุงุฑุบ', - 'ai-trading-assistant.table.addLong': 'ุบุงุฏูˆุช', - 'ai-trading-assistant.table.addShort': 'ุฅุถุงูุฉ ู‚ุตูŠุฑุฉ', - 'ai-trading-assistant.table.closeShortProfit': 'ุฌู†ูŠ ุงู„ุฃุฑุจุงุญ ู…ู† ุงู„ู…ุฑูƒุฒ ุงู„ู‚ุตูŠุฑ', - 'ai-trading-assistant.table.closeShortStop': 'ูˆู‚ู ุงู„ุฎุณุงุฑุฉ', - 'ai-trading-assistant.table.closeLongProfit': 'ุชูˆู‚ู ู„ูุชุฑุฉ ุทูˆูŠู„ุฉ ูˆุฌู†ูŠ ุงู„ุฃุฑุจุงุญ', - 'ai-trading-assistant.table.closeLongStop': 'ูˆู‚ู ุงู„ุฎุณุงุฑุฉ', - 'ai-trading-assistant.table.buy': 'ุดุฑุงุก', - 'ai-trading-assistant.table.sell': 'ุจูŠุน', - 'ai-trading-assistant.table.long': 'ุงุฐู‡ุจ ู„ูุชุฑุฉ ุทูˆูŠู„ุฉ', - 'ai-trading-assistant.table.short': 'ู‚ุตูŠุฑุฉ', - 'ai-trading-assistant.table.hold': 'ุนู‚ุฏ', - 'ai-trading-assistant.table.reasoning': 'ุณุจุจ ุงู„ุชุญู„ูŠู„', - 'ai-trading-assistant.table.decisions': 'ุตู†ุน ุงู„ู‚ุฑุงุฑ', - 'ai-trading-assistant.table.riskAssessment': 'ุชู‚ูŠูŠู… ุงู„ู…ุฎุงุทุฑ', - 'ai-trading-assistant.table.confidence': 'ุงู„ุซู‚ุฉ', - 'ai-trading-assistant.table.totalRecords': '{total} ุงู„ุณุฌู„ุงุช ููŠ ุงู„ู…ุฌู…ูˆุน', - 'ai-trading-assistant.table.noPositions': 'ู„ุง ุชูˆุฌุฏ ู…ู†ุงุตุจ ุญุชู‰ ุงู„ุขู†', - 'ai-trading-assistant.detail.title': 'ุชูุงุตูŠู„ ุงู„ุงุณุชุฑุงุชูŠุฌูŠุฉ', - 'ai-trading-assistant.equity.noData': 'ู„ุง ุชูˆุฌุฏ ุจูŠุงู†ุงุช ุนู† ุตุงููŠ ุงู„ู‚ูŠู…ุฉ ุญุชู‰ ุงู„ุขู†', - 'ai-trading-assistant.equity.equity': 'ุตุงููŠ ุงู„ู‚ูŠู…ุฉ', - 'ai-trading-assistant.exchange.testFailed': 'ูุดู„ ุงุฎุชุจุงุฑ ุงู„ุงุชุตุงู„', - 'ai-trading-assistant.exchange.connectionSuccess': 'ุชู… ุงู„ุงุชุตุงู„ ุจู†ุฌุงุญ', - 'ai-trading-assistant.exchange.connectionFailed': 'ูุดู„ ุงู„ุงุชุตุงู„', - 'ai-trading-assistant.form.advancedSettings': 'ุงู„ุฅุนุฏุงุฏุงุช ุงู„ู…ุชู‚ุฏู…ุฉ', - 'ai-trading-assistant.form.orderMode': 'ูˆุถุน ุงู„ุทู„ุจ', - 'ai-trading-assistant.form.orderModeMaker': 'ุตุงู†ุน', - 'ai-trading-assistant.form.orderModeTaker': 'ุณุนุฑ ุงู„ุณูˆู‚ (ุงู„ู…ุชู„ู‚ูŠ)', - 'ai-trading-assistant.form.orderModeHint': 'ูŠุณุชุฎุฏู… ูˆุถุน ุงู„ุฃู…ุฑ ุงู„ู…ุนู„ู‚ ุฃูˆุงู…ุฑ ุงู„ุญุฏ ูˆุชูƒูˆู† ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ ุฃู‚ู„ุ› ูŠุชู… ุชู†ููŠุฐ ูˆุถุน ุณุนุฑ ุงู„ุณูˆู‚ ุนู„ู‰ ุงู„ููˆุฑ ูˆุชูƒูˆู† ุฑุณูˆู… ุงู„ู…ู†ุงูˆู„ุฉ ุฃุนู„ู‰.', - 'ai-trading-assistant.form.makerWaitSec': 'ูˆู‚ุช ุงู„ุงู†ุชุธุงุฑ ู„ู„ุฃูˆุงู…ุฑ ุงู„ู…ุนู„ู‚ุฉ (ุซูˆุงู†ูŠ)', - 'ai-trading-assistant.form.makerWaitSecHint': 'ุงู„ูˆู‚ุช ุงู„ู„ุงุฒู… ู„ุงู†ุชุธุงุฑ ุงู„ู…ุนุงู…ู„ุฉ ุจุนุฏ ุชู‚ุฏูŠู… ุงู„ุทู„ุจ. ู‚ู… ุจุงู„ุฅู„ุบุงุก ูˆุญุงูˆู„ ู…ุฑุฉ ุฃุฎุฑู‰ ุจุนุฏ ุงู†ุชู‡ุงุก ุงู„ู…ู‡ู„ุฉ.', - 'ai-trading-assistant.form.makerRetries': 'ุนุฏุฏ ู…ุฑุงุช ุฅุนุงุฏุฉ ุงู„ู…ุญุงูˆู„ุฉ ู„ู„ุฃูˆุงู…ุฑ ุงู„ู…ุนู„ู‚ุฉ', - 'ai-trading-assistant.form.makerRetriesHint': 'ุงู„ุญุฏ ุงู„ุฃู‚ุตู‰ ู„ุนุฏุฏ ู…ุฑุงุช ุฅุนุงุฏุฉ ุงู„ู…ุญุงูˆู„ุฉ ุนู†ุฏู…ุง ู„ุง ูŠุชู… ุชู†ููŠุฐ ุงู„ุฃู…ุฑ ุงู„ู…ุนู„ู‚', - 'ai-trading-assistant.form.fallbackToMarket': 'ูŠูุดู„ ุงู„ุฃู…ุฑ ุงู„ู…ุนู„ู‚ ูˆูŠุชู… ุชุฎููŠุถ ุณุนุฑ ุงู„ุณูˆู‚.', - 'ai-trading-assistant.form.fallbackToMarketHint': 'ุนู†ุฏู…ุง ู„ุง ูŠุชู… ุฅูƒู…ุงู„ ุฃู…ุฑ ุงู„ูุชุญ/ุงู„ุฅุบู„ุงู‚ ุงู„ู…ุนู„ู‚ุŒ ู…ุง ุฅุฐุง ูƒุงู† ูŠู†ุจุบูŠ ุชุฎููŠุถู‡ ุฅู„ู‰ ุฃู…ุฑ ุณูˆู‚ ู„ุถู…ุงู† ุงูƒุชู…ุงู„ ุงู„ู…ุนุงู…ู„ุฉ.', - 'ai-trading-assistant.form.marginMode': 'ูˆุถุน ุงู„ู‡ุงู…ุด', - 'ai-trading-assistant.form.marginModeCross': 'ู…ุณุชูˆุฏุน ูƒุงู…ู„', - 'ai-trading-assistant.form.marginModeIsolated': 'ู…ูˆู‚ู ู…ุนุฒูˆู„', - 'ai-analysis.title': 'ู…ุญุฑูƒ ุงู„ุชุฏุงูˆู„ ุงู„ูƒู…ูŠ', - 'ai-analysis.system.online': 'ุนู„ู‰ ุงู„ุงู†ุชุฑู†ุช', - 'ai-analysis.system.agents': 'ูˆูƒูŠู„', - 'ai-analysis.system.active': 'ู†ุดุท', - 'ai-analysis.system.stage': 'ุงู„ู…ุฑุญู„ุฉ', - 'ai-analysis.panel.roster': 'ุชุดูƒูŠู„ุฉ ุงู„ูˆูƒูŠู„', - 'ai-analysis.panel.thinking': 'ุฃููƒุฑ...', - 'ai-analysis.panel.done': 'ูƒุงู…ู„', - 'ai-analysis.panel.standby': 'ุงู„ุงุณุชุนุฏุงุฏ', - 'ai-analysis.input.title': 'ู…ุญุฑูƒ ุงู„ุชุฏุงูˆู„ ุงู„ูƒู…ูŠ', - 'ai-analysis.input.placeholder': 'ุญุฏุฏ ุงู„ุฃุตูˆู„ ุงู„ู…ุณุชู‡ุฏูุฉ (ู…ุซู„ BTC/USDT)', - 'ai-analysis.input.watchlist': 'ุงู„ุฃุณู‡ู… ุงู„ุงุฎุชูŠุงุฑูŠุฉ', - 'ai-analysis.input.start': 'ุงุจุฏุฃ ุงู„ุชุญู„ูŠู„', - 'ai-analysis.input.recent': 'ุงู„ู…ู‡ุงู… ุงู„ุฃุฎูŠุฑุฉ:', - 'ai-analysis.vis.stage': 'ุงู„ู…ุฑุญู„ุฉ', - 'ai-analysis.vis.processing': 'ุงู„ู…ุนุงู„ุฌุฉ', - 'ai-analysis.result.complete': 'ุงูƒุชู…ู„ ุงู„ุชุญู„ูŠู„', - 'ai-analysis.result.signal': 'ุงู„ุฅุดุงุฑุฉ ุงู„ู†ู‡ุงุฆูŠุฉ', - 'ai-analysis.result.confidence': 'ุงู„ุซู‚ุฉ:', - 'ai-analysis.result.new': 'ุชุญู„ูŠู„ ุฌุฏูŠุฏ', - 'ai-analysis.result.full': 'ุนุฑุถ ุงู„ุชู‚ุฑูŠุฑ ูƒุงู…ู„ุง', - 'ai-analysis.logs.title': 'ุณุฌู„ ุงู„ู†ุธุงู…', - 'ai-analysis.modal.title': 'ุชู‚ุฑูŠุฑ ุณุฑูŠ', - 'ai-analysis.modal.fundamental': 'ุงู„ุชุญู„ูŠู„ ุงู„ุฃุณุงุณูŠ', - 'ai-analysis.modal.technical': 'ุงู„ุชุญู„ูŠู„ ุงู„ูู†ูŠ', - 'ai-analysis.modal.sentiment': 'ุงู„ุชุญู„ูŠู„ ุงู„ุนุงุทููŠ', - 'ai-analysis.modal.risk': 'ุชู‚ูŠูŠู… ุงู„ู…ุฎุงุทุฑ', - 'ai-analysis.stage.idle': 'ุงู„ุงุณุชุนุฏุงุฏ', - 'ai-analysis.stage.1': 'ุงู„ู…ุฑุญู„ุฉ ุงู„ุฃูˆู„ู‰: ุงู„ุชุญู„ูŠู„ ู…ุชุนุฏุฏ ุงู„ุฃุจุนุงุฏ', - 'ai-analysis.stage.2': 'ุงู„ู…ุฑุญู„ุฉ ุงู„ุซุงู†ูŠุฉ: ุงู„ู…ู†ุงู‚ุดุฉ ุงู„ุทูˆูŠู„ุฉ ูˆุงู„ู‚ุตูŠุฑุฉ', - 'ai-analysis.stage.3': 'ุงู„ู…ุฑุญู„ุฉ ุงู„ุซุงู„ุซุฉ: ุงู„ุชุฎุทูŠุท ุงู„ุงุณุชุฑุงุชูŠุฌูŠ', - 'ai-analysis.stage.4': 'ุงู„ู…ุฑุญู„ุฉ ุงู„ุฑุงุจุนุฉ: ู…ุฑุงุฌุนุฉ ู…ุฑุงู‚ุจุฉ ุงู„ู…ุฎุงุทุฑ', - 'ai-analysis.stage.complete': 'ูƒุงู…ู„', - 'ai-analysis.agent.investment_director': 'ู…ุฏูŠุฑ ุงู„ุงุณุชุซู…ุงุฑ', - 'ai-analysis.agent.role.investment_director': 'ุชุญู„ูŠู„ ุดุงู…ู„ ูˆุงุณุชู†ุชุงุฌ ู†ู‡ุงุฆูŠ', - 'ai-analysis.agent.market': 'ู…ุญู„ู„ ุงู„ุณูˆู‚', - 'ai-analysis.agent.role.market': 'ุงู„ุชูƒู†ูˆู„ูˆุฌูŠุง ูˆุจูŠุงู†ุงุช ุงู„ุณูˆู‚', - 'ai-analysis.agent.fundamental': 'ู…ุญู„ู„ ุฃุณุงุณูŠ', - 'ai-analysis.agent.role.fundamental': 'ุงู„ุชู…ูˆูŠู„ ูˆุงู„ุชู‚ูŠูŠู…', - 'ai-analysis.agent.technical': 'ู…ุญู„ู„ ูู†ูŠ', - 'ai-analysis.agent.role.technical': 'ุงู„ู…ุคุดุฑุงุช ุงู„ูู†ูŠุฉ ูˆุงู„ุฑุณูˆู… ุงู„ุจูŠุงู†ูŠุฉ', - 'ai-analysis.agent.news': 'ู…ุญู„ู„ ุงุฎุจุงุฑ', - 'ai-analysis.agent.role.news': 'ู…ุฑุดุญ ุงู„ุฃุฎุจุงุฑ ุงู„ุนุงู„ู…ูŠุฉ', - 'ai-analysis.agent.sentiment': 'ู…ุญู„ู„ ุงู„ู…ุดุงุนุฑ', - 'ai-analysis.agent.role.sentiment': 'ุงู„ุงุฌุชู…ุงุนูŠุฉ ูˆุงู„ุนุงุทููŠุฉ', - 'ai-analysis.agent.risk': 'ู…ุญู„ู„ ุงู„ู…ุฎุงุทุฑ', - 'ai-analysis.agent.role.risk': 'ูุญุต ุงู„ู…ุฎุงุทุฑ ุงู„ุฃุณุงุณูŠุฉ', - 'ai-analysis.agent.bull': 'ุงู„ุจุงุญุซ ุงู„ุตุงุนุฏ', - 'ai-analysis.agent.role.bull': 'ุงู„ุชุนุฏูŠู† ู…ุญูุฒ ุงู„ู†ู…ูˆ', - 'ai-analysis.agent.bear': 'ุงู„ุจุงุญุซ ุงู„ู‡ุงุจุท', - 'ai-analysis.agent.role.bear': 'ุญูุฑ ุงู„ู…ุฎุงุทุฑ ูˆุงู„ุนูŠูˆุจ', - 'ai-analysis.agent.manager': 'ู…ุฏูŠุฑ ุงู„ุจุญูˆุซ', - 'ai-analysis.agent.role.manager': 'ู…ุดุฑู ุงู„ู…ู†ุงู‚ุดุฉ', - 'ai-analysis.agent.trader': 'ุชุงุฌุฑ', - 'ai-analysis.agent.role.trader': 'ุงุณุชุฑุงุชูŠุฌูŠ ุชู†ููŠุฐูŠ', - 'ai-analysis.agent.risky': 'ู…ุญู„ู„ ู†ุงุดุท', - 'ai-analysis.agent.role.risky': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุนุฏูˆุงู†ูŠุฉ', - 'ai-analysis.agent.neutral': 'ู…ุญู„ู„ ุงู„ุชูˆุงุฒู†', - 'ai-analysis.agent.role.neutral': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ุงู„ุชูˆุงุฒู†', - 'ai-analysis.agent.safe': 'ู…ุญู„ู„ ู…ุญุงูุธ', - 'ai-analysis.agent.role.safe': 'ุงุณุชุฑุงุชูŠุฌูŠุฉ ู…ุญุงูุธุฉ', - 'ai-analysis.agent.cro': 'ู…ุฏูŠุฑ ู…ุฑุงู‚ุจุฉ ุงู„ู…ุฎุงุทุฑ (CRO)', - 'ai-analysis.agent.role.cro': 'ุณู„ุทุฉ ุงุชุฎุงุฐ ุงู„ู‚ุฑุงุฑ ุงู„ู†ู‡ุงุฆูŠ', - 'ai-analysis.script.market': 'ุฌุงุฑู ุฌู„ุจ ุจูŠุงู†ุงุช OHLCV ู…ู† ุงู„ุจูˆุฑุตุงุช ุงู„ุฑุฆูŠุณูŠุฉ...', - 'ai-analysis.script.fundamental': 'ุงุณุชุฎุฑุงุฌ ุงู„ุชู‚ุงุฑูŠุฑ ุงู„ู…ุงู„ูŠุฉ ุงู„ุฑุจุน ุณู†ูˆูŠุฉ...', - 'ai-analysis.script.technical': 'ุชุญู„ูŠู„ ุงู„ู…ุคุดุฑุงุช ุงู„ูู†ูŠุฉ ูˆุฃู†ู…ุงุท ุงู„ุฑุณู… ุงู„ุจูŠุงู†ูŠ.', - 'ai-analysis.script.news': 'ู…ุชุงุจุนุฉ ุงู„ุฃุฎุจุงุฑ ุงู„ู…ุงู„ูŠุฉ ุงู„ุนุงู„ู…ูŠุฉ...', - 'ai-analysis.script.sentiment': 'ุชุญู„ูŠู„ ุงุชุฌุงู‡ุงุช ูˆุณุงุฆู„ ุงู„ุชูˆุงุตู„ ุงู„ุงุฌุชู…ุงุนูŠ...', - 'ai-analysis.script.risk': 'ุญุณุงุจ ุงู„ุชู‚ู„ุจุงุช ุงู„ุชุงุฑูŠุฎูŠุฉ...', - 'invite.inviteLink': 'ุฑุงุจุท ุงู„ุฏุนูˆุฉ', - 'invite.copy': 'ุงู†ุณุฎ ุงู„ุฑุงุจุท', - 'invite.copySuccess': 'ุชู… ุงู„ู†ุณุฎ ุจู†ุฌุงุญ!', - 'invite.copyFailed': 'ูุดู„ ุงู„ู†ุณุฎุŒ ูŠุฑุฌู‰ ุงู„ู†ุณุฎ ูŠุฏูˆูŠู‹ุง', - 'invite.noInviteLink': 'ู„ู… ูŠุชู… ุฅู†ุดุงุก ุฑุงุจุท ุงู„ุฏุนูˆุฉ', - 'invite.totalInvites': 'ุงู„ุฏุนูˆุงุช ุงู„ุชุฑุงูƒู…ูŠุฉ', - 'invite.totalReward': 'ุงู„ู…ูƒุงูุขุช ุงู„ุชุฑุงูƒู…ูŠุฉ', - 'invite.rules': 'ู‚ูˆุงุนุฏ ุงู„ุฏุนูˆุฉ', - 'invite.rule1': 'ููŠ ูƒู„ ู…ุฑุฉ ุชู‚ูˆู… ููŠู‡ุง ุจุฏุนูˆุฉ ุตุฏูŠู‚ ุจู†ุฌุงุญ ู„ู„ุชุณุฌูŠู„ุŒ ุณูˆู ุชุญุตู„ ุนู„ู‰ ู…ูƒุงูุฃุฉ', - 'invite.rule2': 'ุฅุฐุง ุฃูƒู…ู„ ุงู„ุตุฏูŠู‚ ุงู„ู…ุฏุนูˆ ุงู„ู…ุนุงู…ู„ุฉ ุงู„ุฃูˆู„ู‰ุŒ ูุณุชุญุตู„ ุนู„ู‰ ู…ูƒุงูุขุช ุฅุถุงููŠุฉ', - 'invite.rule3': 'ุณูŠุชู… ุฅุฑุณุงู„ ู…ูƒุงูุขุช ุงู„ุฏุนูˆุฉ ู…ุจุงุดุฑุฉ ุฅู„ู‰ ุญุณุงุจูƒ', - 'invite.inviteList': 'ู‚ุงุฆู…ุฉ ุงู„ุฏุนูˆุฉ', - 'invite.tasks': 'ู…ุฑูƒุฒ ุงู„ุจุนุซุฉ', - 'invite.inviteeName': 'ุงู„ู…ุฏุนูˆ', - 'invite.inviteTime': 'ูˆู‚ุช ุงู„ุฏุนูˆุฉ', - 'invite.status': 'ุงู„ุญุงู„ุฉ', - 'invite.reward': 'ู…ูƒุงูุฃุฉ', - 'invite.active': 'ู†ุดุท', - 'invite.inactive': 'ู„ู… ูŠุชู… ุชูุนูŠู„ู‡ุง', - 'invite.completed': 'ู…ูƒุชู…ู„', - 'invite.claimed': 'ุชู… ุงู„ุงุณุชู„ุงู…', - 'invite.pending': 'ู„ูŠุชู… ุงู„ุงู†ุชู‡ุงุก ู…ู†ู‡ุง', - 'invite.goToTask': 'ู„ุฅูƒู…ุงู„', - 'invite.claimReward': 'ุงู„ู…ุทุงู„ุจุฉ ุจุงู„ู…ูƒุงูุขุช', - 'invite.verify': 'ุงูƒุชู…ู„ ุงู„ุชุญู‚ู‚', - 'invite.verifySuccess': 'ุชู… ุงู„ุชุญู‚ู‚ ุจู†ุฌุงุญ! ุงูƒุชู…ู„ุช ุงู„ู…ู‡ู…ุฉ', - 'invite.verifyNotCompleted': 'ุงู„ู…ู‡ู…ุฉ ู„ู… ุชูƒุชู…ู„ ุจุนุฏุŒ ูŠุฑุฌู‰ ุฅูƒู…ุงู„ ุงู„ู…ู‡ู…ุฉ ุฃูˆู„ุง', - 'invite.verifyFailed': 'ูุดู„ ุงู„ุชุญู‚ู‚ุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ููŠ ูˆู‚ุช ู„ุงุญู‚', - 'invite.claimSuccess': 'ุชู… ุงุณุชู„ุงู… {reward} QDT ุจู†ุฌุงุญ!', - 'invite.claimFailed': 'ูุดู„ ุงู„ุชุฌู…ูŠุนุŒ ูŠุฑุฌู‰ ุงู„ู…ุญุงูˆู„ุฉ ู…ุฑุฉ ุฃุฎุฑู‰ ู„ุงุญู‚ู‹ุง', - 'invite.totalRecords': '{total} ุงู„ุณุฌู„ุงุช ููŠ ุงู„ู…ุฌู…ูˆุน', - 'invite.task.twitter.title': 'ุฅุนุงุฏุฉ ุชุบุฑูŠุฏ ุฅู„ู‰ X (ุชูˆูŠุชุฑ)', - 'invite.task.twitter.desc': 'ุดุงุฑูƒ ุชุบุฑูŠุฏุงุชู†ุง ุงู„ุฑุณู…ูŠุฉ ุนู„ู‰ ุญุณุงุจ X (Twitter) ุงู„ุฎุงุต ุจูƒ', - 'invite.task.youtube.title': 'ุชุงุจุน ู‚ู†ุงุชู†ุง ุนู„ู‰ ุงู„ูŠูˆุชูŠูˆุจ', - 'invite.task.youtube.desc': 'ุงุดุชุฑูƒ ูˆุชุงุจุน ู‚ู†ุงุชู†ุง ุงู„ุฑุณู…ูŠุฉ ุนู„ู‰ ุงู„ูŠูˆุชูŠูˆุจ', - 'invite.task.telegram.title': 'ุงู†ุถู… ุฅู„ู‰ ู…ุฌู…ูˆุนุฉ ุชูŠู„ูŠุฌุฑุงู…', - 'invite.task.telegram.desc': 'ุงู†ุถู… ุฅู„ู‰ ู…ุฌู…ูˆุนุฉ ู…ุฌุชู…ุน Telegram ุงู„ุฑุณู…ูŠุฉ ู„ุฏูŠู†ุง', - 'invite.task.discord.title': 'ุงู†ุถู… ุฅู„ู‰ ุฎุงุฏู… Discord', - 'invite.task.discord.desc': 'ุงู†ุถู… ุฅู„ู‰ ุฎุงุฏู… ู…ุฌุชู…ุน Discord ุงู„ุฎุงุต ุจู†ุง', - 'message': '-', - 'layouts.usermenu.dialog.title': 'ู…ุนู„ูˆู…ุงุช', - 'layouts.usermenu.dialog.content': 'ู‡ู„ ุฃู†ุช ู…ุชุฃูƒุฏ ุฃู†ูƒ ุชุฑูŠุฏ ุชุณุฌูŠู„ ุงู„ุฎุฑูˆุฌุŸ', - 'layouts.userLayout.title': 'ุงุจุญุซ ุนู† ุงู„ุญู‚ูŠู‚ุฉ ููŠ ุญุงู„ุฉ ุนุฏู… ุงู„ูŠู‚ูŠู†', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell โ†’ open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': 'ุงู„ุฐุงูƒุฑุฉ/ุงู„ุงู†ุนูƒุงุณ', - 'settings.group.reflection_worker': 'ุนุงู…ู„ ุงู„ุชุญู‚ู‚ ุงู„ุชู„ู‚ุงุฆูŠ ู„ู„ุงู†ุนูƒุงุณ', - 'settings.field.ENABLE_AGENT_MEMORY': 'ุชู…ูƒูŠู† ุฐุงูƒุฑุฉ ุงู„ูˆูƒูŠู„', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'ุชู…ูƒูŠู† ุงู„ุงุณุชุฑุฌุงุน ุงู„ู…ุชุฌู‡ูŠ (ู…ุญู„ูŠ)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'ุจูุนุฏ ุงู„ุชุถู…ูŠู†', - 'settings.field.AGENT_MEMORY_TOP_K': 'ุนุฏุฏ ุงู„ุงุณุชุฑุฌุงุน Top-K', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'ุญุฌู… ู†ุงูุฐุฉ ุงู„ู…ุฑุดุญูŠู†', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'ู†ุตู ุนู…ุฑ ุชู„ุงุดูŠ ุงู„ุฒู…ู† (ุฃูŠุงู…)', - 'settings.field.AGENT_MEMORY_W_SIM': 'ูˆุฒู† ุงู„ุชุดุงุจู‡', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'ูˆุฒู† ุงู„ุญุฏุงุซุฉ', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'ูˆุฒู† ุงู„ุนุงุฆุฏ', - 'settings.field.ENABLE_REFLECTION_WORKER': 'ุชู…ูƒูŠู† ุงู„ุชุญู‚ู‚ ุงู„ุชู„ู‚ุงุฆูŠ', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'ูุงุตู„ ุงู„ุชุญู‚ู‚ (ุซุงู†ูŠุฉ)', - - // Profile - Notification Settings (ุฅุนุฏุงุฏุงุช ุงู„ุฅุดุนุงุฑุงุช) - 'profile.notifications.title': 'ุฅุนุฏุงุฏุงุช ุงู„ุฅุดุนุงุฑุงุช', - 'profile.notifications.hint': 'ู‚ู… ุจุชูƒูˆูŠู† ุทุฑู‚ ุงู„ุฅุดุนุงุฑุงุช ุงู„ุงูุชุฑุงุถูŠุฉุŒ ุณูŠุชู… ุงุณุชุฎุฏุงู…ู‡ุง ุชู„ู‚ุงุฆูŠุงู‹ ุนู†ุฏ ุฅู†ุดุงุก ู…ุฑุงู‚ุจุฉ ุงู„ุฃุตูˆู„ ูˆุงู„ุชู†ุจูŠู‡ุงุช', - 'profile.notifications.defaultChannels': 'ู‚ู†ูˆุงุช ุงู„ุฅุดุนุงุฑุงุช ุงู„ุงูุชุฑุงุถูŠุฉ', - 'profile.notifications.browser': 'ุฅุดุนุงุฑ ุฏุงุฎู„ ุงู„ุชุทุจูŠู‚', - 'profile.notifications.email': 'ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ', - 'profile.notifications.phone': 'ุฑุณุงู„ุฉ ู†ุตูŠุฉ', - 'profile.notifications.telegramBotToken': 'Telegram Bot Token', - 'profile.notifications.telegramBotTokenPlaceholder': 'ุฃุฏุฎู„ Telegram Bot Token ุงู„ุฎุงุต ุจูƒ', - 'profile.notifications.telegramBotTokenHint': 'ุฃู†ุดุฆ ุจูˆุช ุนุจุฑ @BotFather ู„ู„ุญุตูˆู„ ุนู„ู‰ Token', - 'profile.notifications.telegramChatId': 'Telegram Chat ID', - 'profile.notifications.telegramPlaceholder': 'ุฃุฏุฎู„ Telegram Chat ID ุงู„ุฎุงุต ุจูƒ (ู…ุซุงู„: 123456789)', - 'profile.notifications.telegramHint': 'ุฃุฑุณู„ /start ุฅู„ู‰ @userinfobot ู„ู„ุญุตูˆู„ ุนู„ู‰ Chat ID', - 'profile.notifications.notifyEmail': 'ุจุฑูŠุฏ ุงู„ุฅุดุนุงุฑุงุช', - 'profile.notifications.emailPlaceholder': 'ุนู†ูˆุงู† ุงู„ุจุฑูŠุฏ ุงู„ุฅู„ูƒุชุฑูˆู†ูŠ ู„ุงุณุชู„ุงู… ุงู„ุฅุดุนุงุฑุงุช', - 'profile.notifications.emailHint': 'ูŠุณุชุฎุฏู… ุจุฑูŠุฏ ุงู„ุญุณุงุจ ุจุดูƒู„ ุงูุชุฑุงุถูŠุŒ ูŠู…ูƒู†ูƒ ุชุนูŠูŠู† ุจุฑูŠุฏ ุขุฎุฑ', - 'profile.notifications.phonePlaceholder': 'ุฃุฏุฎู„ ุฑู‚ู… ุงู„ู‡ุงุชู (ู…ุซุงู„: +966501234567)', - 'profile.notifications.phoneHint': 'ูŠุญุชุงุฌ ุงู„ู…ุณุคูˆู„ ุฅู„ู‰ ุชูƒูˆูŠู† ุฎุฏู…ุฉ Twilio', - 'profile.notifications.discordWebhook': 'Discord Webhook', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'ุฃู†ุดุฆ Webhook ููŠ ุฅุนุฏุงุฏุงุช ุฎุงุฏู… Discord', - 'profile.notifications.webhookUrl': 'Webhook URL', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': 'ุนู†ูˆุงู† Webhook ู…ุฎุตุตุŒ ูŠุฑุณู„ ุงู„ุฅุดุนุงุฑุงุช ุนุจุฑ POST JSON', - 'profile.notifications.webhookToken': 'Webhook Token (ุงุฎุชูŠุงุฑูŠ)', - 'profile.notifications.webhookTokenPlaceholder': 'Bearer Token ู„ู„ุชุญู‚ู‚ ู…ู† ุงู„ุทู„ุจ', - 'profile.notifications.webhookTokenHint': 'ูŠูุฑุณู„ ูƒู€ Authorization: Bearer Token ุฅู„ู‰ Webhook', - 'profile.notifications.testBtn': 'ุฅุฑุณุงู„ ุฅุดุนุงุฑ ุชุฌุฑูŠุจูŠ', - 'profile.notifications.saveSuccess': 'ุชู… ุญูุธ ุฅุนุฏุงุฏุงุช ุงู„ุฅุดุนุงุฑุงุช ุจู†ุฌุงุญ', - 'profile.notifications.selectChannel': 'ุงู„ุฑุฌุงุก ุงุฎุชูŠุงุฑ ู‚ู†ุงุฉ ุฅุดุนุงุฑ ูˆุงุญุฏุฉ ุนู„ู‰ ุงู„ุฃู‚ู„', - 'profile.notifications.fillTelegramToken': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ Telegram Bot Token', - 'profile.notifications.fillTelegram': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ Telegram Chat ID', - 'profile.notifications.fillEmail': 'ุงู„ุฑุฌุงุก ุฅุฏุฎุงู„ ุจุฑูŠุฏ ุงู„ุฅุดุนุงุฑุงุช', - 'profile.notifications.testSent': 'ุชู… ุฅุฑุณุงู„ ุงู„ุฅุดุนุงุฑ ุงู„ุชุฌุฑูŠุจูŠุŒ ูŠุฑุฌู‰ ุงู„ุชุญู‚ู‚ ู…ู† ู‚ู†ูˆุงุช ุงู„ุฅุดุนุงุฑุงุช' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/de-DE.js b/quantdinger_vue/src/locales/lang/de-DE.js deleted file mode 100644 index 485a032..0000000 --- a/quantdinger_vue/src/locales/lang/de-DE.js +++ /dev/null @@ -1,1871 +0,0 @@ -import antdDeDE from 'ant-design-vue/es/locale-provider/de_DE' -import momentDE from 'moment/locale/de' - -const components = { - antLocale: antdDeDE, - momentName: 'de', - momentLocale: momentDE -} - -const locale = { - 'submit': 'Senden', - 'save': 'speichern', - 'submit.ok': 'รœbermittlung erfolgreich', - 'save.ok': 'Erfolgreich gespeichert', - 'menu.welcome': 'Willkommen', - 'menu.home': 'Startseite', - 'menu.dashboard': 'Armaturenbrett', - 'menu.dashboard.indicator': 'Indikatorenanalyse', - 'menu.dashboard.community': 'Indikatorgemeinschaft', - 'menu.dashboard.analysis': 'KI-Analyse', - 'menu.dashboard.tradingAssistant': 'Handelsassistent', - 'menu.dashboard.aiTradingAssistant': 'KI-Handelsassistent', - 'menu.dashboard.signalRobot': 'Signal-Roboter', - 'menu.dashboard.monitor': 'รœberwachungsseite', - 'menu.dashboard.workplace': 'Werkbank', - 'menu.form': 'Formularseite', - 'menu.form.basic-form': 'Grundform', - 'menu.form.step-form': 'Schritt-fรผr-Schritt-Formular', - 'menu.form.step-form.info': 'Schritt-fรผr-Schritt-Formular (รœbertragungsinformationen ausfรผllen)', - 'menu.form.step-form.confirm': 'Schritt-fรผr-Schritt-Formular (รœbertragungsinformationen bestรคtigen)', - 'menu.form.step-form.result': 'Schritt-fรผr-Schritt-Formular (vollstรคndig)', - 'menu.form.advanced-form': 'Erweiterte Formulare', - 'menu.list': 'Listenseite', - 'menu.list.table-list': 'Anfrageformular', - 'menu.list.basic-list': 'Standardliste', - 'menu.list.card-list': 'Kartenliste', - 'menu.list.search-list': 'Suchliste', - 'menu.list.search-list.articles': 'Suchliste (Artikel)', - 'menu.list.search-list.projects': 'Suchliste (Projekt)', - 'menu.list.search-list.applications': 'Suchliste (App)', - 'menu.profile': 'Detailseite', - 'menu.profile.basic': 'Grundlegende Detailseite', - 'menu.profile.advanced': 'Erweiterte Detailseite', - 'menu.result': 'Ergebnisseite', - 'menu.result.success': 'Erfolgsseite', - 'menu.result.fail': 'Fehlerseite', - 'menu.exception': 'Ausnahmeseite', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'Fehler auslรถsen', - 'menu.account': 'Persรถnliche Seite', - 'menu.account.center': 'Persรถnliches Zentrum', - 'menu.account.settings': 'persรถnliche Einstellungen', - 'menu.account.trigger': 'Triggerfehler', - 'menu.account.logout': 'Abmelden', - 'menu.wallet': 'meine Brieftasche', - 'menu.docs': 'Dokumentenzentrum', - 'menu.docs.detail': 'Dokumentdetails', - 'menu.header.refreshPage': 'Seite aktualisieren', - 'menu.invite.friends': 'Freunde einladen', - 'app.setting.pagestyle': 'allgemeine Stileinstellungen', - 'app.setting.pagestyle.light': 'Heller Menรผstil', - 'app.setting.pagestyle.dark': 'Dunkler Menรผstil', - 'app.setting.pagestyle.realdark': 'Dunkelmodus', - 'app.setting.themecolor': 'Themenfarbe', - 'app.setting.navigationmode': 'Navigationsmodus', - 'app.setting.sidemenu.nav': 'Seitenleistennavigation', - 'app.setting.topmenu.nav': 'Navigation in der oberen Leiste', - 'app.setting.content-width': 'Breite des Inhaltsbereichs', - 'app.setting.content-width.tooltip': 'Diese Einstellung ist nur wirksam, wenn [Navigation in der oberen Leiste]', - 'app.setting.content-width.fixed': 'Behoben', - 'app.setting.content-width.fluid': 'Streaming', - 'app.setting.fixedheader': 'Fester Header', - 'app.setting.fixedheader.tooltip': 'Bei festem Header konfigurierbar', - 'app.setting.autoHideHeader': 'Kopfzeile beim Scrollen ausblenden', - 'app.setting.fixedsidebar': 'Seitenmenรผ korrigiert', - 'app.setting.sidemenu': 'Seitenmenรผ-Layout', - 'app.setting.topmenu': 'Oberes Menรผlayout', - 'app.setting.othersettings': 'Andere Einstellungen', - 'app.setting.weakmode': 'Farbschwรคchemodus', - 'app.setting.multitab': 'Multi-Tab-Modus', - 'app.setting.copy': 'Einstellungen kopieren', - 'app.setting.loading': 'Thema wird geladen', - 'app.setting.copyinfo': 'Einstellungen erfolgreich kopieren src/config/defaultSettings.js', - 'app.setting.copy.success': 'Kopieren abgeschlossen', - 'app.setting.copy.fail': 'Der Kopiervorgang ist fehlgeschlagen', - 'app.setting.theme.switching': 'Wechselndes Thema!', - 'app.setting.production.hint': 'Die Konfigurationsleiste dient nur der Vorschau in der Entwicklungsumgebung und wird in der Produktionsumgebung nicht angezeigt. Bitte kopieren und รคndern Sie die Konfigurationsdatei manuell.', - 'app.setting.themecolor.daybreak': 'Morgenblau (Standard)', - 'app.setting.themecolor.dust': 'Dรคmmerung', - 'app.setting.themecolor.volcano': 'Vulkan', - 'app.setting.themecolor.sunset': 'Sonnenuntergang', - 'app.setting.themecolor.cyan': 'Mingqing', - 'app.setting.themecolor.green': 'Auroragrรผn', - 'app.setting.themecolor.geekblue': 'Geek blau', - 'app.setting.themecolor.purple': 'Jiang Zi', - 'app.setting.tooltip': 'Seiteneinstellungen', - 'user.login.userName': 'Benutzername', - 'user.login.password': 'Passwort', - 'user.login.username.placeholder': 'Konto: Admin', - 'user.login.password.placeholder': 'Passwort: admin oder ant.design', - 'user.login.message-invalid-credentials': 'Die Anmeldung ist fehlgeschlagen. Bitte รผberprรผfen Sie Ihre E-Mail-Adresse und Ihren Bestรคtigungscode', - 'user.login.message-invalid-verification-code': 'Fehler beim Bestรคtigungscode', - 'user.login.tab-login-credentials': 'Anmeldung mit Kontopasswort', - 'user.login.tab-login-email': 'E-Mail-Login', - 'user.login.tab-login-mobile': 'Anmeldung รผber die Mobiltelefonnummer', - 'user.login.captcha.placeholder': 'Bitte geben Sie den grafischen Bestรคtigungscode ein', - 'user.login.mobile.placeholder': 'Mobiltelefonnummer', - 'user.login.mobile.verification-code.placeholder': 'Bestรคtigungscode', - 'user.login.email.placeholder': 'Bitte geben Sie Ihre E-Mail-Adresse ein', - 'user.login.email.verification-code.placeholder': 'Bitte geben Sie den Bestรคtigungscode ein', - 'user.login.email.sending': 'Bestรคtigungscode wird gesendet...', - 'user.login.email.send-success-title': 'Tipps', - 'user.login.email.send-success': 'Der Bestรคtigungscode wurde erfolgreich gesendet. Bitte รผberprรผfen Sie Ihre E-Mails', - 'user.login.sms.send-success': 'Der Bestรคtigungscode wurde erfolgreich gesendet. Bitte รผberprรผfen Sie die Textnachricht', - 'user.login.remember-me': 'Automatische Anmeldung', - 'user.login.forgot-password': 'Passwort vergessen', - 'user.login.sign-in-with': 'Andere Anmeldemethoden', - 'user.login.signup': 'Registrieren Sie ein Konto', - 'user.login.login': 'Anmelden', - 'user.register.register': 'Registrieren', - 'user.register.email.placeholder': 'E-Mail', - 'user.register.password.placeholder': 'Bitte geben Sie mindestens 6 Zeichen ein. Bitte verwenden Sie keine Passwรถrter, die leicht zu erraten sind.', - 'user.register.password.popover-message': 'Bitte geben Sie mindestens 6 Zeichen ein. Bitte verwenden Sie keine Passwรถrter, die leicht zu erraten sind.', - 'user.register.confirm-password.placeholder': 'Passwort bestรคtigen', - 'user.register.get-verification-code': 'Holen Sie sich den Bestรคtigungscode', - 'user.register.sign-in': 'Melden Sie sich mit einem bestehenden Konto an', - 'user.register-result.msg': 'Ihr Konto: {email} Registrierung erfolgreich', - 'user.register-result.activation-email': 'Die Aktivierungs-E-Mail wurde an Ihr Postfach gesendet und ist 24 Stunden lang gรผltig. Bitte melden Sie sich umgehend bei Ihrem E-Mail-Konto an und klicken Sie auf den Link in der E-Mail, um Ihr Konto zu aktivieren.', - 'user.register-result.back-home': 'Zurรผck zur Startseite', - 'user.register-result.view-mailbox': 'รœberprรผfen Sie Ihr Postfach', - 'user.email.required': 'Bitte geben Sie Ihre E-Mail-Adresse ein!', - 'user.email.wrong-format': 'Das E-Mail-Adressformat ist falsch!', - 'user.userName.required': 'Bitte geben Sie Ihren Kontonamen oder Ihre E-Mail-Adresse ein', - 'user.password.required': 'Bitte geben Sie Ihr Passwort ein!', - 'user.password.twice.msg': 'Die doppelt eingegebenen Passwรถrter stimmen nicht รผberein!', - 'user.password.strength.msg': 'Das Passwort ist nicht sicher genug', - 'user.password.strength.strong': 'Stรคrke: Stark', - 'user.password.strength.medium': 'Stรคrke: Mittel', - 'user.password.strength.low': 'Stรคrke: gering', - 'user.password.strength.short': 'Stรคrke: zu kurz', - 'user.confirm-password.required': 'Bitte bestรคtigen Sie Ihr Passwort!', - 'user.phone-number.required': 'Bitte geben Sie die korrekte Mobiltelefonnummer ein', - 'user.phone-number.wrong-format': 'Das Format der Mobiltelefonnummer ist falsch!', - 'user.verification-code.required': 'Bitte geben Sie den Verifizierungscode ein!', - 'user.captcha.required': 'Bitte geben Sie den grafischen Verifizierungscode ein!', - 'user.login.infos': 'QuantDinger ist ein AI-Multi-Agent-Hilfstool fรผr die Aktienanalyse und verfรผgt nicht รผber Qualifikationen als Wertpapieranlageberater. Alle Analyseergebnisse, Scores und Referenzmeinungen in der Plattform werden von KI automatisch auf Basis historischer Daten generiert und dienen ausschlieรŸlich der Ausbildung, Forschung und dem technischen Austausch und stellen keine Anlageberatung oder Entscheidungsgrundlage dar. Aktienanlagen bergen verschiedene Risiken wie Marktrisiko, Liquiditรคtsrisiko, politisches Risiko usw., die zu einem Kapitalverlust fรผhren kรถnnen. Benutzer sollten unabhรคngige Entscheidungen auf der Grundlage ihrer eigenen Risikotoleranz treffen, und jegliches Investitionsverhalten und alle Konsequenzen, die sich aus der Verwendung dieses Tools ergeben, sind vom Benutzer zu tragen. Der Markt ist riskant und Investitionen mรผssen vorsichtig sein.', - 'user.login.tab-login-web3': 'Web3-Anmeldung', - 'user.login.web3.tip': 'Signatur-Login mit Wallet', - 'user.login.web3.connect': 'Wallet verbinden und anmelden', - 'user.login.web3.no-wallet': 'Wallet nicht erkannt', - 'user.login.web3.no-address': 'Wallet-Adresse nicht erhalten', - 'user.login.web3.nonce-failed': 'Zufallszahl konnte nicht abgerufen werden', - 'user.login.web3.verify-failed': 'Die Signaturรผberprรผfung ist fehlgeschlagen', - 'user.login.web3.success': 'Anmeldung erfolgreich', - 'user.login.web3.failed': 'Die Wallet-Anmeldung ist fehlgeschlagen', - 'nav.no_wallet': 'Wallet nicht erkannt', - 'nav.copy': 'Kopieren', - 'nav.copy_success': 'Erfolgreich kopiert', - 'user.login.oauth.google': 'Melden Sie sich mit Google an', - 'user.login.oauth.github': 'Melden Sie sich mit GitHub an', - 'user.login.oauth.loading': 'Weiterleitung zur Autorisierungsseite...', - 'user.login.oauth.failed': 'Die OAuth-Anmeldung ist fehlgeschlagen', - 'user.login.oauth.get-url-failed': 'Der Autorisierungslink konnte nicht abgerufen werden', - 'user.login.subtitle': 'Gezielte quantitative Einblicke in globale Mรคrkte', - 'user.login.legal.title': 'Haftungsausschluss', - 'user.login.legal.view': 'Rechtlichen Haftungsausschluss anzeigen', - 'user.login.legal.collapse': 'Haftungsausschluss einklappen', - 'user.login.legal.agree': 'Ich habe den Haftungsausschluss gelesen und stimme ihm zu', - 'user.login.legal.required': 'Bitte lesen und รผberprรผfen Sie zunรคchst den rechtlichen Haftungsausschluss', - 'user.login.legal.content': 'QuantDinger ist ein AI-Multi-Agent-Hilfstool fรผr die Aktienanalyse und verfรผgt nicht รผber Qualifikationen als Wertpapieranlageberater. Alle Analyseergebnisse, Bewertungen und Referenzmeinungen in der Plattform werden von KI automatisch auf Basis historischer Daten generiert und dienen ausschlieรŸlich der Ausbildung, Forschung und dem technischen Austausch und stellen keine Anlageberatung oder Entscheidungsgrundlage dar. Aktienanlagen bergen verschiedene Risiken wie Marktrisiko, Liquiditรคtsrisiko, politisches Risiko usw., die zu einem Kapitalverlust fรผhren kรถnnen. Benutzer sollten unabhรคngige Entscheidungen auf der Grundlage ihrer eigenen Risikotoleranz treffen, und jegliches Investitionsverhalten und alle Konsequenzen, die sich aus der Verwendung dieses Tools ergeben, sind vom Benutzer zu tragen. Der Markt ist riskant und Investitionen mรผssen vorsichtig sein.', - 'user.login.privacy.title': 'Datenschutzrichtlinie fรผr Benutzer', - 'user.login.privacy.view': 'Datenschutzrichtlinie fรผr Benutzer anzeigen', - 'user.login.privacy.collapse': 'SchlieรŸen Sie die Datenschutzbestimmungen fรผr Benutzer', - 'user.login.privacy.content': 'Wir legen Wert auf Ihre Privatsphรคre und Ihren Datenschutz. 1) Erfassungsumfang: Es werden nur die zur Umsetzung der Funktion erforderlichen Informationen (z. B. E-Mail, Mobiltelefonnummer, Vorwahl, Web3-Wallet-Adresse) sowie notwendige Protokolle und Gerรคteinformationen erfasst. 2) Verwendungszweck: Zur Kontoanmeldung und Sicherheitsรผberprรผfung, Bereitstellung von Servicefunktionen, Fehlerbehebung und Compliance-Anforderungen. 3) Speicherung und Sicherheit: Daten werden verschlรผsselt und gespeichert, und es werden die erforderlichen Berechtigungen und ZugriffskontrollmaรŸnahmen ergriffen, um unbefugten Zugriff, Offenlegung oder Verlust zu verhindern. 4) Weitergabe an Dritte: Sofern dies nicht durch Gesetze und Vorschriften vorgeschrieben oder fรผr die Erbringung von Dienstleistungen erforderlich ist, werden Ihre personenbezogenen Daten nicht an Dritte weitergegeben. Bei Einbindung von Diensten Dritter (z. B. Wallets, SMS-Dienstleister) erfolgt die Verarbeitung nur im fรผr die Umsetzung der Funktion erforderlichen Mindestumfang. 5) Cookies/lokale Speicherung: werden fรผr den Anmeldestatus und die notwendige Sitzungswartung verwendet (z. B. Token, PHPSESSID). Sie kรถnnen sie im Browser lรถschen oder einschrรคnken. 6) Persรถnlichkeitsrechte: Sie kรถnnen Ihre Rechte auf Auskunft, Berichtigung, Lรถschung, Widerruf der Einwilligung usw. gemรครŸ den Gesetzen und Vorschriften ausรผben. 7) ร„nderungen und Hinweise: Wenn diese Bedingungen aktualisiert werden, werden sie gut sichtbar auf der Seite angezeigt. Durch die weitere Nutzung dieses Dienstes wird davon ausgegangen, dass Sie den aktualisierten Inhalt gelesen und ihm zugestimmt haben. Wenn Sie diesen Bedingungen oder deren Aktualisierungen nicht zustimmen, stellen Sie bitte die Nutzung des Dienstes ein und kontaktieren Sie uns.', - 'account.basicInfo': 'Grundlegende Informationen', - 'account.id': 'Benutzer-ID', - 'account.username': 'Benutzername', - 'account.nickname': 'Spitzname', - 'account.email': 'E-Mail', - 'account.mobile': 'Mobiltelefonnummer', - 'account.web3address': 'Wallet-Adresse', - 'account.pid': 'Referrer-ID', - 'account.level': 'Benutzerebene', - 'account.money': 'Gleichgewicht', - 'account.qdtBalance': 'QDT-Balance', - 'account.score': 'Punkte', - 'account.createtime': 'Anmeldezeit', - 'account.inviteLink': 'Einladungslink', - 'account.recharge': 'Aufladen', - 'account.rechargeTip': 'Bitte verwenden Sie WeChat oder Alipay, um den untenstehenden QR-Code zum Aufladen zu scannen.', - 'account.qrCodePlaceholder': 'QR-Code-Platzhalter (Emulation)', - 'account.rechargeAmount': 'Aufladebetrag', - 'account.enterAmount': 'Bitte geben Sie den Aufladebetrag ein', - 'account.rechargeHint': 'Mindesteinzahlungsbetrag: 1 QDT', - 'account.confirmRecharge': 'Bestรคtigen Sie das Aufladen', - 'account.enterValidAmount': 'Bitte geben Sie einen gรผltigen Aufladebetrag ein', - 'account.rechargeSuccess': 'Aufladen erfolgreich! {amount} QDT eingezahlt', - 'account.settings.menuMap.basic': 'Grundeinstellungen', - 'account.settings.menuMap.security': 'Sicherheitseinstellungen', - 'account.settings.menuMap.notification': 'Benachrichtigung รผber neue Nachrichten', - 'account.settings.menuMap.moneyLog': 'Details zum Fonds', - 'account.moneyLog.empty': 'Noch keine Fondsdetails', - 'account.moneyLog.total': 'Insgesamt {total} Datensรคtze', - 'account.moneyLog.type.purchase': 'Kaufindikator', - 'account.moneyLog.type.recharge': 'Aufladen', - 'account.moneyLog.type.refund': 'Rรผckerstattung', - 'account.moneyLog.type.reward': 'Belohnung', - 'account.moneyLog.type.income': 'Indikatoreinkommen', - 'account.moneyLog.type.commission': 'Bearbeitungsgebรผhr fรผr die Plattform', - 'wallet.balance': 'QDT-Balance', - 'wallet.recharge': 'Aufladen', - 'wallet.withdraw': 'Bargeld abheben', - 'wallet.filter': 'Filtern', - 'wallet.reset': 'zurรผckgesetzt', - 'wallet.totalRecharge': 'Akkumulierte Aufladung', - 'wallet.totalWithdraw': 'Kumulierte Abhebungen', - 'wallet.totalIncome': 'Kumuliertes Einkommen', - 'wallet.records': 'Transaktionsaufzeichnungen und Fondsdetails', - 'wallet.tradingRecords': 'Transaktionsverlauf', - 'wallet.moneyLog': 'Details zum Fonds', - 'wallet.rechargeTip': 'Bitte verwenden Sie WeChat oder Alipay, um den untenstehenden QR-Code zum Aufladen zu scannen.', - 'wallet.qrCodePlaceholder': 'QR-Code-Platzhalter (Emulation)', - 'wallet.rechargeAmount': 'Aufladebetrag', - 'wallet.enterAmount': 'Bitte geben Sie den Aufladebetrag ein', - 'wallet.rechargeHint': 'Mindesteinzahlungsbetrag: 1 QDT', - 'wallet.confirmRecharge': 'Bestรคtigen Sie das Aufladen', - 'wallet.enterValidAmount': 'Bitte geben Sie einen gรผltigen Aufladebetrag ein', - 'wallet.rechargeSuccess': 'Aufladen erfolgreich! {amount} QDT eingezahlt', - 'wallet.rechargeFailed': 'Das Aufladen ist fehlgeschlagen', - 'wallet.withdrawTip': 'Bitte geben Sie den Auszahlungsbetrag und die Auszahlungsadresse ein', - 'wallet.withdrawAmount': 'Betrag abheben', - 'wallet.enterWithdrawAmount': 'Bitte geben Sie den Auszahlungsbetrag ein', - 'wallet.withdrawHint': 'Mindestauszahlungsbetrag: 1 QDT', - 'wallet.withdrawAddress': 'Auszahlungsadresse (optional)', - 'wallet.enterWithdrawAddress': 'Bitte geben Sie die Auszahlungsadresse ein', - 'wallet.confirmWithdraw': 'Auszahlung bestรคtigen', - 'wallet.enterValidWithdrawAmount': 'Bitte geben Sie einen gรผltigen Auszahlungsbetrag ein', - 'wallet.insufficientBalance': 'Unzureichendes Gleichgewicht', - 'wallet.withdrawSuccess': 'Auszahlung erfolgreich! {Betrag} QDT abgehoben', - 'wallet.withdrawFailed': 'Die Auszahlung ist fehlgeschlagen', - 'wallet.noTradingRecords': 'Noch kein Transaktionsdatensatz', - 'wallet.noMoneyLog': 'Noch keine Fondsdetails', - 'wallet.loadTradingRecordsFailed': 'Transaktionsdatensรคtze konnten nicht geladen werden', - 'wallet.loadMoneyLogFailed': 'Die Fondsdetails konnten nicht geladen werden', - 'wallet.moneyLogTotal': 'Insgesamt {total} Datensรคtze', - 'wallet.moneyLogTypeTitle': 'Typ', - 'wallet.moneyLogType.all': 'Alle Arten', - 'wallet.table.time': 'Zeit', - 'wallet.table.type': 'Typ', - 'wallet.table.price': 'Preis', - 'wallet.table.amount': 'Menge', - 'wallet.table.money': 'Betrag', - 'wallet.table.balance': 'Gleichgewicht', - 'wallet.table.memo': 'Bemerkungen', - 'wallet.table.value': 'Wert', - 'wallet.table.profit': 'Gewinn und Verlust', - 'wallet.table.commission': 'Bearbeitungsgebรผhr', - 'wallet.table.total': 'Insgesamt {total} Datensรคtze', - 'wallet.tradeType.buy': 'kaufen', - 'wallet.tradeType.sell': 'verkaufen', - 'wallet.tradeType.liquidation': 'Zwangsliquidation', - 'wallet.tradeType.openLong': 'Lange geรถffnet', - 'wallet.tradeType.addLong': 'Gadot', - 'wallet.tradeType.closeLong': 'Pinduo', - 'wallet.tradeType.closeLongStop': 'Stop-Loss und Long', - 'wallet.tradeType.closeLongProfit': 'Nehmen Sie Gewinn mit und steigern Sie Ihr Level', - 'wallet.tradeType.openShort': 'Kurz รถffnen', - 'wallet.tradeType.addShort': 'kurz hinzufรผgen', - 'wallet.tradeType.closeShort': 'leer', - 'wallet.tradeType.closeShortStop': 'Stop-Loss', - 'wallet.tradeType.closeShortProfit': 'Nehmen Sie den Gewinn mit und schlieรŸen Sie mit Leerverkรคufen', - 'wallet.moneyLogType.purchase': 'Kaufindikator', - 'wallet.moneyLogType.recharge': 'Aufladen', - 'wallet.moneyLogType.withdraw': 'Bargeld abheben', - 'wallet.moneyLogType.refund': 'Rรผckerstattung', - 'wallet.moneyLogType.reward': 'Belohnung', - 'wallet.moneyLogType.income': 'Einkommen', - 'wallet.moneyLogType.commission': 'Bearbeitungsgebรผhr', - 'wallet.web3Address.required': 'Bitte geben Sie zuerst die Web3-Wallet-Adresse ein', - 'wallet.web3Address.requiredDescription': 'Vor dem Aufladen mรผssen Sie Ihre Web3-Wallet-Adresse verknรผpfen, um eine Aufladung zu erhalten.', - 'wallet.web3Address.placeholder': 'Bitte geben Sie Ihre Web3-Wallet-Adresse ein (beginnend mit 0x)', - 'wallet.web3Address.save': 'Wallet-Adresse speichern', - 'wallet.web3Address.saveSuccess': 'Wallet-Adresse erfolgreich gespeichert', - 'wallet.web3Address.saveFailed': 'Wallet-Adresse konnte nicht gespeichert werden', - 'wallet.web3Address.invalidFormat': 'Bitte geben Sie eine gรผltige Web3-Wallet-Adresse ein (Ethereum-Format: 42 Zeichen, beginnend mit 0x, oder TRC20-Format: 34 Zeichen, beginnend mit T)', - 'wallet.selectCoin': 'Wรคhrung auswรคhlen', - 'wallet.selectChain': 'Auswahlkette', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'Der QDT-Betrag, den Sie einlรถsen mรถchten (optional)', - 'wallet.targetQdtAmount.placeholder': 'Bitte geben Sie die Menge an QDT ein, die Sie einlรถsen mรถchten, den aktuellen QDT-Preis: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'Aufladung erforderlich: {amount} USDT', - 'wallet.rechargeAddress': 'Aufladeadresse', - 'wallet.copyAddress': 'Kopieren', - 'wallet.copySuccess': 'Erfolgreich kopieren!', - 'wallet.copyFailed': 'Der Kopiervorgang ist fehlgeschlagen. Bitte manuell kopieren', - 'wallet.rechargeAddressHint': 'Bitte stellen Sie sicher, dass Sie {chain} verwenden, um {coin} an diese Adresse einzuzahlen', - 'wallet.qdtPrice.loading': 'Laden...', - 'wallet.rechargeTip.new': 'Bitte wรคhlen Sie die Wรคhrung und die Kette aus und scannen Sie dann den untenstehenden QR-Code zum Aufladen', - 'wallet.exchangeRate': '1 QDT โ‰ˆ {rate} USDT', - 'wallet.withdrawableAmount': 'Verfรผgbarer Bargeldbetrag', - 'wallet.totalBalance': 'Gesamtsaldo', - 'wallet.insufficientWithdrawable': 'Der Bargeldbetrag, der abgehoben werden kann, reicht nicht aus. Der aktuelle Betrag, der abgehoben werden kann, ist: {amount} QDT', - 'wallet.withdrawAddressRequired': 'Bitte geben Sie die Auszahlungsadresse ein', - 'wallet.withdrawAddressHint': 'Bitte stellen Sie sicher, dass die Adresse korrekt ist. Nach dem Widerruf ist ein Widerruf nicht mehr mรถglich.', - 'wallet.withdrawSubmitSuccess': 'Auszahlungsantrag erfolgreich eingereicht, bitte warten Sie auf die Prรผfung', - 'menu.footer.contactUs': 'Kontaktieren Sie uns', - 'menu.footer.getSupport': 'Holen Sie sich Unterstรผtzung', - 'menu.footer.socialAccounts': 'soziales Konto', - 'menu.footer.userAgreement': 'Benutzervereinbarung', - 'menu.footer.privacyPolicy': 'Datenschutzrichtlinie', - 'menu.footer.support': 'Unterstรผtzung', - 'menu.footer.featureRequest': 'Funktionsanfrage', - 'menu.footer.email': 'E-Mail', - 'menu.footer.liveChat': 'Live-Chat rund um die Uhr', - 'dashboard.analysis.title': 'Mehrdimensionale Analyse', - 'dashboard.analysis.subtitle': 'KI-gesteuerte umfassende Finanzanalyseplattform', - 'dashboard.analysis.selectSymbol': 'Wรคhlen Sie den zugrunde liegenden Code aus oder geben Sie ihn ein', - 'dashboard.analysis.selectModel': 'Modell auswรคhlen', - 'dashboard.analysis.startAnalysis': 'Analyse starten', - 'dashboard.analysis.history': 'Geschichte', - 'dashboard.analysis.tab.overview': 'umfassende Analyse', - 'dashboard.analysis.tab.fundamental': 'Grundlagen', - 'dashboard.analysis.tab.technical': 'Technologie', - 'dashboard.analysis.tab.news': 'Nachrichten', - 'dashboard.analysis.tab.sentiment': 'Emotionen', - 'dashboard.analysis.tab.risk': 'Risiko', - 'dashboard.analysis.tab.debate': 'Die Lang-Kurz-Debatte', - 'dashboard.analysis.tab.decision': 'endgรผltige Entscheidung', - 'dashboard.analysis.empty.selectSymbol': 'Wรคhlen Sie ein Ziel aus, um die Analyse zu starten', - 'dashboard.analysis.empty.selectSymbolDesc': 'Wรคhlen Sie aus der selbstgewรคhlten Aktienliste aus oder geben Sie den zugrunde liegenden Code ein, um einen mehrdimensionalen KI-Analysebericht zu erhalten', - 'dashboard.analysis.empty.startAnalysis': 'Klicken Sie auf die Schaltflรคche โ€žAnalyse startenโ€œ, um eine mehrdimensionale Analyse durchzufรผhren', - 'dashboard.analysis.empty.startAnalysisDesc': 'Wir bieten Ihnen umfassende Analysen aus mehreren Dimensionen wie Fundamentaldaten, Technologie, Nachrichten, Stimmung und Risiko', - 'dashboard.analysis.empty.noData': 'Derzeit liegen keine {type}-Analysedaten vor. Bitte fรผhren Sie zunรคchst eine umfassende Analyse durch', - 'dashboard.analysis.empty.noWatchlist': 'Derzeit gibt es keine selbstgewรคhlten Aktien', - 'dashboard.analysis.empty.noHistory': 'Noch keine Geschichte', - 'dashboard.analysis.empty.watchlistHint': 'Derzeit sind keine selbstgewรคhlten Aktien vorhanden, bitte zuerst', - 'dashboard.analysis.empty.noDebateData': 'Noch keine Debattendaten', - 'dashboard.analysis.empty.noDecisionData': 'Noch keine Entscheidungsdaten', - 'dashboard.analysis.empty.selectAgent': 'Bitte wรคhlen Sie einen Agenten aus, um die Analyseergebnisse anzuzeigen', - 'dashboard.analysis.loading.analyzing': 'Analyse lรคuft, bitte warten...', - 'dashboard.analysis.loading.fundamental': 'Fundamentaldaten analysieren...', - 'dashboard.analysis.loading.technical': 'Analyse technischer Indikatoren...', - 'dashboard.analysis.loading.news': 'Nachrichtendaten werden analysiert...', - 'dashboard.analysis.loading.sentiment': 'Marktstimmung analysieren...', - 'dashboard.analysis.loading.risk': 'Risiko einschรคtzen...', - 'dashboard.analysis.loading.debate': 'Die Lang-Kurz-Debatte geht weiter...', - 'dashboard.analysis.loading.decision': 'Endgรผltige Entscheidung generieren...', - 'dashboard.analysis.score.overall': 'Gesamtbewertung', - 'dashboard.analysis.score.recommendation': 'Anlageberatung', - 'dashboard.analysis.score.confidence': 'Vertrauen', - 'dashboard.analysis.dimension.fundamental': 'Grundlagen', - 'dashboard.analysis.dimension.technical': 'Technologie', - 'dashboard.analysis.dimension.news': 'Nachrichten', - 'dashboard.analysis.dimension.sentiment': 'Emotionen', - 'dashboard.analysis.dimension.risk': 'Risiko', - 'dashboard.analysis.card.dimensionScores': 'Bewertungen fรผr jede Dimension', - 'dashboard.analysis.card.overviewReport': 'Umfassender Analysebericht', - 'dashboard.analysis.card.financialMetrics': 'Finanzindikatoren', - 'dashboard.analysis.card.fundamentalReport': 'Fundamentalanalysebericht', - 'dashboard.analysis.card.technicalIndicators': 'Technische Indikatoren', - 'dashboard.analysis.card.technicalReport': 'Technischer Analysebericht', - 'dashboard.analysis.card.newsList': 'Verwandte Neuigkeiten', - 'dashboard.analysis.card.newsReport': 'Bericht zur Nachrichtenanalyse', - 'dashboard.analysis.card.sentimentIndicators': 'Stimmungsindikator', - 'dashboard.analysis.card.sentimentReport': 'Stimmungsanalysebericht', - 'dashboard.analysis.card.riskMetrics': 'Risikoindikatoren', - 'dashboard.analysis.card.riskReport': 'Risikobewertungsbericht', - 'dashboard.analysis.card.bullView': 'Bullische Sichtweise (Bull)', - 'dashboard.analysis.card.bearView': 'Bรคrische Sichtweise (Bรคr)', - 'dashboard.analysis.card.researchConclusion': 'Fazit des Forschers', - 'dashboard.analysis.card.traderPlan': 'Hรคndlerplan', - 'dashboard.analysis.card.riskDebate': 'Debatte im Risikoausschuss', - 'dashboard.analysis.card.finalDecision': 'Endgรผltige Entscheidung', - 'dashboard.analysis.card.tradePlanDetail': 'Einzelheiten zum Handelsplan', - 'dashboard.analysis.tradingPlan.entry_price': 'Eintrittspreis', - 'dashboard.analysis.tradingPlan.position_size': 'PositionsgrรถรŸe', - 'dashboard.analysis.tradingPlan.stop_loss': 'Stop-Loss', - 'dashboard.analysis.tradingPlan.take_profit': 'Nehmen Sie Gewinn mit', - 'dashboard.analysis.label.confidence': 'Vertrauen', - 'dashboard.analysis.label.keyPoints': 'Kernpunkte', - 'dashboard.analysis.label.riskWarning': 'Risikowarnung', - 'dashboard.analysis.risk.risky': 'Riskant', - 'dashboard.analysis.risk.neutral': 'Neutraler Standpunkt (Neutral)', - 'dashboard.analysis.risk.safe': 'Konservative Sichtweise (sicher)', - 'dashboard.analysis.risk.conclusion': 'Fazit', - 'dashboard.analysis.feature.fundamental': 'Fundamentalanalyse', - 'dashboard.analysis.feature.technical': 'technische Analyse', - 'dashboard.analysis.feature.news': 'Nachrichtenanalyse', - 'dashboard.analysis.feature.sentiment': 'Stimmungsanalyse', - 'dashboard.analysis.feature.risk': 'Risikobewertung', - 'dashboard.analysis.watchlist.title': 'Meine Aktienauswahl', - 'dashboard.analysis.watchlist.add': 'hinzufรผgen', - 'dashboard.analysis.watchlist.addStock': 'Brรผhe hinzufรผgen', - 'dashboard.analysis.modal.addStock.title': 'Fรผgen Sie optionale Aktien hinzu', - 'dashboard.analysis.modal.addStock.confirm': 'Okay', - 'dashboard.analysis.modal.addStock.cancel': 'Abbrechen', - 'dashboard.analysis.modal.addStock.market': 'Markttyp', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'Bitte wรคhlen Sie einen Markt aus', - 'dashboard.analysis.modal.addStock.marketRequired': 'Bitte wรคhlen Sie den Markttyp aus', - 'dashboard.analysis.modal.addStock.symbol': 'Lagercode', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'Zum Beispiel: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'Bitte Lagercode eingeben', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'Suchen Sie nach Zielcode oder Name', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Suchen Sie den zugrunde liegenden Code oder geben Sie ihn ein (z. B. AAPL, BTC/USDT, EUR/USD).', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'Unterstรผtzt die Suche nach Objekten in der Datenbank oder die direkte Eingabe des Codes (das System erhรคlt den Namen automatisch).', - 'dashboard.analysis.modal.addStock.search': 'Suchen', - 'dashboard.analysis.modal.addStock.searchResults': 'Suchergebnisse', - 'dashboard.analysis.modal.addStock.hotSymbols': 'Beliebte Ziele', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'Noch keine beliebten Ziele', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'Ausgewรคhlt', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'Bitte wรคhlen Sie zunรคchst ein Ziel aus', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'Bitte wรคhlen Sie ein Ziel aus oder geben Sie zuerst den Zielcode ein', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Bitte geben Sie den Zielcode ein', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'Bitte wรคhlen Sie zunรคchst den Markttyp aus', - 'dashboard.analysis.modal.addStock.searchFailed': 'Die Suche ist fehlgeschlagen. Bitte versuchen Sie es spรคter erneut', - 'dashboard.analysis.modal.addStock.noSearchResults': 'Kein passendes Ziel gefunden', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'Das System erhรคlt den Namen automatisch', - 'dashboard.analysis.modal.addStock.addDirectly': 'Direkt hinzufรผgen', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Der Name wird beim Hinzufรผgen automatisch รผbernommen', - 'dashboard.analysis.market.USStock': 'US-Aktien', - 'dashboard.analysis.market.Crypto': 'Kryptowรคhrung', - 'dashboard.analysis.market.Forex': 'Forex', - 'dashboard.analysis.market.Futures': 'Futures', - 'dashboard.analysis.modal.history.title': 'Historische Analyseaufzeichnungen', - 'dashboard.analysis.modal.history.viewResult': 'Ergebnisse anzeigen', - 'dashboard.analysis.modal.history.completeTime': 'Fertigstellungszeit', - 'dashboard.analysis.modal.history.error': 'Fehler', - 'dashboard.analysis.status.pending': 'Ausstehend', - 'dashboard.analysis.status.processing': 'Verarbeitung', - 'dashboard.analysis.status.completed': 'Abgeschlossen', - 'dashboard.analysis.status.failed': 'gescheitert', - 'dashboard.analysis.message.selectSymbol': 'Bitte wรคhlen Sie zuerst das Ziel aus', - 'dashboard.analysis.message.taskCreated': 'Die Analyseaufgabe wurde erstellt und wird im Hintergrund ausgefรผhrt...', - 'dashboard.analysis.message.analysisComplete': 'Analyse abgeschlossen', - 'dashboard.analysis.message.analysisCompleteCache': 'Analyse abgeschlossen (unter Verwendung zwischengespeicherter Daten)', - 'dashboard.analysis.message.analysisFailed': 'Die Analyse ist fehlgeschlagen. Bitte versuchen Sie es spรคter noch einmal', - 'dashboard.analysis.message.addStockSuccess': 'Erfolgreich hinzugefรผgt', - 'dashboard.analysis.message.addStockFailed': 'Das Hinzufรผgen ist fehlgeschlagen', - 'dashboard.analysis.message.removeStockSuccess': 'Erfolgreich entfernt', - 'dashboard.analysis.message.removeStockFailed': 'Das Entfernen ist fehlgeschlagen', - 'dashboard.analysis.message.resumingAnalysis': 'Analyseaufgabe wird fortgesetzt...', - 'dashboard.analysis.message.deleteSuccess': 'Erfolgreich gelรถscht', - 'dashboard.analysis.message.deleteFailed': 'Lรถschen fehlgeschlagen', - 'dashboard.analysis.modal.history.delete': 'Lรถschen', - 'dashboard.analysis.modal.history.deleteConfirm': 'Mรถchten Sie diesen Analysedatensatz wirklich lรถschen?', - 'dashboard.analysis.test': 'Geschรคft Nr. {no}, Gongzhuan Road', - 'dashboard.analysis.introduce': 'Beschreibung des Indikators', - 'dashboard.analysis.total-sales': 'Gesamtumsatz', - 'dashboard.analysis.day-sales': 'Durchschnittlicher Tagesumsatz๏ฟฅ', - 'dashboard.analysis.visits': 'Besuche', - 'dashboard.analysis.visits-trend': 'Verkehrstrends', - 'dashboard.analysis.visits-ranking': 'Ranking der Ladenbesuche', - 'dashboard.analysis.day-visits': 'Tรคgliche Besuche', - 'dashboard.analysis.week': 'Wรถchentlich im Jahresvergleich', - 'dashboard.analysis.day': 'Jahr fรผr Jahr', - 'dashboard.analysis.payments': 'Anzahl der Zahlungen', - 'dashboard.analysis.conversion-rate': 'Umrechnungskurs', - 'dashboard.analysis.operational-effect': 'Auswirkungen der betrieblichen Tรคtigkeit', - 'dashboard.analysis.sales-trend': 'Verkaufstrends', - 'dashboard.analysis.sales-ranking': 'Ranking der Filialverkรคufe', - 'dashboard.analysis.all-year': 'Das ganze Jahr รผber', - 'dashboard.analysis.all-month': 'diesen Monat', - 'dashboard.analysis.all-week': 'diese Woche', - 'dashboard.analysis.all-day': 'heute', - 'dashboard.analysis.search-users': 'Anzahl der Suchbenutzer', - 'dashboard.analysis.per-capita-search': 'Suchanfragen pro Kopf', - 'dashboard.analysis.online-top-search': 'Beliebte Suchanfragen im Internet', - 'dashboard.analysis.the-proportion-of-sales': 'Anteil der Verkaufskategorie', - 'dashboard.analysis.dropdown-option-one': 'Operation eins', - 'dashboard.analysis.dropdown-option-two': 'Betrieb 2', - 'dashboard.analysis.channel.all': 'Alle Kanรคle', - 'dashboard.analysis.channel.online': 'online', - 'dashboard.analysis.channel.stores': 'speichern', - 'dashboard.analysis.sales': 'Verkรคufe', - 'dashboard.analysis.traffic': 'Passagierfluss', - 'dashboard.analysis.table.rank': 'Rangliste', - 'dashboard.analysis.table.search-keyword': 'Suchbegriffe suchen', - 'dashboard.analysis.table.users': 'Anzahl der Benutzer', - 'dashboard.analysis.table.weekly-range': 'Wรถchentliche Erhรถhung', - 'dashboard.indicator.selectSymbol': 'Wรคhlen Sie den zugrunde liegenden Code aus oder geben Sie ihn ein', - 'dashboard.indicator.emptyWatchlistHint': 'Derzeit sind keine selbst ausgewรคhlten Aktien vorhanden. Bitte fรผgen Sie diese zuerst hinzu', - 'dashboard.indicator.hint.selectSymbol': 'Bitte wรคhlen Sie ein Ziel aus, um mit der Analyse zu beginnen', - 'dashboard.indicator.hint.selectSymbolDesc': 'Wรคhlen Sie einen Aktiencode aus oder geben Sie ihn in das Suchfeld oben ein, um K-Line-Diagramme und technische Indikatoren anzuzeigen', - 'dashboard.indicator.retry': 'Versuchen Sie es erneut', - 'dashboard.indicator.panel.title': 'Technische Indikatoren', - 'dashboard.indicator.panel.realtimeOn': 'Deaktivieren Sie Echtzeit-Updates', - 'dashboard.indicator.panel.realtimeOff': 'Aktivieren Sie Echtzeit-Updates', - 'dashboard.indicator.panel.themeLight': 'Wechseln Sie zum dunklen Thema', - 'dashboard.indicator.panel.themeDark': 'Wechseln Sie zum Lichtthema', - 'dashboard.indicator.section.enabled': 'Aktiviert', - 'dashboard.indicator.section.added': 'Indikatoren, die ich hinzugefรผgt habe', - 'dashboard.indicator.section.custom': 'Von Ihnen selbst erstellte Indikatoren', - 'dashboard.indicator.section.bought': 'Indikatoren, die ich gekauft habe', - 'dashboard.indicator.section.myCreated': 'Von mir erstellte Indikatoren', - 'dashboard.indicator.empty': 'Es gibt noch keinen Indikator. Bitte fรผgen Sie zuerst einen Indikator hinzu oder erstellen Sie ihn', - 'dashboard.indicator.buy': 'Kaufindikator', - 'dashboard.indicator.action.start': 'beginnen', - 'dashboard.indicator.action.stop': 'SchlieรŸen', - 'dashboard.indicator.action.edit': 'Bearbeiten', - 'dashboard.indicator.action.delete': 'Lรถschen', - 'dashboard.indicator.action.backtest': 'Backtest', - 'dashboard.indicator.status.normal': 'normal', - 'dashboard.indicator.status.normalPermanent': 'Normal (dauerhaft gรผltig)', - 'dashboard.indicator.status.expired': 'Abgelaufen', - 'dashboard.indicator.expiry.permanent': 'Dauerhaft gรผltig', - 'dashboard.indicator.expiry.noExpiry': 'Keine Ablaufzeit', - 'dashboard.indicator.expiry.expired': 'Abgelaufen: {Datum}', - 'dashboard.indicator.expiry.expiresOn': 'Ablaufzeit: {Datum}', - 'dashboard.indicator.delete.confirmTitle': 'Bestรคtigen Sie den Lรถschvorgang', - 'dashboard.indicator.delete.confirmContent': 'Sind Sie sicher, dass Sie den Indikator โ€ž{name}โ€œ lรถschen mรถchten? Dieser Vorgang ist irreversibel.', - 'dashboard.indicator.delete.confirmOk': 'Lรถschen', - 'dashboard.indicator.delete.confirmCancel': 'Abbrechen', - 'dashboard.indicator.delete.success': 'Erfolgreich lรถschen', - 'dashboard.indicator.delete.failed': 'Das Lรถschen ist fehlgeschlagen', - 'dashboard.indicator.save.success': 'Erfolgreich gespeichert', - 'dashboard.indicator.save.failed': 'Speichern fehlgeschlagen', - 'dashboard.indicator.error.loadWatchlistFailed': 'Optionale Bestรคnde konnten nicht geladen werden', - 'dashboard.indicator.error.chartNotReady': 'Die Diagrammkomponente ist nicht initialisiert. Bitte wรคhlen Sie zuerst das Ziel aus und warten Sie, bis das Diagramm geladen ist.', - 'dashboard.indicator.error.chartMethodNotReady': 'Die Diagrammkomponentenmethode ist nicht bereit. Bitte versuchen Sie es spรคter erneut', - 'dashboard.indicator.error.chartExecuteNotReady': 'Die Ausfรผhrungsmethode der Diagrammkomponente ist nicht bereit. Bitte versuchen Sie es spรคter erneut', - 'dashboard.indicator.error.parseFailed': 'Python-Code kann nicht analysiert werden', - 'dashboard.indicator.error.parseFailedCheck': 'Der Python-Code kann nicht analysiert werden. Bitte รผberprรผfen Sie das Codeformat', - 'dashboard.indicator.error.addIndicatorFailed': 'Der Indikator konnte nicht hinzugefรผgt werden', - 'dashboard.indicator.error.runIndicatorFailed': 'Die Laufanzeige ist fehlgeschlagen', - 'dashboard.indicator.error.pleaseLogin': 'Bitte melden Sie sich zuerst an', - 'dashboard.indicator.error.loadDataFailed': 'Das Laden der Daten ist fehlgeschlagen', - 'dashboard.indicator.error.loadDataFailedDesc': 'Bitte รผberprรผfen Sie die Netzwerkverbindung', - 'dashboard.indicator.error.pythonEngineFailed': 'Die Python-Engine konnte nicht geladen werden und die Indikatorfunktion ist mรถglicherweise nicht verfรผgbar.', - 'dashboard.indicator.error.chartInitFailed': 'Die Initialisierung des Diagramms ist fehlgeschlagen', - 'dashboard.indicator.warning.enterCode': 'Bitte geben Sie zuerst den Indikatorcode ein', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Die Python-Engine konnte nicht geladen werden', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'Diese Funktion ist in Ihrer aktuellen Region oder Netzwerkumgebung nicht verfรผgbar', - 'dashboard.indicator.warning.chartNotInitialized': 'Das Diagramm ist nicht initialisiert und das Linienzeichnungstool kann nicht verwendet werden.', - 'dashboard.indicator.success.runIndicator': 'Indikator lรคuft erfolgreich', - 'dashboard.indicator.success.clearDrawings': 'Alle Strichzeichnungen gelรถscht', - 'dashboard.indicator.sma': 'SMA (gleitende Durchschnittskombination)', - 'dashboard.indicator.ema': 'EMA (exponentielle gleitende Durchschnittskombination)', - 'dashboard.indicator.rsi': 'RSI (relative Stรคrke)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'Bollinger-Bรคnder', - 'dashboard.indicator.atr': 'ATR (Average True Range)', - 'dashboard.indicator.cci': 'CCI (Commodity Channel Index)', - 'dashboard.indicator.williams': 'Williams %R (Williams-Indikator)', - 'dashboard.indicator.mfi': 'MFI (Geldflussindex)', - 'dashboard.indicator.adx': 'ADX (durchschnittlicher Trendindex)', - 'dashboard.indicator.obv': 'OBV (Energiewelle)', - 'dashboard.indicator.adosc': 'ADOSC (Akkumulieren/Dispatch-Oszillator)', - 'dashboard.indicator.ad': 'AD (Sammel-/Verteilungsleitung)', - 'dashboard.indicator.kdj': 'KDJ (stochastischer Indikator)', - 'dashboard.indicator.signal.buy': 'KAUFEN', - 'dashboard.indicator.signal.sell': 'VERKAUFEN', - 'dashboard.indicator.signal.supertrendBuy': 'SuperTrend kaufen', - 'dashboard.indicator.signal.supertrendSell': 'SuperTrend verkaufen', - 'dashboard.indicator.chart.kline': 'K-Linie', - 'dashboard.indicator.chart.volume': 'Lautstรคrke', - 'dashboard.indicator.chart.uptrend': 'Aufwรคrtstrend', - 'dashboard.indicator.chart.downtrend': 'Abwรคrtstrend', - 'dashboard.indicator.tooltip.time': 'Zeit', - 'dashboard.indicator.tooltip.open': 'offen', - 'dashboard.indicator.tooltip.close': 'erhalten', - 'dashboard.indicator.tooltip.high': 'hoch', - 'dashboard.indicator.tooltip.low': 'niedrig', - 'dashboard.indicator.tooltip.volume': 'Lautstรคrke', - 'dashboard.indicator.drawing.line': 'Liniensegment', - 'dashboard.indicator.drawing.horizontalLine': 'horizontale Linie', - 'dashboard.indicator.drawing.verticalLine': 'vertikale Linie', - 'dashboard.indicator.drawing.ray': 'Strahl', - 'dashboard.indicator.drawing.straightLine': 'gerade Linie', - 'dashboard.indicator.drawing.parallelLine': 'parallele Linien', - 'dashboard.indicator.drawing.priceLine': 'Preislinie', - 'dashboard.indicator.drawing.priceChannel': 'Preiskanal', - 'dashboard.indicator.drawing.fibonacciLine': 'Fibonacci-Linien', - 'dashboard.indicator.drawing.clearAll': 'Lรถschen Sie alle Strichzeichnungen', - 'dashboard.indicator.market.USStock': 'US-Aktien', - 'dashboard.indicator.market.Crypto': 'Kryptowรคhrung', - 'dashboard.indicator.market.Forex': 'Forex', - 'dashboard.indicator.market.Futures': 'Futures', - 'dashboard.indicator.create': 'Indikator erstellen', - 'dashboard.indicator.editor.title': 'Indikatoren erstellen/bearbeiten', - 'dashboard.indicator.editor.name': 'Indikatorname', - 'dashboard.indicator.editor.nameRequired': 'Bitte geben Sie den Indikatornamen ein', - 'dashboard.indicator.editor.namePlaceholder': 'Bitte geben Sie den Indikatornamen ein', - 'dashboard.indicator.editor.description': 'Beschreibung des Indikators', - 'dashboard.indicator.editor.descriptionPlaceholder': 'Bitte geben Sie eine Beschreibung des Indikators ein (optional)', - 'dashboard.indicator.editor.code': 'Python-Code', - 'dashboard.indicator.editor.codeRequired': 'Bitte geben Sie den Indikatorcode ein', - 'dashboard.indicator.editor.codePlaceholder': 'Bitte geben Sie Python-Code ein', - 'dashboard.indicator.editor.run': 'laufen', - 'dashboard.indicator.editor.runHint': 'Klicken Sie auf die Schaltflรคche โ€žAusfรผhrenโ€œ, um eine Vorschau des Indikatoreffekts im K-Liniendiagramm anzuzeigen', - 'dashboard.indicator.editor.guide': 'Entwicklungshandbuch', - 'dashboard.indicator.editor.guideTitle': 'Leitfaden zur Entwicklung von Python-Indikatoren', - 'dashboard.indicator.editor.save': 'speichern', - 'dashboard.indicator.editor.cancel': 'Abbrechen', - 'dashboard.indicator.editor.unnamed': 'Unbenannter Indikator', - 'dashboard.indicator.editor.publishToCommunity': 'In der Community posten', - 'dashboard.indicator.editor.publishToCommunityHint': 'Nach der Verรถffentlichung kรถnnen andere Benutzer Ihren Indikator in der Community anzeigen und verwenden', - 'dashboard.indicator.editor.indicatorType': 'Indikatortyp', - 'dashboard.indicator.editor.indicatorTypeRequired': 'Bitte wรคhlen Sie den Indikatortyp aus', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'Bitte wรคhlen Sie den Indikatortyp aus', - 'dashboard.indicator.editor.previewImage': 'Vorschau', - 'dashboard.indicator.editor.uploadImage': 'Bilder hochladen', - 'dashboard.indicator.editor.previewImageHint': 'Empfohlene GrรถรŸe: 800 x 400, nicht mehr als 2 MB', - 'dashboard.indicator.editor.pricing': 'Verkaufspreis (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'kostenlos', - 'dashboard.indicator.editor.pricingType.permanent': 'dauerhaft', - 'dashboard.indicator.editor.pricingType.monthly': 'monatliche Zahlung', - 'dashboard.indicator.editor.price': 'Preis', - 'dashboard.indicator.editor.priceRequired': 'Bitte geben Sie den Preis ein', - 'dashboard.indicator.editor.pricePlaceholder': 'Bitte geben Sie den Preis ein', - 'dashboard.indicator.editor.pricingHint': 'Obwohl der Preis fรผr kostenlose Indikatoren 0 betrรคgt, belohnt Sie die Plattform (QDT) basierend auf Ihrer Indikatornutzung und Lobrate.', - 'dashboard.indicator.editor.aiGenerate': 'Intelligente Generation', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'Teilen Sie mir Ihre Ideen mit und ich werde den Python-Indikatorcode fรผr Sie generieren', - 'dashboard.indicator.editor.aiGenerateBtn': 'KI-generierter Code', - 'dashboard.indicator.editor.aiPromptRequired': 'Bitte geben Sie Ihre Gedanken ein', - 'dashboard.indicator.editor.aiGenerateSuccess': 'Codegenerierung erfolgreich', - 'dashboard.indicator.editor.aiGenerateError': 'Die Codegenerierung ist fehlgeschlagen. Bitte versuchen Sie es spรคter noch einmal', - 'dashboard.indicator.backtest.title': 'Indikator-Backtest', - 'dashboard.indicator.backtest.config': 'Backtest-Parameter', - 'dashboard.indicator.backtest.startDate': 'Startdatum', - 'dashboard.indicator.backtest.endDate': 'Enddatum', - 'dashboard.indicator.backtest.selectStartDate': 'Wรคhlen Sie das Startdatum', - 'dashboard.indicator.backtest.selectEndDate': 'Wรคhlen Sie das Enddatum aus', - 'dashboard.indicator.backtest.startDateRequired': 'Bitte wรคhlen Sie ein Startdatum aus', - 'dashboard.indicator.backtest.endDateRequired': 'Bitte wรคhlen Sie ein Enddatum aus', - 'dashboard.indicator.backtest.initialCapital': 'Anfangskapital', - 'dashboard.indicator.backtest.initialCapitalRequired': 'Bitte geben Sie den Anfangsbetrag ein', - 'dashboard.indicator.backtest.commission': 'Bearbeitungsgebรผhr', - 'dashboard.indicator.backtest.leverage': 'Verschuldungsquote', - 'dashboard.indicator.backtest.tradeDirection': 'Handelsrichtung', - 'dashboard.indicator.backtest.longOnly': 'Geh lange', - 'dashboard.indicator.backtest.shortOnly': 'kurz', - 'dashboard.indicator.backtest.both': 'Zweiseitig', - 'dashboard.indicator.backtest.run': 'Beginnen Sie mit dem Backtesting', - 'dashboard.indicator.backtest.rerun': 'Nochmals Backtest', - 'dashboard.indicator.backtest.close': 'SchlieรŸen', - 'dashboard.indicator.backtest.running': 'Indikator-Backtest lรคuft...', - 'dashboard.indicator.backtest.results': 'Backtest-Ergebnisse', - 'dashboard.indicator.backtest.totalReturn': 'Gesamtrendite', - 'dashboard.indicator.backtest.annualReturn': 'annualisiertes Einkommen', - 'dashboard.indicator.backtest.maxDrawdown': 'maximaler Drawdown', - 'dashboard.indicator.backtest.sharpeRatio': 'Sharpe-Ratio', - 'dashboard.indicator.backtest.winRate': 'Gewinnquote', - 'dashboard.indicator.backtest.profitFactor': 'Gewinn-Verlust-Verhรคltnis', - 'dashboard.indicator.backtest.totalTrades': 'Anzahl der Transaktionen', - 'dashboard.indicator.totalReturn': 'Gesamtrendite', - 'dashboard.indicator.annualReturn': 'annualisierte Rendite', - 'dashboard.indicator.maxDrawdown': 'maximaler Drawdown', - 'dashboard.indicator.sharpeRatio': 'Sharpe-Ratio', - 'dashboard.indicator.winRate': 'Gewinnquote', - 'dashboard.indicator.profitFactor': 'Gewinn-Verlust-Verhรคltnis', - 'dashboard.indicator.totalTrades': 'Gesamtzahl der Transaktionen', - 'dashboard.indicator.backtest.totalCommission': 'Gesamtbearbeitungsgebรผhr', - 'dashboard.indicator.backtest.equityCurve': 'Zinskurve', - 'dashboard.indicator.backtest.strategy': 'Indikatoreinkommen', - 'dashboard.indicator.backtest.benchmark': 'Benchmark-Rendite', - 'dashboard.indicator.backtest.tradeHistory': 'Transaktionsverlauf', - 'dashboard.indicator.backtest.tradeTime': 'Zeit', - 'dashboard.indicator.backtest.tradeType': 'Typ', - 'dashboard.indicator.backtest.buy': 'kaufen', - 'dashboard.indicator.backtest.sell': 'verkaufen', - 'dashboard.indicator.backtest.liquidation': 'Liquidation', - 'dashboard.indicator.backtest.openLong': 'Lange geรถffnet', - 'dashboard.indicator.backtest.closeLong': 'Pinduo', - 'dashboard.indicator.backtest.closeLongStop': 'Nahezu long (Stop-Loss)', - 'dashboard.indicator.backtest.closeLongProfit': 'Mehr schlieรŸen (Gewinn mitnehmen)', - 'dashboard.indicator.backtest.addLong': 'Long-Position hinzufรผgen', - 'dashboard.indicator.backtest.openShort': 'Kurz รถffnen', - 'dashboard.indicator.backtest.closeShort': 'leer', - 'dashboard.indicator.backtest.closeShortStop': 'SchlieรŸen (Stop-Loss)', - 'dashboard.indicator.backtest.closeShortProfit': 'SchlieรŸen (Gewinn mitnehmen)', - 'dashboard.indicator.backtest.addShort': 'Short-Position hinzufรผgen', - 'dashboard.indicator.backtest.price': 'Preis', - 'dashboard.indicator.backtest.amount': 'Menge', - 'dashboard.indicator.backtest.balance': 'Kontostand', - 'dashboard.indicator.backtest.profit': 'Gewinn und Verlust', - 'dashboard.indicator.backtest.success': 'Backtest abgeschlossen', - 'dashboard.indicator.backtest.failed': 'Der Backtest ist fehlgeschlagen. Bitte versuchen Sie es spรคter noch einmal', - 'dashboard.indicator.backtest.noIndicatorCode': 'Fรผr diesen Indikator gibt es keinen rรผckprรผfbaren Code', - 'dashboard.indicator.backtest.noSymbol': 'Bitte wรคhlen Sie zunรคchst das Transaktionsziel aus', - 'dashboard.indicator.backtest.dateRangeExceeded': 'Der Backtest-Zeitbereich รผberschreitet das Limit: {timeframe} Zeitraum kann hรถchstens {maxRange} backtestet werden', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'Dokumentenzentrum', - 'dashboard.docs.search.placeholder': 'Dokumente durchsuchen...', - 'dashboard.docs.category.all': 'Alle', - 'dashboard.docs.category.guide': 'Entwicklungshandbuch', - 'dashboard.docs.category.api': 'API-Dokumentation', - 'dashboard.docs.category.tutorial': 'Anleitung', - 'dashboard.docs.category.faq': 'FAQ', - 'dashboard.docs.featured.title': 'Empfohlene Dokumentation', - 'dashboard.docs.featured.tag': 'Empfohlen', - 'dashboard.docs.list.views': 'Durchsuchen', - 'dashboard.docs.list.author': 'Autor', - 'dashboard.docs.list.empty': 'Noch kein Dokument', - 'dashboard.docs.list.backToAll': 'Zurรผck zu allen Dokumenten', - 'dashboard.docs.list.total': 'Insgesamt {count} Dokumente', - 'dashboard.docs.detail.back': 'Zurรผck zur Dokumentenliste', - 'dashboard.docs.detail.updatedAt': 'aktualisiert am', - 'dashboard.docs.detail.related': 'Verwandte Dokumente', - 'dashboard.docs.detail.notFound': 'Dokument existiert nicht', - 'dashboard.docs.detail.error': 'Das Dokument existiert nicht oder wurde gelรถscht', - 'dashboard.docs.search.result': 'Suchergebnisse', - 'dashboard.docs.search.keyword': 'Schlรผsselwรถrter', - 'community.filter.indicatorType': 'Indikatortyp', - 'community.filter.all': 'Alle', - 'community.filter.other': 'Andere Optionen', - 'community.filter.pricing': 'Preisart', - 'community.filter.allPricing': 'Alle Preise', - 'community.filter.sortBy': 'Sortieren nach', - 'community.filter.search': 'Suchen', - 'community.filter.searchPlaceholder': 'Metrikname suchen', - 'community.indicatorType.trend': 'Trendtyp', - 'community.indicatorType.momentum': 'Impulstyp', - 'community.indicatorType.volatility': 'Volatilitรคt', - 'community.indicatorType.volume': 'Lautstรคrke', - 'community.indicatorType.custom': 'Anpassen', - 'community.pricing.free': 'kostenlos', - 'community.pricing.paid': 'Bezahlen', - 'community.sort.downloads': 'Downloads', - 'community.sort.rating': 'Bewertung', - 'community.sort.newest': 'Neueste Verรถffentlichungen', - 'community.pagination.total': '{total} Indikatoren insgesamt', - 'community.noDescription': 'Noch keine Beschreibung', - 'community.detail.type': 'Typ', - 'community.detail.pricing': 'Preise', - 'community.detail.rating': 'Bewertung', - 'community.detail.downloads': 'Downloads', - 'community.detail.author': 'Autor', - 'community.detail.description': 'Einfรผhrung', - 'community.detail.detailContent': 'Detaillierte Beschreibung', - 'community.detail.backtestStats': 'Backtest-Statistiken', - 'community.action.purchase': 'Kaufindikator', - 'community.action.addToMyIndicators': 'Zu meinen Indikatoren hinzufรผgen', - 'community.action.favorite': 'Sammlung', - 'community.action.unfavorite': 'Favoriten abbrechen', - 'community.action.buyNow': 'Jetzt kaufen', - 'community.action.renew': 'Erneuerung', - 'community.purchase.price': 'Preis', - 'community.purchase.permanent': 'dauerhaft', - 'community.purchase.monthly': 'Monat', - 'community.purchase.confirmBuy': 'Bestรคtigen Sie den Kauf dieses Indikators ({price} QDT)?', - 'community.purchase.confirmRenew': 'Bestรคtigen Sie die Erneuerung dieses Indikators ({price} QDT/Monat)?', - 'community.purchase.confirmFree': 'Bestรคtigen Sie, dass Sie diesen kostenlosen Indikator hinzufรผgen mรถchten?', - 'community.purchase.confirmTitle': 'Aktion bestรคtigen', - 'community.purchase.owned': 'Sie haben diesen Indikator erworben (dauerhaft gรผltig)', - 'community.purchase.ownIndicator': 'Dies ist die von Ihnen verรถffentlichte Metrik', - 'community.purchase.expired': 'Ihr Abonnement ist abgelaufen', - 'community.purchase.expiresOn': 'Ablaufzeit: {Datum}', - 'community.tabs.detail': 'Indikatordetails', - 'community.tabs.backtest': 'Backtest-Daten', - 'community.tabs.ratings': 'Benutzerbewertungen', - 'community.rating.myRating': 'Meine Bewertung', - 'community.rating.stars': '{count} Sterne', - 'community.rating.commentPlaceholder': 'Teilen Sie Ihre Erfahrungen...', - 'community.rating.submit': 'Bewertung abgeben', - 'community.rating.modify': 'ร„ndern', - 'community.rating.saveModify': 'ร„nderungen speichern', - 'community.rating.cancel': 'Abbrechen', - 'community.rating.selectRating': 'Bitte wรคhlen Sie eine Bewertung aus', - 'community.rating.success': 'Bewertung erfolgreich', - 'community.rating.modifySuccess': 'Bewertung erfolgreich geรคndert', - 'community.rating.failed': 'Bewertung fehlgeschlagen', - 'community.rating.noRatings': 'Noch keine Kommentare', - 'community.backtest.note': 'Die oben genannten Daten sind historische Backtest-Ergebnisse und dienen nur als Referenz und stellen keine zukรผnftigen Ertrรคge dar.', - 'community.backtest.noData': 'Noch keine Backtest-Daten', - 'community.backtest.uploadHint': 'Der Autor hat noch keine Backtest-Daten hochgeladen', - 'community.message.loadFailed': 'Die Indikatorliste konnte nicht geladen werden', - 'community.message.purchaseProcessing': 'Kaufanfrage wird bearbeitet...', - 'community.message.downloadSuccess': 'Die Metrik wurde zu meiner Metrikliste hinzugefรผgt', - 'community.message.favoriteSuccess': 'Sammlung erfolgreich', - 'community.message.unfavoriteSuccess': 'Abholung erfolgreich abbrechen', - 'community.message.operationSuccess': 'Operation erfolgreich', - 'community.message.operationFailed': 'Der Vorgang ist fehlgeschlagen', - 'community.banner.readOnly': 'Nur lesen', - 'community.banner.loginHint': 'Fรผr Login oder Registrierung bitte auf die Schaltflรคche klicken, um zu einer unabhรคngigen Seite zu wechseln und CSRF-Probleme zu vermeiden', - 'community.banner.jumpButton': 'Zur Anmeldung/Registrierung', - 'dashboard.totalEquity': 'Gesamteigenkapital', - 'dashboard.totalPnL': 'Gesamtgewinn und -verlust', - 'dashboard.aiStrategies': 'KI-Strategie', - 'dashboard.indicatorStrategies': 'Indikatorstrategie', - 'dashboard.running': 'Laufen', - 'dashboard.pnlHistory': 'historischer Gewinn und Verlust', - 'dashboard.strategyPerformance': 'Gewinn- und Verlustquote der Strategie', - 'dashboard.recentTrades': 'aktuelle Transaktionen', - 'dashboard.currentPositions': 'Aktuelle Position', - 'dashboard.table.time': 'Zeit', - 'dashboard.table.strategy': 'Richtlinienname', - 'dashboard.table.symbol': 'Ziel', - 'dashboard.table.type': 'Typ', - 'dashboard.table.side': 'Richtung', - 'dashboard.table.size': 'Offenes Interesse', - 'dashboard.table.entryPrice': 'durchschnittlicher Erรถffnungspreis', - 'dashboard.table.price': 'Preis', - 'dashboard.table.amount': 'Menge', - 'dashboard.table.profit': 'Gewinn und Verlust', - 'dashboard.pendingOrders': 'Auftragsausfรผhrungsprotokoll', - 'dashboard.totalOrders': 'Gesamt {total} Auftrรคge', - 'dashboard.viewError': 'Fehler anzeigen', - 'dashboard.filled': 'Ausgefรผhrt', - 'dashboard.orderTable.time': 'Erstellungszeit', - 'dashboard.orderTable.strategy': 'Strategie', - 'dashboard.orderTable.symbol': 'Handelspaar', - 'dashboard.orderTable.signalType': 'Signaltyp', - 'dashboard.orderTable.amount': 'Menge', - 'dashboard.orderTable.price': 'Ausfรผhrungspreis', - 'dashboard.orderTable.status': 'Status', - 'dashboard.orderTable.executedAt': 'Ausfรผhrungszeit', - 'dashboard.signalType.openLong': 'Long รถffnen', - 'dashboard.signalType.openShort': 'Short รถffnen', - 'dashboard.signalType.closeLong': 'Long schlieรŸen', - 'dashboard.signalType.closeShort': 'Short schlieรŸen', - 'dashboard.signalType.addLong': 'Long hinzufรผgen', - 'dashboard.signalType.addShort': 'Short hinzufรผgen', - 'dashboard.status.pending': 'Ausstehend', - 'dashboard.status.processing': 'In Bearbeitung', - 'dashboard.status.completed': 'Abgeschlossen', - 'dashboard.status.failed': 'Fehlgeschlagen', - 'dashboard.status.cancelled': 'Storniert', - 'dashboard.table.pnl': 'nicht realisierter Gewinn oder Verlust', - 'form.basic-form.basic.title': 'Grundform', - 'form.basic-form.basic.description': 'Formularseiten werden verwendet, um Informationen von Benutzern zu sammeln oder zu รผberprรผfen. Grundformulare werden hรคufig in Formularszenarien mit wenigen Datenelementen verwendet.', - 'form.basic-form.title.label': 'Titel', - 'form.basic-form.title.placeholder': 'Geben Sie dem Ziel einen Namen', - 'form.basic-form.title.required': 'Bitte geben Sie einen Titel ein', - 'form.basic-form.date.label': 'Start- und Enddatum', - 'form.basic-form.placeholder.start': 'Startdatum', - 'form.basic-form.placeholder.end': 'Enddatum', - 'form.basic-form.date.required': 'Bitte wรคhlen Sie Start- und Enddatum aus', - 'form.basic-form.goal.label': 'Zielbeschreibung', - 'form.basic-form.goal.placeholder': 'Bitte geben Sie Ihre schrittweisen Arbeitsziele ein', - 'form.basic-form.goal.required': 'Bitte geben Sie eine Zielbeschreibung ein', - 'form.basic-form.standard.label': 'messen', - 'form.basic-form.standard.placeholder': 'Bitte geben Sie Messwerte ein', - 'form.basic-form.standard.required': 'Bitte geben Sie Messwerte ein', - 'form.basic-form.client.label': 'Kunde', - 'form.basic-form.client.required': 'Bitte beschreiben Sie die Kunden, die Sie betreuen', - 'form.basic-form.label.tooltip': 'Zielgruppe der Leistungsempfรคnger', - 'form.basic-form.client.placeholder': 'Bitte beschreiben Sie die von Ihnen betreuten Kunden, interne Kunden direkt @Name/Auftragsnummer', - 'form.basic-form.invites.label': 'Laden Sie Gutachter ein', - 'form.basic-form.invites.placeholder': 'Bitte direkt @Name/Mitarbeiternummer angeben, es kรถnnen bis zu 5 Personen einladen', - 'form.basic-form.weight.label': 'Gewicht', - 'form.basic-form.weight.placeholder': 'Bitte treten Sie ein', - 'form.basic-form.public.label': 'Zielpublikum', - 'form.basic-form.label.help': 'Kunden und Rezensenten werden standardmรครŸig geteilt', - 'form.basic-form.radio.public': 'รถffentlich', - 'form.basic-form.radio.partially-public': 'Teilweise รถffentlich', - 'form.basic-form.radio.private': 'privat', - 'form.basic-form.publicUsers.placeholder': 'offen fรผr', - 'form.basic-form.option.A': 'Kollege 1', - 'form.basic-form.option.B': 'Kollege 2', - 'form.basic-form.option.C': 'Kollege drei', - 'form.basic-form.email.required': 'Bitte geben Sie Ihre E-Mail-Adresse ein!', - 'form.basic-form.email.wrong-format': 'Das E-Mail-Adressformat ist falsch!', - 'form.basic-form.userName.required': 'Bitte Benutzernamen eingeben!', - 'form.basic-form.password.required': 'Bitte geben Sie Ihr Passwort ein!', - 'form.basic-form.password.twice': 'Die doppelt eingegebenen Passwรถrter stimmen nicht รผberein!', - 'form.basic-form.strength.msg': 'Bitte geben Sie mindestens 6 Zeichen ein. Bitte verwenden Sie keine Passwรถrter, die leicht zu erraten sind.', - 'form.basic-form.strength.strong': 'Stรคrke: Stark', - 'form.basic-form.strength.medium': 'Stรคrke: Mittel', - 'form.basic-form.strength.short': 'Stรคrke: zu kurz', - 'form.basic-form.confirm-password.required': 'Bitte bestรคtigen Sie Ihr Passwort!', - 'form.basic-form.phone-number.required': 'Bitte geben Sie Ihre Mobiltelefonnummer ein!', - 'form.basic-form.phone-number.wrong-format': 'Das Format der Mobiltelefonnummer ist falsch!', - 'form.basic-form.verification-code.required': 'Bitte geben Sie den Verifizierungscode ein!', - 'form.basic-form.form.get-captcha': 'Holen Sie sich den Bestรคtigungscode', - 'form.basic-form.captcha.second': 'Sekunden', - 'form.basic-form.form.optional': '(optional)', - 'form.basic-form.form.submit': 'Senden', - 'form.basic-form.form.save': 'speichern', - 'form.basic-form.email.placeholder': 'E-Mail', - 'form.basic-form.password.placeholder': 'Passwort mit mindestens 6 Zeichen, GroรŸ- und Kleinschreibung beachten', - 'form.basic-form.confirm-password.placeholder': 'Passwort bestรคtigen', - 'form.basic-form.phone-number.placeholder': 'Mobiltelefonnummer', - 'form.basic-form.verification-code.placeholder': 'Bestรคtigungscode', - 'result.success.title': 'รœbermittlung erfolgreich', - 'result.success.description': 'Die Seite mit den รœbermittlungsergebnissen wird verwendet, um Rรผckmeldungen zu den Verarbeitungsergebnissen einer Reihe von Vorgangsaufgaben zu geben. Wenn es sich nur um einen einfachen Vorgang handelt, verwenden Sie das globale Eingabeaufforderungs-Feedback โ€žNachrichtโ€œ. In diesem Textbereich kรถnnen einfache Zusatzanweisungen angezeigt werden. Bei Bedarf zur Darstellung von โ€žDokumentenโ€œ kรถnnen im grauen Bereich darunter komplexere Inhalte angezeigt werden.', - 'result.success.operate-title': 'Projektname', - 'result.success.operate-id': 'Projekt-ID', - 'result.success.principal': 'Verantwortliche Person', - 'result.success.operate-time': 'Effektive Zeit', - 'result.success.step1-title': 'Projekt erstellen', - 'result.success.step1-operator': 'Qu Lili', - 'result.success.step2-title': 'Vorlรคufige Prรผfung der Abteilung', - 'result.success.step2-operator': 'Zhou Maomao', - 'result.success.step2-extra': 'Dringend', - 'result.success.step3-title': 'Finanzielle รœberprรผfung', - 'result.success.step4-title': 'Komplett', - 'result.success.btn-return': 'Zurรผck zur Liste', - 'result.success.btn-project': 'Artikel ansehen', - 'result.success.btn-print': 'Drucken', - 'result.fail.error.title': 'Die รœbermittlung ist fehlgeschlagen', - 'result.fail.error.description': 'Bitte รผberprรผfen und รคndern Sie die folgenden Informationen, bevor Sie sie erneut einreichen.', - 'result.fail.error.hint-title': 'Der von Ihnen รผbermittelte Inhalt enthรคlt die folgenden Fehler:', - 'result.fail.error.hint-text1': 'Ihr Konto wurde gesperrt', - 'result.fail.error.hint-btn1': 'Sofort auftauen', - 'result.fail.error.hint-text2': 'Ihr Konto ist noch nicht antragsberechtigt', - 'result.fail.error.hint-btn2': 'Jetzt upgraden', - 'result.fail.error.btn-text': 'Zurรผck zur ร„nderung', - 'account.settings.menuMap.custom': 'Personalisierung', - 'account.settings.menuMap.binding': 'Kontobindung', - 'account.settings.basic.avatar': 'Avatar', - 'account.settings.basic.change-avatar': 'Avatar รคndern', - 'account.settings.basic.email': 'E-Mail', - 'account.settings.basic.email-message': 'Bitte geben Sie Ihre E-Mail ein!', - 'account.settings.basic.nickname': 'Spitzname', - 'account.settings.basic.nickname-message': 'Bitte geben Sie Ihren Spitznamen ein!', - 'account.settings.basic.profile': 'Profil', - 'account.settings.basic.profile-message': 'Bitte geben Sie Ihr persรถnliches Profil ein!', - 'account.settings.basic.profile-placeholder': 'Profil', - 'account.settings.basic.country': 'Land/Region', - 'account.settings.basic.country-message': 'Bitte geben Sie Ihr Land oder Ihre Region ein!', - 'account.settings.basic.geographic': 'Provinz und Stadt', - 'account.settings.basic.geographic-message': 'Bitte geben Sie Ihr Bundesland und Ihre Stadt ein!', - 'account.settings.basic.address': 'StraรŸenadresse', - 'account.settings.basic.address-message': 'Bitte geben Sie Ihre StraรŸe ein!', - 'account.settings.basic.phone': 'Kontaktnummer', - 'account.settings.basic.phone-message': 'Bitte geben Sie Ihre Kontaktnummer ein!', - 'account.settings.basic.update': 'Grundlegende Informationen aktualisieren', - 'account.settings.basic.update.success': 'Grundlegende Informationen erfolgreich aktualisieren', - 'account.settings.security.strong': 'Stark', - 'account.settings.security.medium': 'in', - 'account.settings.security.weak': 'schwach', - 'account.settings.security.password': 'Kontopasswort', - 'account.settings.security.password-description': 'Aktuelle Passwortstรคrke:', - 'account.settings.security.phone': 'Sicherheitshandy', - 'account.settings.security.phone-description': 'Bereits gebundenes Mobiltelefon:', - 'account.settings.security.question': 'Sicherheitsprobleme', - 'account.settings.security.question-description': 'Es werden keine Sicherheitsfragen gestellt, wodurch die Kontosicherheit wirksam geschรผtzt werden kann.', - 'account.settings.security.email': 'E-Mail binden', - 'account.settings.security.email-description': 'Bereits gebundene E-Mail-Adresse:', - 'account.settings.security.mfa': 'MFA-Gerรคt', - 'account.settings.security.mfa-description': 'Das MFA-Gerรคt ist nicht gebunden. Nach der Bindung kรถnnen Sie noch einmal bestรคtigen.', - 'account.settings.security.modify': 'ร„ndern', - 'account.settings.security.set': 'Einstellungen', - 'account.settings.security.bind': 'verbindlich', - 'account.settings.binding.taobao': 'Binde Taobao', - 'account.settings.binding.taobao-description': 'Das Taobao-Konto ist derzeit nicht gebunden', - 'account.settings.binding.alipay': 'Alipay binden', - 'account.settings.binding.alipay-description': 'Das Alipay-Konto ist derzeit nicht gebunden', - 'account.settings.binding.dingding': 'Bindung von DingTalk', - 'account.settings.binding.dingding-description': 'Derzeit ist kein DingTalk-Konto gebunden', - 'account.settings.binding.bind': 'verbindlich', - 'account.settings.notification.password': 'Kontopasswort', - 'account.settings.notification.password-description': 'Nachrichten von anderen Benutzern werden in Form von Site-Nachrichten benachrichtigt.', - 'account.settings.notification.messages': 'Systemmeldungen', - 'account.settings.notification.messages-description': 'Systemmeldungen werden in Form von Site-Nachrichten benachrichtigt.', - 'account.settings.notification.todo': 'Zu erledigende Aufgaben', - 'account.settings.notification.todo-description': 'Zu erledigende Aufgaben werden in Form von In-Site-Nachrichten benachrichtigt', - 'account.settings.settings.open': 'offen', - 'account.settings.settings.close': 'schlieรŸen', - 'trading-assistant.title': 'Handelsassistent', - 'trading-assistant.strategyList': 'Strategieliste', - 'trading-assistant.createStrategy': 'Richtlinie erstellen', - 'trading-assistant.noStrategy': 'Noch keine Strategie', - 'trading-assistant.selectStrategy': 'Bitte wรคhlen Sie links eine Strategie aus, um Details anzuzeigen', - 'trading-assistant.startStrategy': 'Startstrategie', - 'trading-assistant.stopStrategy': 'Stoppstrategie', - 'trading-assistant.editStrategy': 'Redaktionelle Strategie', - 'trading-assistant.deleteStrategy': 'Richtlinie lรถschen', - 'trading-assistant.status.running': 'Laufen', - 'trading-assistant.status.stopped': 'Angehalten', - 'trading-assistant.status.error': 'Fehler', - 'trading-assistant.strategyType.IndicatorStrategy': 'Technische Indikatorstrategie', - 'trading-assistant.strategyType.PromptBasedStrategy': 'Stichwortstrategie', - 'trading-assistant.strategyType.GridStrategy': 'Grid-Strategie', - 'trading-assistant.tabs.tradingRecords': 'Transaktionsverlauf', - 'trading-assistant.tabs.positions': 'Positionsaufzeichnung', - 'trading-assistant.tabs.equityCurve': 'Eigenkapitalkurve', - 'trading-assistant.form.step1': 'Wรคhlen Sie Indikatoren aus', - 'trading-assistant.form.step2': 'Exchange-Konfiguration', - 'trading-assistant.form.step3': 'Strategieparameter', - 'trading-assistant.form.step2Params': 'Parameter', - 'trading-assistant.form.step3Signal': 'Signalzustellung', - 'trading-assistant.form.marketCategory': 'Marktkategorie', - 'trading-assistant.form.marketCategoryHint': 'Wรคhlen Sie zuerst den Markt. Nur Krypto kann Live-Trading aktivieren; andere Mรคrkte sind nur Signal.', - 'trading-assistant.market.USStock': 'US-Aktien', - 'trading-assistant.market.Crypto': 'Krypto', - 'trading-assistant.market.Forex': 'Forex', - 'trading-assistant.form.indicator': 'Wรคhlen Sie Indikatoren aus', - 'trading-assistant.form.indicatorHint': 'Sie kรถnnen nur technische Indikatoren auswรคhlen, die Sie gekauft oder erstellt haben', - 'trading-assistant.form.qdtCostHints': 'Bei Verwendung dieser Strategie wird QDT verbraucht. Bitte stellen Sie sicher, dass das Konto รผber ausreichend QDT-Guthaben verfรผgt', - 'trading-assistant.form.indicatorDescription': 'Beschreibung des Indikators', - 'trading-assistant.form.noDescription': 'Noch keine Beschreibung', - 'trading-assistant.form.exchange': 'Austausch auswรคhlen', - 'trading-assistant.form.apiKey': 'API-Schlรผssel', - 'trading-assistant.form.secretKey': 'Geheimer Schlรผssel', - 'trading-assistant.form.passphrase': 'Passphrase', - 'trading-assistant.form.testConnection': 'Testverbindung', - 'trading-assistant.form.strategyName': 'Richtlinienname', - 'trading-assistant.form.symbol': 'Handelspaar', - 'trading-assistant.form.symbolHint': 'Das Symbolformat hรคngt vom ausgewรคhlten Markt ab', - 'trading-assistant.form.symbolHintCrypto': 'Krypto: z.B. BTC/USDT', - 'trading-assistant.form.symbolHintGeneral': 'Geben Sie das Symbol des gewรคhlten Marktes ein (z.B. 600519, AAPL, EURUSD).', - 'trading-assistant.form.initialCapital': 'Hรถhe der Investition', - 'trading-assistant.form.marketType': 'Markttyp', - 'trading-assistant.form.marketTypeFutures': 'Vertrag', - 'trading-assistant.form.marketTypeSpot': 'Spot', - 'trading-assistant.form.marketTypeHint': 'Der Kontrakt unterstรผtzt bidirektionalen Handel und Leverage, wรคhrend der Spot nur Long-Positionen unterstรผtzt und der Leverage auf 1x festgelegt ist', - 'trading-assistant.form.leverage': 'Nutzen Sie mehrere', - 'trading-assistant.form.leverageHint': 'Vertrag: 1-125 Mal, Spot: 1 Mal fest', - 'trading-assistant.form.spotLeverageFixed': 'Der Hebel fรผr den Spothandel ist auf 1x festgelegt', - 'trading-assistant.form.spotOnlyLongHint': 'Der Spothandel unterstรผtzt nur Long-Positionen', - 'trading-assistant.form.tradeDirection': 'Handelsrichtung', - 'trading-assistant.form.tradeDirectionLong': 'Nur lang', - 'trading-assistant.form.tradeDirectionShort': 'Nur kurz', - 'trading-assistant.form.tradeDirectionBoth': 'zweiseitige Transaktion', - 'trading-assistant.form.timeframe': 'Zeitraum', - 'trading-assistant.form.klinePeriod': 'K-Linien-Zeitraum', - 'trading-assistant.form.timeframe1m': '1 Minute', - 'trading-assistant.form.timeframe5m': '5 Minuten', - 'trading-assistant.form.timeframe15m': '15 Minuten', - 'trading-assistant.form.timeframe30m': '30 Minuten', - 'trading-assistant.form.timeframe1H': '1 Stunde', - 'trading-assistant.form.timeframe4H': '4 Stunden', - 'trading-assistant.form.timeframe1D': '1 Tag', - 'trading-assistant.form.selectStrategyType': 'Strategietyp auswรคhlen', - 'trading-assistant.form.indicatorStrategy': 'Indikator-Strategie', - 'trading-assistant.form.indicatorStrategyDesc': 'Automatisierte Handelsstrategie basierend auf technischen Indikatoren', - 'trading-assistant.form.aiStrategy': 'KI-Strategie', - 'trading-assistant.form.aiStrategyDesc': 'Automatisierte Handelsstrategie basierend auf KI-Intelligenzentscheidungen', - 'trading-assistant.form.enableAiFilter': 'KI-Intelligenzentscheidungsfilter aktivieren', - 'trading-assistant.form.enableAiFilterHint': 'Wenn aktiviert, werden Indikatorsignale von KI gefiltert, um die Handelsqualitรคt zu verbessern', - 'trading-assistant.form.aiFilterPrompt': 'Benutzerdefinierte Eingabeaufforderung', - 'trading-assistant.form.aiFilterPromptHint': 'Benutzerdefinierte Anweisungen fรผr KI-Filterung bereitstellen, leer lassen, um die Systemstandardwerte zu verwenden', - 'trading-assistant.validation.strategyTypeRequired': 'Bitte wรคhlen Sie einen Strategietyp', - 'trading-assistant.validation.marketCategoryRequired': 'Bitte wรคhlen Sie eine Marktkategorie', - 'trading-assistant.form.advancedSettings': 'Erweiterte Einstellungen', - 'trading-assistant.form.orderMode': 'Bestellmodus', - 'trading-assistant.form.orderModeMaker': 'Hersteller', - 'trading-assistant.form.orderModeTaker': 'Marktpreis (Taker)', - 'trading-assistant.form.orderModeHint': 'Im Pending-Order-Modus werden Limit-Orders verwendet und die Bearbeitungsgebรผhr ist niedriger; Der Marktpreismodus wird sofort ausgefรผhrt und die Bearbeitungsgebรผhr ist hรถher.', - 'trading-assistant.form.makerWaitSec': 'Wartezeit fรผr ausstehende Bestellungen (Sekunden)', - 'trading-assistant.form.makerWaitSecHint': 'Die Zeit, die nach der Bestellung auf die Transaktion gewartet wird. Brechen Sie ab und versuchen Sie es nach einer Zeitรผberschreitung erneut.', - 'trading-assistant.form.makerRetries': 'Anzahl der Wiederholungsversuche fรผr ausstehende Bestellungen', - 'trading-assistant.form.makerRetriesHint': 'Die maximale Anzahl von Wiederholungsversuchen, wenn eine ausstehende Order nicht ausgefรผhrt wird', - 'trading-assistant.form.fallbackToMarket': 'Die ausstehende Bestellung schlรคgt fehl und der Marktpreis wird herabgestuft.', - 'trading-assistant.form.fallbackToMarketHint': 'Wenn die ausstehende Erรถffnungs-/SchlieรŸorder nicht abgeschlossen wurde, wird angegeben, ob sie auf eine Marktorder herabgestuft werden soll, um sicherzustellen, dass die Transaktion abgeschlossen wird.', - 'trading-assistant.form.marginMode': 'Margin-Modus', - 'trading-assistant.form.marginModeCross': 'Volles Lager', - 'trading-assistant.form.marginModeIsolated': 'Isolierte Lage', - 'trading-assistant.form.stopLossPct': 'Stop-Loss-Verhรคltnis (%)', - 'trading-assistant.form.stopLossPctHint': 'Legen Sie den Stop-Loss-Prozentsatz fest. 0 bedeutet, dass Stop-Loss nicht aktiviert ist', - 'trading-assistant.form.takeProfitPct': 'Take-Profit-Quote (%)', - 'trading-assistant.form.takeProfitPctHint': 'Legen Sie den Take-Profit-Prozentsatz fest. 0 bedeutet, dass Take-Profit deaktiviert ist', - 'trading-assistant.form.commission': 'Gebรผhr (%)', - 'trading-assistant.form.commissionHint': 'Handelsgebรผhr in Prozent (optional)', - 'trading-assistant.form.slippage': 'Slippage (%)', - 'trading-assistant.form.slippageHint': 'Geschรคtzter Slippage-Prozentsatz (optional)', - 'trading-assistant.form.executionMode': 'Ausfรผhrung', - 'trading-assistant.form.executionModeSignal': 'Nur Signal (Benachrichtigungen)', - 'trading-assistant.form.executionModeLive': 'Live-Trading (nur Krypto)', - 'trading-assistant.form.liveTradingCryptoOnlyHint': 'Live-Trading ist nur fรผr Krypto verfรผgbar. Andere Mรคrkte kรถnnen nur Signale senden.', - 'trading-assistant.form.notifyChannels': 'Benachrichtigungskanรคle', - 'trading-assistant.form.notifyChannelsHint': 'Wรคhlen Sie aus, wie Sie Kauf/Verkauf- und Risikosignale erhalten mรถchten.', - 'trading-assistant.notify.browser': 'Browser', - 'trading-assistant.notify.email': 'E-Mail', - 'trading-assistant.notify.phone': 'Telefon', - 'trading-assistant.notify.telegram': 'Telegram', - 'trading-assistant.notify.discord': 'Discord', - 'trading-assistant.notify.webhook': 'Webhook', - 'trading-assistant.form.notifyEmail': 'E-Mail', - 'trading-assistant.form.notifyPhone': 'Telefonnummer', - 'trading-assistant.form.notifyTelegram': 'Telegram (Chat-ID / Benutzername)', - 'trading-assistant.form.notifyDiscord': 'Discord (Webhook-URL)', - 'trading-assistant.form.notifyWebhook': 'Webhook-URL', - 'trading-assistant.form.liveTradingConfigTitle': 'Exchange-Zugangsdaten', - 'trading-assistant.form.liveTradingConfigHint': 'Geben Sie Ihre Exchange-API-Zugangsdaten ein. Sie kรถnnen die Verbindung vor dem Speichern testen.', - 'trading-assistant.form.savedCredential': 'Gespeicherte Zugangsdaten', - 'trading-assistant.form.savedCredentialHint': 'Optional: Wรคhlen Sie gespeicherte Zugangsdaten zum automatischen Ausfรผllen.', - 'trading-assistant.form.saveCredential': 'Diese Zugangsdaten fรผr spรคter speichern', - 'trading-assistant.form.credentialName': 'Name (optional)', - 'trading-assistant.form.signalMode': 'Signalmodus', - 'trading-assistant.form.signalModeConfirmed': 'Bestรคtigen Sie den Modus', - 'trading-assistant.form.signalModeAggressive': 'Aggressiver Modus', - 'trading-assistant.form.signalModeHint': 'Bestรคtigungsmodus: prรผft nur abgeschlossene K-Zeilen; Aggressiver Modus: รœberprรผft auch die Bildung von K-Linien', - 'trading-assistant.form.cancel': 'Abbrechen', - 'trading-assistant.form.prev': 'Vorheriger Schritt', - 'trading-assistant.form.next': 'Nรคchster Schritt', - 'trading-assistant.form.confirmCreate': 'Bestรคtigen Sie die Erstellung', - 'trading-assistant.form.confirmEdit': 'Bestรคtigen Sie die ร„nderungen', - 'trading-assistant.messages.createSuccess': 'Strategie erfolgreich erstellt', - 'trading-assistant.messages.createFailed': 'Richtlinie konnte nicht erstellt werden', - 'trading-assistant.messages.updateSuccess': 'Richtlinienaktualisierung erfolgreich', - 'trading-assistant.messages.updateFailed': 'Die Aktualisierungsrichtlinie ist fehlgeschlagen', - 'trading-assistant.messages.deleteSuccess': 'Richtlinienlรถschung erfolgreich', - 'trading-assistant.messages.deleteFailed': 'Das Lรถschen der Richtlinie ist fehlgeschlagen', - 'trading-assistant.messages.startSuccess': 'Strategie erfolgreich gestartet', - 'trading-assistant.messages.startFailed': 'Die Richtlinie konnte nicht gestartet werden', - 'trading-assistant.messages.stopSuccess': 'Die Strategie wurde erfolgreich beendet', - 'trading-assistant.messages.stopFailed': 'Die Stoppstrategie ist fehlgeschlagen', - 'trading-assistant.messages.loadFailed': 'Richtlinienliste konnte nicht abgerufen werden', - 'trading-assistant.messages.runningWarning': 'Die Strategie lรคuft. Bitte stoppen Sie die Strategie, bevor Sie sie รคndern.', - 'trading-assistant.messages.deleteConfirmWithName': 'Sind Sie sicher, dass Sie die Richtlinie โ€ž{name}โ€œ lรถschen mรถchten? Dieser Vorgang ist irreversibel.', - 'trading-assistant.messages.deleteConfirm': 'Sind Sie sicher, dass Sie diese Richtlinie lรถschen mรถchten? Dieser Vorgang ist irreversibel.', - 'trading-assistant.messages.loadTradesFailed': 'Transaktionsdatensรคtze konnten nicht abgerufen werden', - 'trading-assistant.messages.loadPositionsFailed': 'Positionsdatensatz konnte nicht abgerufen werden', - 'trading-assistant.messages.loadEquityFailed': 'Die Eigenkapitalkurve konnte nicht ermittelt werden', - 'trading-assistant.messages.loadIndicatorsFailed': 'Die Indikatorliste konnte nicht geladen werden. Bitte versuchen Sie es spรคter noch einmal', - 'trading-assistant.messages.spotLimitations': 'Der Spot-Handel wurde automatisch auf โ€žNur Longโ€œ mit 1-facher Hebelwirkung eingestellt', - 'trading-assistant.messages.autoFillApiConfig': 'Die historische API-Konfiguration der Bรถrse wurde automatisch ausgefรผllt', - 'trading-assistant.placeholders.selectIndicator': 'Bitte wรคhlen Sie einen Indikator aus', - 'trading-assistant.placeholders.selectExchange': 'Bitte wรคhlen Sie einen Austausch aus', - 'trading-assistant.placeholders.selectMarketCategory': 'Bitte Marktkategorie auswรคhlen', - 'trading-assistant.placeholders.inputApiKey': 'Bitte geben Sie den API-Schlรผssel ein', - 'trading-assistant.placeholders.inputSecretKey': 'Bitte geben Sie den Geheimschlรผssel ein', - 'trading-assistant.placeholders.inputPassphrase': 'Bitte geben Sie die Passphrase ein', - 'trading-assistant.placeholders.inputStrategyName': 'Bitte geben Sie einen Richtliniennamen ein', - 'trading-assistant.placeholders.selectSymbol': 'Bitte wรคhlen Sie ein Handelspaar aus', - 'trading-assistant.placeholders.inputSymbol': 'Bitte Symbol eingeben', - 'trading-assistant.placeholders.selectTimeframe': 'Bitte wรคhlen Sie einen Zeitraum aus', - 'trading-assistant.placeholders.selectKlinePeriod': 'Bitte wรคhlen Sie einen K-Linien-Zeitraum aus', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'Bitte geben Sie eine benutzerdefinierte Eingabeaufforderung ein (optional)', - 'trading-assistant.placeholders.inputEmail': 'Bitte E-Mail eingeben', - 'trading-assistant.placeholders.inputPhone': 'Bitte Telefonnummer eingeben', - 'trading-assistant.placeholders.inputTelegram': 'Bitte Telegram Chat-ID / Benutzername eingeben', - 'trading-assistant.placeholders.inputDiscord': 'Bitte Discord Webhook-URL eingeben', - 'trading-assistant.placeholders.inputWebhook': 'Bitte Webhook-URL eingeben', - 'trading-assistant.placeholders.selectSavedCredential': 'Gespeicherte Zugangsdaten auswรคhlen', - 'trading-assistant.placeholders.inputCredentialName': 'Zum Beispiel: Binance Hauptschlรผssel', - 'trading-assistant.validation.indicatorRequired': 'Bitte wรคhlen Sie einen Indikator aus', - 'trading-assistant.validation.exchangeRequired': 'Bitte wรคhlen Sie einen Austausch aus', - 'trading-assistant.validation.apiKeyRequired': 'Bitte geben Sie den API-Schlรผssel ein', - 'trading-assistant.validation.secretKeyRequired': 'Bitte geben Sie den Geheimschlรผssel ein', - 'trading-assistant.validation.passphraseRequired': 'Bitte geben Sie die Passphrase ein', - 'trading-assistant.validation.exchangeConfigIncomplete': 'Bitte geben Sie die vollstรคndigen Exchange-Konfigurationsinformationen ein', - 'trading-assistant.validation.testConnectionRequired': 'Bitte klicken Sie zuerst auf die Schaltflรคche "Verbindung testen" und stellen Sie sicher, dass die Verbindung erfolgreich ist', - 'trading-assistant.validation.testConnectionFailed': 'Verbindungstest fehlgeschlagen, bitte รผberprรผfen Sie die Konfiguration und testen Sie erneut', - 'trading-assistant.validation.strategyNameRequired': 'Bitte geben Sie einen Richtliniennamen ein', - 'trading-assistant.validation.symbolRequired': 'Bitte wรคhlen Sie ein Handelspaar aus', - 'trading-assistant.validation.initialCapitalRequired': 'Bitte geben Sie den Anlagebetrag ein', - 'trading-assistant.validation.leverageRequired': 'Bitte geben Sie die Leverage Ratio ein', - 'trading-assistant.validation.emailInvalid': 'Ungรผltige E-Mail-Adresse', - 'trading-assistant.validation.notifyChannelRequired': 'Bitte wรคhlen Sie mindestens einen Benachrichtigungskanal aus', - 'trading-assistant.table.time': 'Zeit', - 'trading-assistant.table.type': 'Typ', - 'trading-assistant.table.price': 'Preis', - 'trading-assistant.table.amount': 'Menge', - 'trading-assistant.table.value': 'Betrag', - 'trading-assistant.table.commission': 'Bearbeitungsgebรผhr', - 'trading-assistant.table.symbol': 'Handelspaar', - 'trading-assistant.table.side': 'Richtung', - 'trading-assistant.table.size': 'Positionsmenge', - 'trading-assistant.table.entryPrice': 'Erรถffnungspreis', - 'trading-assistant.table.currentPrice': 'aktueller Preis', - 'trading-assistant.table.unrealizedPnl': 'nicht realisierter Gewinn oder Verlust', - 'trading-assistant.table.pnlPercent': 'Gewinn- und Verlustquote', - 'trading-assistant.table.buy': 'kaufen', - 'trading-assistant.table.sell': 'verkaufen', - 'trading-assistant.table.long': 'Geh lange', - 'trading-assistant.table.short': 'kurz', - 'trading-assistant.table.noPositions': 'Noch keine Stellen', - 'trading-assistant.detail.title': 'Strategiedetails', - 'trading-assistant.detail.strategyName': 'Richtlinienname', - 'trading-assistant.detail.strategyType': 'Strategietyp', - 'trading-assistant.detail.status': 'Status', - 'trading-assistant.detail.tradingMode': 'Handelsmodell', - 'trading-assistant.detail.exchange': 'Austausch', - 'trading-assistant.detail.initialCapital': 'Anfangskapital', - 'trading-assistant.detail.totalInvestment': 'Gesamtinvestitionsbetrag', - 'trading-assistant.detail.currentEquity': 'Aktuelles Nettovermรถgen', - 'trading-assistant.detail.totalPnl': 'Gesamtgewinn und -verlust', - 'trading-assistant.detail.indicatorName': 'Indikatorname', - 'trading-assistant.detail.maxLeverage': 'Maximale Hebelwirkung', - 'trading-assistant.detail.decideInterval': 'Entscheidungsintervall', - 'trading-assistant.detail.symbols': 'Transaktionsobjekt', - 'trading-assistant.detail.createdAt': 'Schรถpfungszeit', - 'trading-assistant.detail.updatedAt': 'Aktualisierungszeit', - 'trading-assistant.detail.llmConfig': 'Konfiguration des KI-Modells', - 'trading-assistant.detail.exchangeConfig': 'Exchange-Konfiguration', - 'trading-assistant.detail.provider': 'Anbieter', - 'trading-assistant.detail.modelId': 'Modell-ID', - 'trading-assistant.detail.close': 'SchlieรŸen', - 'trading-assistant.detail.loadFailed': 'Richtliniendetails konnten nicht abgerufen werden', - 'trading-assistant.equity.noData': 'Noch keine Daten zum Vermรถgen', - 'trading-assistant.equity.equity': 'Nettovermรถgen', - 'trading-assistant.exchange.tradingMode': 'Handelsmodell', - 'trading-assistant.exchange.virtual': 'simulierter Handel', - 'trading-assistant.exchange.live': 'Echte Transaktion', - 'trading-assistant.exchange.selectExchange': 'Austausch auswรคhlen', - 'trading-assistant.exchange.walletAddress': 'Wallet-Adresse', - 'trading-assistant.exchange.walletAddressPlaceholder': 'Bitte geben Sie Ihre Wallet-Adresse ein (beginnend mit 0x)', - 'trading-assistant.exchange.privateKey': 'privater Schlรผssel', - 'trading-assistant.exchange.privateKeyPlaceholder': 'Bitte geben Sie den privaten Schlรผssel ein (64 Zeichen)', - 'trading-assistant.exchange.testConnection': 'Testverbindung', - 'trading-assistant.exchange.connectionSuccess': 'Verbindung erfolgreich', - 'trading-assistant.exchange.connectionFailed': 'Verbindung fehlgeschlagen', - 'trading-assistant.exchange.testFailed': 'Verbindungstest fehlgeschlagen', - 'trading-assistant.exchange.fillComplete': 'Bitte geben Sie die vollstรคndigen Exchange-Konfigurationsinformationen ein', - 'trading-assistant.strategyTypeOptions.ai': 'KI-gesteuerte Strategie', - 'trading-assistant.strategyTypeOptions.indicator': 'Technische Indikatorstrategie', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'Die KI-gesteuerte Strategiefunktion befindet sich in der Entwicklung, also bleiben Sie dran', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'KI-gesteuerte Strategiefunktionen sind in der Entwicklung', - 'trading-assistant.indicatorType.trend': 'Trend', - 'trading-assistant.indicatorType.momentum': 'Schwung', - 'trading-assistant.indicatorType.volatility': 'Fluktuation', - 'trading-assistant.indicatorType.volume': 'Lautstรคrke', - 'trading-assistant.indicatorType.custom': 'Anpassen', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'Binance', - 'hyperliquid': 'Hyperliquid', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Gate.io', - 'mexc': 'MEXC', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': 'Huobi', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Deribit', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Bitstamp', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Zwillinge', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Upbit', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBank', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX USA', - 'binanceus': 'Binance USA', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDโ“ˆ-M', - 'deepcoin': 'Deepcoin' - }, - 'ai-trading-assistant.title': 'KI-Handelsassistent', - 'ai-trading-assistant.strategyList': 'Strategieliste', - 'ai-trading-assistant.createStrategy': 'Richtlinie erstellen', - 'ai-trading-assistant.noStrategy': 'Noch keine Strategie', - 'ai-trading-assistant.selectStrategy': 'Bitte wรคhlen Sie links eine Strategie aus, um Details anzuzeigen', - 'ai-trading-assistant.startStrategy': 'Startstrategie', - 'ai-trading-assistant.stopStrategy': 'Stoppstrategie', - 'ai-trading-assistant.editStrategy': 'Redaktionelle Strategie', - 'ai-trading-assistant.deleteStrategy': 'Richtlinie lรถschen', - 'ai-trading-assistant.status.running': 'Laufen', - 'ai-trading-assistant.status.stopped': 'Angehalten', - 'ai-trading-assistant.status.error': 'Fehler', - 'ai-trading-assistant.tabs.tradingRecords': 'Transaktionsverlauf', - 'ai-trading-assistant.tabs.positions': 'Positionsaufzeichnung', - 'ai-trading-assistant.tabs.aiDecisions': 'KI-Entscheidungsaufzeichnung', - 'ai-trading-assistant.tabs.equityCurve': 'Eigenkapitalkurve', - 'ai-trading-assistant.form.createTitle': 'Erstellen Sie KI-Handelsstrategien', - 'ai-trading-assistant.form.editTitle': 'Bearbeiten Sie die KI-Handelsstrategie', - 'ai-trading-assistant.form.strategyName': 'Richtlinienname', - 'ai-trading-assistant.form.modelId': 'KI-Modell', - 'ai-trading-assistant.form.modelIdHint': 'Verwenden Sie den OpenRouter-Systemdienst, ohne den API-Schlรผssel zu konfigurieren', - 'ai-trading-assistant.form.decideInterval': 'Entscheidungsintervall', - 'ai-trading-assistant.form.decideInterval5m': '5 Minuten', - 'ai-trading-assistant.form.decideInterval10m': '10 Minuten', - 'ai-trading-assistant.form.decideInterval30m': '30 Minuten', - 'ai-trading-assistant.form.decideInterval1h': '1 Stunde', - 'ai-trading-assistant.form.decideInterval4h': '4 Stunden', - 'ai-trading-assistant.form.decideInterval1d': '1 Tag', - 'ai-trading-assistant.form.decideInterval1w': '1 Woche', - 'ai-trading-assistant.form.decideIntervalHint': 'Das Zeitintervall, in dem die KI Entscheidungen trifft', - 'ai-trading-assistant.form.runPeriod': 'Laufzyklus', - 'ai-trading-assistant.form.runPeriodHint': 'Die Startzeit und Endzeit des Strategielaufs', - 'ai-trading-assistant.form.startDate': 'Startdatum', - 'ai-trading-assistant.form.endDate': 'Enddatum', - 'ai-trading-assistant.form.qdtCostTitle': 'Anweisungen zum QDT-Abzug', - 'ai-trading-assistant.form.qdtCostHint': '{cost} QDT wird fรผr jede KI-Entscheidung abgezogen. Bitte stellen Sie sicher, dass Ihr Konto รผber ausreichend QDT-Guthaben verfรผgt. Wรคhrend der Umsetzung der Strategie werden fรผr jede Entscheidung Gebรผhren in Echtzeit abgezogen.', - 'ai-trading-assistant.form.apiKey': 'API-Schlรผssel', - 'ai-trading-assistant.form.exchange': 'Austausch auswรคhlen', - 'ai-trading-assistant.form.secretKey': 'Geheimer Schlรผssel', - 'ai-trading-assistant.form.passphrase': 'Passphrase', - 'ai-trading-assistant.form.testConnection': 'Testverbindung', - 'ai-trading-assistant.form.symbol': 'Handelspaar', - 'ai-trading-assistant.form.symbolHint': 'Wรคhlen Sie das Handelspaar aus, mit dem Sie handeln mรถchten', - 'ai-trading-assistant.form.initialCapital': 'Investierter Betrag (Marge)', - 'ai-trading-assistant.form.leverage': 'Nutzen Sie mehrere', - 'ai-trading-assistant.form.timeframe': 'Zeitraum', - 'ai-trading-assistant.form.timeframe1m': '1 Minute', - 'ai-trading-assistant.form.timeframe5m': '5 Minuten', - 'ai-trading-assistant.form.timeframe15m': '15 Minuten', - 'ai-trading-assistant.form.timeframe30m': '30 Minuten', - 'ai-trading-assistant.form.timeframe1H': '1 Stunde', - 'ai-trading-assistant.form.timeframe4H': '4 Stunden', - 'ai-trading-assistant.form.timeframe1D': '1 Tag', - 'ai-trading-assistant.form.marketType': 'Markttyp', - 'ai-trading-assistant.form.marketTypeFutures': 'Vertrag', - 'ai-trading-assistant.form.marketTypeSpot': 'Spot', - 'ai-trading-assistant.form.totalPnl': 'Gesamtgewinn und -verlust', - 'ai-trading-assistant.form.customPrompt': 'Benutzerdefinierte Aufforderungswรถrter', - 'ai-trading-assistant.form.customPromptHint': 'Optional, wird zur Anpassung von KI-Handelsstrategien und Entscheidungslogik verwendet', - 'ai-trading-assistant.form.cancel': 'Abbrechen', - 'ai-trading-assistant.form.prev': 'Vorheriger Schritt', - 'ai-trading-assistant.form.next': 'Nรคchster Schritt', - 'ai-trading-assistant.form.confirmCreate': 'Bestรคtigen Sie die Erstellung', - 'ai-trading-assistant.form.confirmEdit': 'Bestรคtigen Sie die ร„nderungen', - 'ai-trading-assistant.messages.createSuccess': 'Strategie erfolgreich erstellt', - 'ai-trading-assistant.messages.createFailed': 'Richtlinie konnte nicht erstellt werden', - 'ai-trading-assistant.messages.updateSuccess': 'Richtlinienaktualisierung erfolgreich', - 'ai-trading-assistant.messages.updateFailed': 'Die Aktualisierungsrichtlinie ist fehlgeschlagen', - 'ai-trading-assistant.messages.deleteSuccess': 'Richtlinienlรถschung erfolgreich', - 'ai-trading-assistant.messages.deleteFailed': 'Das Lรถschen der Richtlinie ist fehlgeschlagen', - 'ai-trading-assistant.messages.startSuccess': 'Strategie erfolgreich gestartet', - 'ai-trading-assistant.messages.startFailed': 'Die Richtlinie konnte nicht gestartet werden', - 'ai-trading-assistant.messages.stopSuccess': 'Die Strategie wurde erfolgreich beendet', - 'ai-trading-assistant.messages.stopFailed': 'Die Stoppstrategie ist fehlgeschlagen', - 'ai-trading-assistant.messages.loadFailed': 'Richtlinienliste konnte nicht abgerufen werden', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'Der KI-Entscheidungsdatensatz konnte nicht abgerufen werden', - 'ai-trading-assistant.messages.deleteConfirm': 'Sind Sie sicher, dass Sie diese Richtlinie lรถschen mรถchten? Dieser Vorgang ist irreversibel.', - 'ai-trading-assistant.placeholders.inputStrategyName': 'Bitte geben Sie einen Richtliniennamen ein', - 'ai-trading-assistant.placeholders.selectModelId': 'Bitte wรคhlen Sie ein KI-Modell aus', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'Bitte wรคhlen Sie ein Entscheidungsintervall aus', - 'ai-trading-assistant.placeholders.startTime': 'Startzeit', - 'ai-trading-assistant.placeholders.endTime': 'Endzeit', - 'ai-trading-assistant.placeholders.inputApiKey': 'Bitte geben Sie den API-Schlรผssel ein', - 'ai-trading-assistant.placeholders.selectExchange': 'Bitte wรคhlen Sie einen Austausch aus', - 'ai-trading-assistant.placeholders.inputSecretKey': 'Bitte geben Sie den Geheimschlรผssel ein', - 'ai-trading-assistant.placeholders.inputPassphrase': 'Bitte geben Sie die Passphrase ein', - 'ai-trading-assistant.placeholders.selectSymbol': 'Bitte wรคhlen Sie ein Handelspaar aus, zum Beispiel: BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'Bitte wรคhlen Sie einen Zeitraum aus', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'Bitte geben Sie ein benutzerdefiniertes Aufforderungswort ein (optional)', - 'ai-trading-assistant.validation.strategyNameRequired': 'Bitte geben Sie einen Richtliniennamen ein', - 'ai-trading-assistant.validation.modelIdRequired': 'Bitte wรคhlen Sie ein KI-Modell aus', - 'ai-trading-assistant.validation.runPeriodRequired': 'Bitte wรคhlen Sie einen Laufzyklus aus', - 'ai-trading-assistant.validation.apiKeyRequired': 'Bitte geben Sie den API-Schlรผssel ein', - 'ai-trading-assistant.validation.exchangeRequired': 'Bitte wรคhlen Sie einen Austausch aus', - 'ai-trading-assistant.validation.secretKeyRequired': 'Bitte geben Sie den Geheimschlรผssel ein', - 'ai-trading-assistant.validation.symbolRequired': 'Bitte wรคhlen Sie ein Handelspaar aus', - 'ai-trading-assistant.validation.initialCapitalRequired': 'Bitte geben Sie den Anlagebetrag ein', - 'ai-trading-assistant.table.time': 'Zeit', - 'ai-trading-assistant.table.type': 'Typ', - 'ai-trading-assistant.table.price': 'Preis', - 'ai-trading-assistant.table.amount': 'Menge', - 'ai-trading-assistant.table.value': 'Betrag', - 'ai-trading-assistant.table.symbol': 'Handelspaar', - 'ai-trading-assistant.table.side': 'Richtung', - 'ai-trading-assistant.table.size': 'Positionsmenge', - 'ai-trading-assistant.table.entryPrice': 'Erรถffnungspreis', - 'ai-trading-assistant.table.currentPrice': 'aktueller Preis', - 'ai-trading-assistant.table.unrealizedPnl': 'nicht realisierter Gewinn oder Verlust', - 'ai-trading-assistant.table.profit': 'Gewinn und Verlust', - 'ai-trading-assistant.table.openLong': 'Lange geรถffnet', - 'ai-trading-assistant.table.closeLong': 'Pinduo', - 'ai-trading-assistant.table.openShort': 'Kurz รถffnen', - 'ai-trading-assistant.table.closeShort': 'leer', - 'ai-trading-assistant.table.addLong': 'Gadot', - 'ai-trading-assistant.table.addShort': 'kurz hinzufรผgen', - 'ai-trading-assistant.table.closeShortProfit': 'Nehmen Sie Gewinne aus Short-Positionen mit', - 'ai-trading-assistant.table.closeShortStop': 'Stop-Loss', - 'ai-trading-assistant.table.closeLongProfit': 'Halten Sie lange inne und nehmen Sie Gewinn mit', - 'ai-trading-assistant.table.closeLongStop': 'Stop-Loss', - 'ai-trading-assistant.table.buy': 'kaufen', - 'ai-trading-assistant.table.sell': 'verkaufen', - 'ai-trading-assistant.table.long': 'Geh lange', - 'ai-trading-assistant.table.short': 'kurz', - 'ai-trading-assistant.table.hold': 'halten', - 'ai-trading-assistant.table.reasoning': 'Analysegrund', - 'ai-trading-assistant.table.decisions': 'Entscheidungsfindung', - 'ai-trading-assistant.table.riskAssessment': 'Risikobewertung', - 'ai-trading-assistant.table.confidence': 'Vertrauen', - 'ai-trading-assistant.table.totalRecords': 'Insgesamt {total} Datensรคtze', - 'ai-trading-assistant.table.noPositions': 'Noch keine Stellen', - 'ai-trading-assistant.detail.title': 'Strategiedetails', - 'ai-trading-assistant.equity.noData': 'Noch keine Daten zum Vermรถgen', - 'ai-trading-assistant.equity.equity': 'Nettovermรถgen', - 'ai-trading-assistant.exchange.testFailed': 'Verbindungstest fehlgeschlagen', - 'ai-trading-assistant.exchange.connectionSuccess': 'Verbindung erfolgreich', - 'ai-trading-assistant.exchange.connectionFailed': 'Verbindung fehlgeschlagen', - 'ai-trading-assistant.form.advancedSettings': 'Erweiterte Einstellungen', - 'ai-trading-assistant.form.orderMode': 'Bestellmodus', - 'ai-trading-assistant.form.orderModeMaker': 'Hersteller', - 'ai-trading-assistant.form.orderModeTaker': 'Marktpreis (Taker)', - 'ai-trading-assistant.form.orderModeHint': 'Im Pending-Order-Modus werden Limit-Orders verwendet und die Bearbeitungsgebรผhr ist niedriger; Der Marktpreismodus wird sofort ausgefรผhrt und die Bearbeitungsgebรผhr ist hรถher.', - 'ai-trading-assistant.form.makerWaitSec': 'Wartezeit fรผr ausstehende Bestellungen (Sekunden)', - 'ai-trading-assistant.form.makerWaitSecHint': 'Die Zeit, die nach der Bestellung auf die Transaktion gewartet wird. Brechen Sie ab und versuchen Sie es nach einer Zeitรผberschreitung erneut.', - 'ai-trading-assistant.form.makerRetries': 'Anzahl der Wiederholungsversuche fรผr ausstehende Bestellungen', - 'ai-trading-assistant.form.makerRetriesHint': 'Die maximale Anzahl von Wiederholungsversuchen, wenn eine ausstehende Order nicht ausgefรผhrt wird', - 'ai-trading-assistant.form.fallbackToMarket': 'Die ausstehende Bestellung schlรคgt fehl und der Marktpreis wird herabgestuft.', - 'ai-trading-assistant.form.fallbackToMarketHint': 'Wenn die ausstehende Erรถffnungs-/SchlieรŸorder nicht abgeschlossen wurde, wird angegeben, ob sie auf eine Marktorder herabgestuft werden soll, um sicherzustellen, dass die Transaktion abgeschlossen wird.', - 'ai-trading-assistant.form.marginMode': 'Margin-Modus', - 'ai-trading-assistant.form.marginModeCross': 'Volles Lager', - 'ai-trading-assistant.form.marginModeIsolated': 'Isolierte Lage', - 'ai-analysis.title': 'Quantenhandelsmaschine', - 'ai-analysis.system.online': 'online', - 'ai-analysis.system.agents': 'Agent', - 'ai-analysis.system.active': 'aktiv', - 'ai-analysis.system.stage': 'Bรผhne', - 'ai-analysis.panel.roster': 'Agentenaufstellung', - 'ai-analysis.panel.thinking': 'Denken...', - 'ai-analysis.panel.done': 'Komplett', - 'ai-analysis.panel.standby': 'Standby', - 'ai-analysis.input.title': 'Quantenhandelsmaschine', - 'ai-analysis.input.placeholder': 'Zielwert auswรคhlen (z. B. BTC/USDT)', - 'ai-analysis.input.watchlist': 'Optionale Bestรคnde', - 'ai-analysis.input.start': 'Analyse starten', - 'ai-analysis.input.recent': 'Letzte Aufgaben:', - 'ai-analysis.vis.stage': 'Bรผhne', - 'ai-analysis.vis.processing': 'Verarbeitung', - 'ai-analysis.result.complete': 'Analyse abgeschlossen', - 'ai-analysis.result.signal': 'Schlusssignal', - 'ai-analysis.result.confidence': 'Vertrauen:', - 'ai-analysis.result.new': 'neue Analyse', - 'ai-analysis.result.full': 'Vollstรคndigen Bericht ansehen', - 'ai-analysis.logs.title': 'Systemprotokoll', - 'ai-analysis.modal.title': 'vertraulicher Bericht', - 'ai-analysis.modal.fundamental': 'Fundamentalanalyse', - 'ai-analysis.modal.technical': 'Technische Analyse', - 'ai-analysis.modal.sentiment': 'Emotionale Analyse', - 'ai-analysis.modal.risk': 'Risikobewertung', - 'ai-analysis.stage.idle': 'Standby', - 'ai-analysis.stage.1': 'Phase Eins: Mehrdimensionale Analyse', - 'ai-analysis.stage.2': 'Phase Zwei: Lang-Kurz-Debatte', - 'ai-analysis.stage.3': 'Phase drei: Strategische Planung', - 'ai-analysis.stage.4': 'Die vierte Stufe: รœberprรผfung der Risikokontrolle', - 'ai-analysis.stage.complete': 'Komplett', - 'ai-analysis.agent.investment_director': 'Investmentdirektor', - 'ai-analysis.agent.role.investment_director': 'Umfassende Analyse und abschlieรŸendes Fazit', - 'ai-analysis.agent.market': 'Marktanalyst', - 'ai-analysis.agent.role.market': 'Technologie- und Marktdaten', - 'ai-analysis.agent.fundamental': 'Fundamentalanalytiker', - 'ai-analysis.agent.role.fundamental': 'Finanzen und Bewertung', - 'ai-analysis.agent.technical': 'Technischer Analyst', - 'ai-analysis.agent.role.technical': 'Technische Indikatoren und Diagramme', - 'ai-analysis.agent.news': 'Nachrichtenanalyst', - 'ai-analysis.agent.role.news': 'Globaler Nachrichtenfilter', - 'ai-analysis.agent.sentiment': 'Stimmungsanalytiker', - 'ai-analysis.agent.role.sentiment': 'Sozial und emotional', - 'ai-analysis.agent.risk': 'Risikoanalytiker', - 'ai-analysis.agent.role.risk': 'Grundlegender Risikocheck', - 'ai-analysis.agent.bull': 'bullischer Forscher', - 'ai-analysis.agent.role.bull': 'Wachstumskatalysator-Bergbau', - 'ai-analysis.agent.bear': 'bรคrischer Forscher', - 'ai-analysis.agent.role.bear': 'Risiko- und Fehlersuche', - 'ai-analysis.agent.manager': 'Forschungsmanager', - 'ai-analysis.agent.role.manager': 'Debattenmoderator', - 'ai-analysis.agent.trader': 'Hรคndler', - 'ai-analysis.agent.role.trader': 'Fรผhrungsstratege', - 'ai-analysis.agent.risky': 'aktivistischer Analytiker', - 'ai-analysis.agent.role.risky': 'aggressive Strategie', - 'ai-analysis.agent.neutral': 'Bilanzanalytiker', - 'ai-analysis.agent.role.neutral': 'Ausgleichsstrategie', - 'ai-analysis.agent.safe': 'konservativer Analytiker', - 'ai-analysis.agent.role.safe': 'konservative Strategie', - 'ai-analysis.agent.cro': 'Risikokontrollmanager (CRO)', - 'ai-analysis.agent.role.cro': 'letzte Entscheidungsbefugnis', - 'ai-analysis.script.market': 'OHLCV-Daten werden von wichtigen Bรถrsen abgerufen...', - 'ai-analysis.script.fundamental': 'Quartalsfinanzberichte abrufen...', - 'ai-analysis.script.technical': 'Analyse technischer Indikatoren und Chartmuster...', - 'ai-analysis.script.news': 'Globale Finanznachrichten scannen...', - 'ai-analysis.script.sentiment': 'Analyse von Social-Media-Trends...', - 'ai-analysis.script.risk': 'Berechnung der historischen Volatilitรคt...', - 'invite.inviteLink': 'Einladungslink', - 'invite.copy': 'Link kopieren', - 'invite.copySuccess': 'Erfolgreich kopieren!', - 'invite.copyFailed': 'Der Kopiervorgang ist fehlgeschlagen. Bitte manuell kopieren', - 'invite.noInviteLink': 'Der Einladungslink wurde nicht generiert', - 'invite.totalInvites': 'Kumulierte Einladungen', - 'invite.totalReward': 'Kumulative Belohnungen', - 'invite.rules': 'Einladungsregeln', - 'invite.rule1': 'Jedes Mal, wenn Sie einen Freund erfolgreich zur Registrierung einladen, erhalten Sie eine Belohnung', - 'invite.rule2': 'Wenn der eingeladene Freund die erste Transaktion abschlieรŸt, erhalten Sie zusรคtzliche Belohnungen', - 'invite.rule3': 'Einladungsprรคmien werden direkt an Ihr Konto gesendet', - 'invite.inviteList': 'Einladungsliste', - 'invite.tasks': 'Missionszentrum', - 'invite.inviteeName': 'Eingeladen', - 'invite.inviteTime': 'Einladungszeit', - 'invite.status': 'Status', - 'invite.reward': 'Belohnung', - 'invite.active': 'aktiv', - 'invite.inactive': 'Nicht aktiviert', - 'invite.completed': 'Abgeschlossen', - 'invite.claimed': 'Erhalten', - 'invite.pending': 'Zu vervollstรคndigen', - 'invite.goToTask': 'zu vervollstรคndigen', - 'invite.claimReward': 'Belohnungen einfordern', - 'invite.verify': 'Verifizierung abgeschlossen', - 'invite.verifySuccess': 'Verifizierung erfolgreich! Aufgabe abgeschlossen', - 'invite.verifyNotCompleted': 'Die Aufgabe wurde noch nicht abgeschlossen. Bitte schlieรŸen Sie die Aufgabe zuerst ab', - 'invite.verifyFailed': 'Die Verifizierung ist fehlgeschlagen. Bitte versuchen Sie es spรคter noch einmal', - 'invite.claimSuccess': '{reward} QDT erfolgreich erhalten!', - 'invite.claimFailed': 'Fehler beim Sammeln. Bitte versuchen Sie es spรคter noch einmal', - 'invite.totalRecords': 'Insgesamt {total} Datensรคtze', - 'invite.task.twitter.title': 'Retweeten an X (Twitter)', - 'invite.task.twitter.desc': 'Teilen Sie unsere offiziellen Tweets mit Ihrem X-Konto (Twitter).', - 'invite.task.youtube.title': 'Folgen Sie unserem YouTube-Kanal', - 'invite.task.youtube.desc': 'Abonnieren und folgen Sie unserem offiziellen YouTube-Kanal', - 'invite.task.telegram.title': 'Treten Sie der Telegram-Gruppe bei', - 'invite.task.telegram.desc': 'Treten Sie unserer offiziellen Telegram-Community-Gruppe bei', - 'invite.task.discord.title': 'Treten Sie einem Discord-Server bei', - 'invite.task.discord.desc': 'Treten Sie unserem Discord-Community-Server bei', - 'message': '-', - 'layouts.usermenu.dialog.title': 'Informationen', - 'layouts.usermenu.dialog.content': 'Mรถchten Sie sich wirklich abmelden?', - 'layouts.userLayout.title': 'Finden Sie die Wahrheit in der Unsicherheit', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell โ†’ open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': 'Gedรคchtnis/Reflexion', - 'settings.group.reflection_worker': 'Automatischer Reflexions-Prรผf-Worker', - 'settings.field.ENABLE_AGENT_MEMORY': 'Agenten-Gedรคchtnis aktivieren', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Vektorsuche aktivieren (lokal)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding-Dimension', - 'settings.field.AGENT_MEMORY_TOP_K': 'Top-K Abrufanzahl', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'KandidatenfenstergrรถรŸe', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Halbwertszeit der Zeitabnahme (Tage)', - 'settings.field.AGENT_MEMORY_W_SIM': 'ร„hnlichkeitsgewicht', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'Aktualitรคtsgewicht', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'Renditegewicht', - 'settings.field.ENABLE_REFLECTION_WORKER': 'Automatische Verifikation aktivieren', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Verifikationsintervall (Sek.)', - - // Profile - Notification Settings (Benachrichtigungseinstellungen) - 'profile.notifications.title': 'Benachrichtigungseinstellungen', - 'profile.notifications.hint': 'Konfigurieren Sie Ihre Standard-Benachrichtigungsmethoden, die automatisch beim Erstellen von Asset-Monitoren und Alarmen verwendet werden', - 'profile.notifications.defaultChannels': 'Standard-Benachrichtigungskanรคle', - 'profile.notifications.browser': 'In-App-Benachrichtigung', - 'profile.notifications.email': 'E-Mail', - 'profile.notifications.phone': 'SMS', - 'profile.notifications.telegramBotToken': 'Telegram Bot Token', - 'profile.notifications.telegramBotTokenPlaceholder': 'Geben Sie Ihren Telegram Bot Token ein', - 'profile.notifications.telegramBotTokenHint': 'Erstellen Sie einen Bot รผber @BotFather um den Token zu erhalten', - 'profile.notifications.telegramChatId': 'Telegram Chat ID', - 'profile.notifications.telegramPlaceholder': 'Geben Sie Ihre Telegram Chat ID ein (z.B. 123456789)', - 'profile.notifications.telegramHint': 'Senden Sie /start an @userinfobot um Ihre Chat ID zu erhalten', - 'profile.notifications.notifyEmail': 'Benachrichtigungs-E-Mail', - 'profile.notifications.emailPlaceholder': 'E-Mail-Adresse fรผr Benachrichtigungen', - 'profile.notifications.emailHint': 'Verwendet standardmรครŸig die Konto-E-Mail, Sie kรถnnen eine andere festlegen', - 'profile.notifications.phonePlaceholder': 'Telefonnummer eingeben (z.B. +49151234567)', - 'profile.notifications.phoneHint': 'Administrator muss Twilio-Dienst konfigurieren', - 'profile.notifications.discordWebhook': 'Discord Webhook', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'Erstellen Sie einen Webhook in den Discord-Servereinstellungen', - 'profile.notifications.webhookUrl': 'Webhook URL', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': 'Benutzerdefinierte Webhook-URL, Benachrichtigungen per POST JSON', - 'profile.notifications.webhookToken': 'Webhook Token (Optional)', - 'profile.notifications.webhookTokenPlaceholder': 'Bearer Token zur Anfrage-Authentifizierung', - 'profile.notifications.webhookTokenHint': 'Wird als Authorization: Bearer Token an Webhook gesendet', - 'profile.notifications.testBtn': 'Testbenachrichtigung senden', - 'profile.notifications.saveSuccess': 'Benachrichtigungseinstellungen gespeichert', - 'profile.notifications.selectChannel': 'Bitte wรคhlen Sie mindestens einen Benachrichtigungskanal', - 'profile.notifications.fillTelegramToken': 'Bitte Telegram Bot Token eingeben', - 'profile.notifications.fillTelegram': 'Bitte Telegram Chat ID eingeben', - 'profile.notifications.fillEmail': 'Bitte Benachrichtigungs-E-Mail eingeben', - 'profile.notifications.testSent': 'Testbenachrichtigung gesendet, bitte Benachrichtigungskanรคle รผberprรผfen' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/en-US.js b/quantdinger_vue/src/locales/lang/en-US.js deleted file mode 100644 index 98fae48..0000000 --- a/quantdinger_vue/src/locales/lang/en-US.js +++ /dev/null @@ -1,3159 +0,0 @@ -import antdEnUS from 'ant-design-vue/es/locale-provider/en_US' -import momentEU from 'moment/locale/eu' - -const components = { - antLocale: antdEnUS, - momentName: 'eu', - momentLocale: momentEU -} - -const locale = { - // Common - 'common.confirm': 'Confirm', - 'common.cancel': 'Cancel', - 'common.save': 'Save', - 'common.delete': 'Delete', - 'common.edit': 'Edit', - 'common.add': 'Add', - 'common.close': 'Close', - 'common.ok': 'OK', - 'common.loading': 'Loading...', - 'common.noData': 'No data', - 'submit': 'Submit', - 'save': 'Save', - 'submit.ok': 'Submit successfully', - 'save.ok': 'Saved successfully', - 'menu.welcome': 'Welcome', - 'menu.home': 'Home', - 'menu.dashboard': 'Dashboard', - 'menu.dashboard.analysis': 'AI Analysis', - 'menu.dashboard.aiAssetAnalysis': 'AI Asset Analysis', - 'menu.dashboard.aiQuant': 'AI Quant', - 'menu.dashboard.indicator': 'Indicator Analysis', - 'menu.dashboard.community': 'Indicator Market', - 'menu.dashboard.tradingAssistant': 'Trading Assistant', - 'menu.dashboard.portfolio': 'Portfolio', - 'menu.dashboard.globalMarket': 'Global Market', - 'menu.settings': 'Settings', - 'menu.dashboard.aiTradingAssistant': 'AI Trading Assistant', - 'menu.dashboard.signalRobot': 'Signal Robot', - 'menu.dashboard.monitor': 'Monitor', - 'menu.dashboard.workplace': 'Workplace', - 'aiAssetAnalysis.title': 'AI Asset Analysis', - 'aiAssetAnalysis.subtitle': 'Unify portfolio monitoring, instant analysis, and scheduled tasks into one smooth workflow.', - 'aiAssetAnalysis.actions.quickAnalysis': 'Start Analysis Now', - 'aiAssetAnalysis.actions.monitorTasks': 'Manage Monitor Tasks', - 'aiAssetAnalysis.actions.openStandalone': 'Open Standalone Page', - 'aiAssetAnalysis.quickBar.title': 'Quick Analyze', - 'aiAssetAnalysis.quickBar.placeholder': 'Select a symbol from asset pool', - 'aiAssetAnalysis.quickBar.useInQuick': 'Use in Instant Analysis', - 'aiAssetAnalysis.quickBar.runNow': 'Analyze Now', - 'aiAssetAnalysis.history.title': 'Recent Analysis', - 'aiAssetAnalysis.history.empty': 'No analysis history yet', - 'aiAssetAnalysis.actions.enterQuick': 'Go to Instant Analysis', - 'aiAssetAnalysis.actions.enterMonitor': 'Go to Asset Pool & Tasks', - 'aiAssetAnalysis.flow.poolTitle': 'Build Asset Pool', - 'aiAssetAnalysis.flow.poolDesc': 'Add positions and watch targets first to build one unified analysis pool.', - 'aiAssetAnalysis.flow.poolAction': 'Manage Asset Pool', - 'aiAssetAnalysis.flow.quickTitle': 'Instant Analysis', - 'aiAssetAnalysis.flow.quickDesc': 'Run AI analysis for any symbol in one click and get suggestions quickly.', - 'aiAssetAnalysis.flow.quickAction': 'Run Analysis', - 'aiAssetAnalysis.flow.autoTitle': 'Scheduled Monitoring', - 'aiAssetAnalysis.flow.autoDesc': 'Set recurring AI analysis tasks and deliver reports through notification channels.', - 'aiAssetAnalysis.flow.autoAction': 'Configure Tasks', - 'aiAssetAnalysis.tabs.quick': 'Instant Analysis', - 'aiAssetAnalysis.tabs.monitor': 'Asset Pool & Scheduled Tasks', - 'aiAssetAnalysis.tabLead.quick': 'Best for ad-hoc decisions: select a symbol and analyze immediately.', - 'aiAssetAnalysis.tabLead.monitor': 'Best for continuous tracking: maintain positions and set monitor ranges/frequency.', - // AI Asset Analysis - Performance Stats - 'aiAssetAnalysis.stats.totalAnalyses': 'Total Analyses', - 'aiAssetAnalysis.stats.accuracy': 'Accuracy', - 'aiAssetAnalysis.stats.avgReturn': 'Avg Return', - 'aiAssetAnalysis.stats.satisfaction': 'Satisfaction', - 'aiAssetAnalysis.stats.decisions': 'Decision Dist.', - // AI Asset Analysis - Trading Opportunities - 'aiAssetAnalysis.opportunities.title': 'AI Opportunity Radar', - 'aiAssetAnalysis.opportunities.empty': 'No opportunities found', - 'aiAssetAnalysis.opportunities.analyze': 'Analyze', - 'aiAssetAnalysis.opportunities.updateHint': 'Updates hourly', - 'aiAssetAnalysis.opportunities.signal.overbought': 'Overbought', - 'aiAssetAnalysis.opportunities.signal.oversold': 'Oversold', - 'aiAssetAnalysis.opportunities.signal.bullish_momentum': 'Bullish', - 'aiAssetAnalysis.opportunities.signal.bearish_momentum': 'Bearish', - 'aiAssetAnalysis.opportunities.market.Crypto': '๐Ÿช™ Crypto', - 'aiAssetAnalysis.opportunities.market.USStock': '๐Ÿ“ˆ US Stock', - 'aiAssetAnalysis.opportunities.market.Forex': '๐Ÿ’ฑ Forex', - 'aiAssetAnalysis.opportunities.reason.crypto.overbought': '24h +{change}%, 7d +{change7d}%, overbought risk', - 'aiAssetAnalysis.opportunities.reason.crypto.bullish_momentum': '24h +{change}%, strong bullish momentum', - 'aiAssetAnalysis.opportunities.reason.crypto.oversold': '24h -{change}%, possible oversold bounce', - 'aiAssetAnalysis.opportunities.reason.crypto.bearish_momentum': '24h -{change}%, clear bearish trend', - 'aiAssetAnalysis.opportunities.reason.usstock.overbought': 'Day +{change}%, large gain, watch for pullback', - 'aiAssetAnalysis.opportunities.reason.usstock.bullish_momentum': 'Day +{change}%, strong bullish momentum', - 'aiAssetAnalysis.opportunities.reason.usstock.oversold': 'Day -{change}%, possible oversold bounce', - 'aiAssetAnalysis.opportunities.reason.usstock.bearish_momentum': 'Day -{change}%, clear bearish trend', - 'aiAssetAnalysis.opportunities.reason.forex.overbought': 'Day +{change}%, volatile, watch for reversal', - 'aiAssetAnalysis.opportunities.reason.forex.bullish_momentum': 'Day +{change}%, bullish momentum', - 'aiAssetAnalysis.opportunities.reason.forex.oversold': 'Day -{change}%, volatile, possible bounce', - 'aiAssetAnalysis.opportunities.reason.forex.bearish_momentum': 'Day -{change}%, clear bearish trend', - // AI Asset Analysis - Portfolio Checkup - 'aiAssetAnalysis.checkup.title': 'Portfolio Checkup', - 'aiAssetAnalysis.checkup.btn': 'Checkup', - 'aiAssetAnalysis.checkup.desc': 'Run AI analysis on all positions in your portfolio to quickly understand the current status and get recommendations for each asset.', - 'aiAssetAnalysis.checkup.start': 'Start Checkup', - 'aiAssetAnalysis.checkup.progress': 'Analyzing {current}/{total}...', - 'aiAssetAnalysis.checkup.noPositions': 'No positions in your portfolio. Please add assets first.', - 'aiAssetAnalysis.checkup.complete': 'Checkup Complete', - 'aiAssetAnalysis.checkup.failed': 'Failed', - 'aiAssetAnalysis.checkup.rerun': 'Run Again', - // AI Asset Analysis - Global Search - 'aiAssetAnalysis.search.hint': 'Search', - 'aiAssetAnalysis.search.placeholder': 'Search any symbol... (Ctrl+K)', - 'aiAssetAnalysis.search.noResults': 'No results found. Try a different keyword.', - 'menu.form': 'Form', - 'menu.form.basic-form': 'Basic Form', - 'menu.form.step-form': 'Step Form', - 'menu.form.step-form.info': 'Step Form(write transfer information)', - 'menu.form.step-form.confirm': 'Step Form(confirm transfer information)', - 'menu.form.step-form.result': 'Step Form(finished)', - 'menu.form.advanced-form': 'Advanced Form', - 'menu.list': 'List', - 'menu.list.table-list': 'Search Table', - 'menu.list.basic-list': 'Basic List', - 'menu.list.card-list': 'Card List', - 'menu.list.search-list': 'Search List', - 'menu.list.search-list.articles': 'Search List(articles)', - 'menu.list.search-list.projects': 'Search List(projects)', - 'menu.list.search-list.applications': 'Search List(applications)', - 'menu.profile': 'Profile', - 'menu.profile.basic': 'Basic Profile', - 'menu.profile.advanced': 'Advanced Profile', - 'menu.result': 'Result', - 'menu.result.success': 'Success', - 'menu.result.fail': 'Fail', - 'menu.exception': 'Exception', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'Trigger', - 'menu.account': 'Account', - 'menu.account.center': 'Account Center', - 'menu.account.settings': 'Account Settings', - 'menu.account.trigger': 'Trigger Error', - 'menu.account.logout': 'Logout', - 'menu.wallet': 'My Wallet', - 'menu.docs': 'Documentation', - 'menu.docs.detail': 'Doc Detail', - 'menu.header.refreshPage': 'Refresh Page', - 'menu.invite.friends': 'Invite Friends', - 'app.setting.pagestyle': 'Page Style Setting', - 'app.setting.pagestyle.light': 'Light Menu Style', - 'app.setting.pagestyle.dark': 'Dark Menu Style', - 'app.setting.pagestyle.realdark': 'RealDark style', - 'app.setting.themecolor': 'Theme Color', - 'app.setting.navigationmode': 'Navigation Mode', - 'app.setting.sidemenu.nav': 'Sidebar Navigation', - 'app.setting.topmenu.nav': 'Top Navigation', - 'app.setting.content-width': 'Content Width', - 'app.setting.content-width.tooltip': 'This setting is only effective for [Top Navigation]', - 'app.setting.content-width.fixed': 'Fixed', - 'app.setting.content-width.fluid': 'Fluid', - 'app.setting.fixedheader': 'Fixed Header', - 'app.setting.fixedheader.tooltip': 'Configurable when Header is fixed', - 'app.setting.autoHideHeader': 'Hide Header on Scroll', - 'app.setting.fixedsidebar': 'Fixed Sidebar Menu', - 'app.setting.sidemenu': 'Side Menu Layout', - 'app.setting.topmenu': 'Top Menu Layout', - 'app.setting.othersettings': 'Other Settings', - 'app.setting.weakmode': 'Weak Mode', - 'app.setting.multitab': 'Multi-Tab Mode', - 'app.setting.copy': 'Copy Setting', - 'app.setting.loading': 'Loading theme', - 'app.setting.copyinfo': 'copy success๏ผŒplease replace defaultSettings in src/config/defaultSettings.js', - 'app.setting.copy.success': 'Copy Success', - 'app.setting.copy.fail': 'Copy Failed', - 'app.setting.theme.switching': 'Switching theme...', - 'app.setting.production.hint': 'Setting panel shows in development environment only, please manually modify', - 'app.setting.themecolor.daybreak': 'Daybreak Blue (Default)', - 'app.setting.themecolor.dust': 'Dust Red', - 'app.setting.themecolor.volcano': 'Volcano', - 'app.setting.themecolor.sunset': 'Sunset Orange', - 'app.setting.themecolor.cyan': 'Cyan', - 'app.setting.themecolor.green': 'Polar Green', - 'app.setting.themecolor.geekblue': 'Geek Blue', - 'app.setting.themecolor.purple': 'Golden Purple', - 'app.setting.tooltip': 'Page Settings', - - // Notification Center - 'notice.title': 'Notifications', - 'notice.empty': 'No notifications', - 'notice.markAllRead': 'Mark all as read', - 'notice.clear': 'Clear all', - 'notice.close': 'Close', - 'notice.justNow': 'Just now', - 'notice.minutesAgo': 'minutes ago', - 'notice.hoursAgo': 'hours ago', - 'notice.daysAgo': 'days ago', - 'notice.detailInfo': 'Details', - 'notice.aiDecision': 'AI Decision', - 'notice.confidence': 'Confidence', - 'notice.reasoning': 'Reasoning', - 'notice.symbol': 'Symbol', - 'notice.currentPrice': 'Current Price', - 'notice.triggerPrice': 'Trigger Price', - 'notice.action': 'Action', - 'notice.quantity': 'Quantity', - 'notice.viewPortfolio': 'View Portfolio', - 'notice.type.aiMonitor': 'AI Monitor', - 'notice.type.priceAlert': 'Price Alert', - 'notice.type.signal': 'Trade Signal', - 'notice.type.buy': 'Buy Signal', - 'notice.type.sell': 'Sell Signal', - 'notice.type.hold': 'Hold Suggestion', - 'notice.type.trade': 'Trade Execution', - 'notice.type.notification': 'Notification', - - 'user.login.userName': 'userName', - 'user.login.password': 'password', - 'user.login.username.placeholder': 'Account: admin', - 'user.login.password.placeholder': 'password: admin or ant.design', - 'user.login.message-invalid-credentials': 'Login failed, please check your email and verification code', - 'user.login.message-invalid-verification-code': 'Invalid verification code', - 'user.login.tab-login-credentials': 'Credentials', - 'user.login.tab-login-email': 'Email', - 'user.login.tab-login-mobile': 'Mobile number', - 'user.login.captcha.placeholder': 'Please enter captcha', - 'user.login.mobile.placeholder': 'Mobile number', - 'user.login.mobile.verification-code.placeholder': 'Verification code', - 'user.login.email.placeholder': 'Please enter your email address', - 'user.login.email.verification-code.placeholder': 'Please enter verification code', - 'user.login.email.sending': 'Sending verification code...', - 'user.login.email.send-success-title': 'Notice', - 'user.login.email.send-success': 'Verification code sent successfully, please check your email', - 'user.login.sms.send-success': 'Verification code sent successfully, please check your SMS', - 'user.login.remember-me': 'Remember me', - 'user.login.forgot-password': 'Forgot your password?', - 'user.login.sign-in-with': 'Sign in with', - 'user.login.signup': 'Sign up', - 'user.login.login': 'Login', - 'user.register.register': 'Register', - 'user.register.email.placeholder': 'Email', - 'user.register.password.placeholder': 'Password ', - 'user.register.password.popover-message': 'Please enter at least 6 characters. Please do not use passwords that are easy to guess. ', - 'user.register.confirm-password.placeholder': 'Confirm password', - 'user.register.get-verification-code': 'Get code', - 'user.register.sign-in': 'Already have an account?', - 'user.register-result.msg': 'Account๏ผšregistered at {email}', - 'user.register-result.activation-email': 'The activation email has been sent to your email address and is valid for 24 hours. Please log in to the email in time and click on the link in the email to activate the account.', - 'user.register-result.back-home': 'Back to home', - 'user.register-result.view-mailbox': 'View mailbox', - 'user.email.required': 'Please enter your email!', - 'user.email.wrong-format': 'The email address is in the wrong format!', - 'user.userName.required': 'Please enter account name or email address', - 'user.password.required': 'Please enter your password!', - 'user.password.twice.msg': 'The passwords entered twice do not match!', - 'user.password.strength.msg': 'The password is not strong enough', - 'user.password.strength.strong': 'Strength: strong', - 'user.password.strength.medium': 'Strength: medium', - 'user.password.strength.low': 'Strength: low', - 'user.password.strength.short': 'Strength: too short', - 'user.confirm-password.required': 'Please confirm your password!', - 'user.phone-number.required': 'Please enter your phone number!', - 'user.phone-number.wrong-format': 'Please enter a valid phone number', - 'user.verification-code.required': 'Please enter the verification code!', - 'user.captcha.required': 'Please enter captcha!', - 'user.login.infos': 'QuantDinger is an AI multi-agent stock analysis tool that does not have securities investment consulting qualifications. All analysis results, scores, and reference opinions on the platform are automatically generated by AI based on historical data, and are only for learning, research, and technical exchanges, and do not constitute any investment advice or decision-making basis. Stock investment involves market risk, liquidity risk, policy risk and other risks, which may lead to losses of principal. Users should make independent decisions based on their risk tolerance capacity, and bear the consequences of any investment behavior and its results using this tool. Market risk, investment needs to be cautious.', - 'user.login.tab-login-web3': 'Web3 Login', - 'user.login.web3.tip': 'Sign in with your wallet via signature', - 'user.login.web3.connect': 'Connect wallet and login', - 'user.login.web3.no-wallet': 'No wallet detected', - 'user.login.web3.no-address': 'Wallet address not found', - 'user.login.web3.nonce-failed': 'Failed to get nonce', - 'user.login.web3.verify-failed': 'Signature verification failed', - 'user.login.web3.success': 'Login success', - 'user.login.web3.failed': 'Wallet login failed', - 'nav.no_wallet': 'No wallet detected', - 'nav.copy': 'Copy', - 'nav.copy_success': 'Copied', - 'user.login.oauth.google': 'Sign in with Google', - 'user.login.oauth.github': 'Sign in with GitHub', - 'user.login.oauth.loading': 'Redirecting to authorization page...', - 'user.login.oauth.failed': 'OAuth login failed', - 'user.login.oauth.get-url-failed': 'Failed to get authorization URL', - 'user.login.subtitle': 'driven quantitative insights for global markets', - 'user.login.legal.title': 'Legal Disclaimer', - 'user.login.legal.view': 'View Legal Disclaimer', - 'user.login.legal.collapse': 'Hide Legal Disclaimer', - 'user.login.legal.agree': 'I have read and agree to the Legal Disclaimer', - 'user.login.legal.required': 'Please read and check the Legal Disclaimer first', - 'user.login.legal.content': 'QuantDinger is an AI multi-agent stock analysis tool and does not provide investment advice. All analysis results, scores, and references are generated by AI based on historical data and are for learning, research, and technical exchange only. They do not constitute investment advice or a basis for decision-making. Stock investments involve market, liquidity, and policy risks, which may lead to loss of principal. Users should make independent decisions based on their risk tolerance and bear the consequences of any investment behavior and results using this tool.', - 'user.login.privacy.title': 'Privacy Policy', - 'user.login.privacy.view': 'View Privacy Policy', - 'user.login.privacy.collapse': 'Hide Privacy Policy', - 'user.login.privacy.content': 'We value your privacy and data protection. (1) Scope of collection: We only collect information necessary to provide the service (e.g., email, mobile number, country code, Web3 wallet address) and limited logs/device data. (2) Purpose of use: Account login and security verification, feature provisioning, troubleshooting, and compliance requirements. (3) Storage & security: Data is encrypted and access-controlled to prevent unauthorized access, disclosure, or loss. (4) Sharing & third parties: We do not share personal data with third parties except as required by law or to deliver the service; where third-party services are involved (e.g., wallets, SMS providers), processing is limited to the minimum scope required. (5) Cookies/local storage: Used for session and login state (e.g., tokens, PHPSESSID). You may clear or restrict them in your browser. (6) Your rights: You may exercise rights of access, correction, deletion, and consent withdrawal as permitted by law. (7) Changes & notices: We will provide prominent notice for updates. Continued use indicates that you have read and agreed to the updated terms. If you do not agree, please stop using the service and contact us.', - - // Login page additions - 'user.login.username': 'Username', - 'user.login.usernameRequired': 'Please enter username', - 'user.login.passwordRequired': 'Please enter password', - 'user.login.tab': 'Login', - 'user.login.submit': 'Login', - 'user.login.register': 'Create Account', - 'user.login.forgotPassword': 'Forgot Password?', - 'user.login.orLoginWith': 'Or login with', - 'user.login.methodPassword': 'Password', - 'user.login.methodCode': 'Email Code', - 'user.login.email': 'Email', - 'user.login.emailRequired': 'Please enter email', - 'user.login.emailInvalid': 'Invalid email format', - 'user.login.verificationCode': 'Verification Code', - 'user.login.codeRequired': 'Please enter verification code', - 'user.login.sendCode': 'Send', - 'user.login.codeSent': 'Verification code sent', - 'user.login.codeLoginHint': 'New users will be auto-registered', - 'user.login.welcomeNew': 'Welcome!', - 'user.login.accountCreated': 'Your account has been created', - - // OAuth - 'user.oauth.processing': 'Processing login...', - 'user.oauth.error.missing_params': 'Missing required parameters', - 'user.oauth.error.invalid_state': 'Invalid state parameter', - 'user.oauth.error.user_creation_failed': 'Failed to create user', - 'user.oauth.error.server_error': 'Server error', - - // Register page - 'user.register.tab': 'Register', - 'user.register.title': 'Create Account', - 'user.register.email': 'Email', - 'user.register.emailRequired': 'Please enter email', - 'user.register.emailInvalid': 'Invalid email format', - 'user.register.verificationCode': 'Verification Code', - 'user.register.codeRequired': 'Please enter verification code', - 'user.register.sendCode': 'Send Code', - 'user.register.codeSent': 'Verification code sent', - 'user.register.username': 'Username', - 'user.register.usernameRequired': 'Please enter username', - 'user.register.usernameLength': 'Username must be 3-30 characters', - 'user.register.usernamePattern': 'Start with letter, letters/numbers/underscore only', - 'user.register.password': 'Password', - 'user.register.passwordRequired': 'Please enter password', - 'user.register.confirmPassword': 'Confirm Password', - 'user.register.confirmPasswordRequired': 'Please confirm password', - 'user.register.passwordMismatch': 'Passwords do not match', - 'user.register.submit': 'Create Account', - 'user.register.haveAccount': 'Already have an account?', - 'user.register.login': 'Login', - 'user.register.success': 'Registration successful', - 'user.register.pleaseLogin': 'Please login with your new account', - 'user.register.pwdMinLength': 'At least 8 characters', - 'user.register.pwdUppercase': 'At least one uppercase letter', - 'user.register.pwdLowercase': 'At least one lowercase letter', - 'user.register.pwdNumber': 'At least one number', - - // Reset password page - 'user.resetPassword.title': 'Reset Password', - 'user.resetPassword.email': 'Email', - 'user.resetPassword.emailRequired': 'Please enter email', - 'user.resetPassword.emailInvalid': 'Invalid email format', - 'user.resetPassword.verificationCode': 'Verification Code', - 'user.resetPassword.codeRequired': 'Please enter verification code', - 'user.resetPassword.sendCode': 'Send Code', - 'user.resetPassword.codeSent': 'Verification code sent', - 'user.resetPassword.next': 'Next', - 'user.resetPassword.backToLogin': 'Back to Login', - 'user.resetPassword.resettingFor': 'Resetting password for', - 'user.resetPassword.newPassword': 'New Password', - 'user.resetPassword.passwordRequired': 'Please enter new password', - 'user.resetPassword.confirmPassword': 'Confirm New Password', - 'user.resetPassword.confirmPasswordRequired': 'Please confirm password', - 'user.resetPassword.submit': 'Reset Password', - 'user.resetPassword.back': 'Back', - 'user.resetPassword.successTitle': 'Password Reset Successful', - 'user.resetPassword.successSubtitle': 'You can now login with your new password', - 'user.resetPassword.goToLogin': 'Go to Login', - - // Security - 'user.security.retry': 'Retry', - - // Profile - change password - 'profile.passwordHintNew': 'For security, email verification is required to change password. Password must be at least 8 characters with uppercase, lowercase, and number.', - 'profile.verificationCode': 'Verification Code', - 'profile.codeRequired': 'Please enter verification code', - 'profile.codePlaceholder': 'Enter verification code', - 'profile.sendCode': 'Send Code', - 'profile.codeSent': 'Verification code sent', - 'profile.codeWillSendTo': 'Code will be sent to', - 'profile.noEmailWarning': 'Please set your email first in Basic Info tab', - - 'account.basicInfo': 'Basic Information', - 'account.id': 'User ID', - 'account.username': 'Username', - 'account.nickname': 'Nickname', - 'account.email': 'Email', - 'account.mobile': 'Mobile', - 'account.web3address': 'Wallet Address', - 'account.pid': 'Referrer ID', - 'account.level': 'Level', - 'account.money': 'Balance', - 'account.qdtBalance': 'QDT Balance', - 'account.score': 'Score', - 'account.createtime': 'Registration Time', - 'account.inviteLink': 'Invite Link', - 'account.recharge': 'Recharge', - 'account.rechargeTip': 'Please scan the QR code below with WeChat or Alipay to recharge', - 'account.qrCodePlaceholder': 'QR Code Placeholder (Mock)', - 'account.rechargeAmount': 'Recharge Amount', - 'account.enterAmount': 'Please enter recharge amount', - 'account.rechargeHint': 'Minimum recharge amount: 1 QDT', - 'account.confirmRecharge': 'Confirm Recharge', - 'account.enterValidAmount': 'Please enter a valid recharge amount', - 'account.rechargeSuccess': 'Recharge successful! Recharged {amount} QDT', - 'account.settings.menuMap.basic': 'Basic Settings', - 'account.settings.menuMap.security': 'Security Settings', - 'account.settings.menuMap.notification': 'New Message Notification', - 'account.settings.menuMap.moneyLog': 'Transaction History', - 'account.moneyLog.empty': 'No transaction history', - 'account.moneyLog.total': 'Total {total} records', - 'account.moneyLog.type.purchase': 'Purchase Indicator', - 'account.moneyLog.type.recharge': 'Recharge', - 'account.moneyLog.type.refund': 'Refund', - 'account.moneyLog.type.reward': 'Reward', - 'account.moneyLog.type.income': 'Indicator Income', - 'account.moneyLog.type.commission': 'Platform Fee', - 'wallet.balance': 'QDT Balance', - 'wallet.recharge': 'Recharge', - 'wallet.withdraw': 'Withdraw', - 'wallet.filter': 'Filter', - 'wallet.reset': 'Reset', - 'wallet.totalRecharge': 'Total Recharge', - 'wallet.totalWithdraw': 'Total Withdraw', - 'wallet.totalIncome': 'Total Income', - 'wallet.records': 'Trading Records & Transaction History', - 'wallet.tradingRecords': 'Trading Records', - 'wallet.moneyLog': 'Transaction History', - 'wallet.rechargeTip': 'Please scan the QR code below with WeChat or Alipay to recharge', - 'wallet.qrCodePlaceholder': 'QR Code Placeholder (Simulated)', - 'wallet.rechargeAmount': 'Recharge Amount', - 'wallet.enterAmount': 'Please enter recharge amount', - 'wallet.rechargeHint': 'Minimum recharge amount: 1 QDT', - 'wallet.confirmRecharge': 'Confirm Recharge', - 'wallet.enterValidAmount': 'Please enter a valid recharge amount', - 'wallet.rechargeSuccess': 'Recharge successful! Recharged {amount} QDT', - 'wallet.rechargeFailed': 'Recharge failed', - 'wallet.withdrawTip': 'Please enter withdrawal amount and address', - 'wallet.withdrawAmount': 'Withdrawal Amount', - 'wallet.enterWithdrawAmount': 'Please enter withdrawal amount', - 'wallet.withdrawHint': 'Minimum withdrawal amount: 1 QDT', - 'wallet.withdrawAddress': 'Withdrawal Address (Optional)', - 'wallet.enterWithdrawAddress': 'Please enter withdrawal address', - 'wallet.confirmWithdraw': 'Confirm Withdrawal', - 'wallet.enterValidWithdrawAmount': 'Please enter a valid withdrawal amount', - 'wallet.insufficientBalance': 'Insufficient balance', - 'wallet.withdrawSuccess': 'Withdrawal successful! Withdrew {amount} QDT', - 'wallet.withdrawFailed': 'Withdrawal failed', - 'wallet.noTradingRecords': 'No trading records', - 'wallet.noMoneyLog': 'No transaction history', - 'wallet.loadTradingRecordsFailed': 'Failed to load trading records', - 'wallet.loadMoneyLogFailed': 'Failed to load transaction history', - 'wallet.moneyLogTotal': 'Total {total} records', - 'wallet.moneyLogTypeTitle': 'Type', - 'wallet.moneyLogType.all': 'All types', - 'wallet.table.time': 'Time', - 'wallet.table.type': 'Type', - 'wallet.table.price': 'Price', - 'wallet.table.amount': 'Amount', - 'wallet.table.money': 'Amount', - 'wallet.table.balance': 'Balance', - 'wallet.table.memo': 'Memo', - 'wallet.table.value': 'Value', - 'wallet.table.profit': 'P/L', - 'wallet.table.commission': 'Commission', - 'wallet.table.total': 'Total {total} records', - 'wallet.tradeType.buy': 'Buy', - 'wallet.tradeType.sell': 'Sell', - 'wallet.tradeType.liquidation': 'Liquidation', - 'wallet.tradeType.openLong': 'Open Long', - 'wallet.tradeType.addLong': 'Add Long', - 'wallet.tradeType.closeLong': 'Close Long', - 'wallet.tradeType.closeLongStop': 'Stop Loss Close Long', - 'wallet.tradeType.closeLongProfit': 'Take Profit Close Long', - 'wallet.tradeType.openShort': 'Open Short', - 'wallet.tradeType.addShort': 'Add Short', - 'wallet.tradeType.closeShort': 'Close Short', - 'wallet.tradeType.closeShortStop': 'Stop Loss Close Short', - 'wallet.tradeType.closeShortProfit': 'Take Profit Close Short', - 'wallet.moneyLogType.purchase': 'Purchase Indicator', - 'wallet.moneyLogType.recharge': 'Recharge', - 'wallet.moneyLogType.withdraw': 'Withdraw', - 'wallet.moneyLogType.refund': 'Refund', - 'wallet.moneyLogType.reward': 'Reward', - 'wallet.moneyLogType.income': 'Income', - 'wallet.moneyLogType.commission': 'Commission', - 'wallet.web3Address.required': 'Please fill in Web3 wallet address first', - 'wallet.web3Address.requiredDescription': 'You need to bind your Web3 wallet address before recharging to receive deposits', - 'wallet.web3Address.placeholder': 'Please enter your Web3 wallet address (starts with 0x)', - 'wallet.web3Address.save': 'Save Wallet Address', - 'wallet.web3Address.saveSuccess': 'Wallet address saved successfully', - 'wallet.web3Address.saveFailed': 'Failed to save wallet address', - 'wallet.web3Address.invalidFormat': 'Please enter a valid Web3 wallet address (Ethereum format: 42 characters starting with 0x, or TRC20 format: 34 characters starting with T)', - 'wallet.selectCoin': 'Select Coin', - 'wallet.selectChain': 'Select Chain', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'Target QDT Amount (Optional)', - 'wallet.targetQdtAmount.placeholder': 'Enter the QDT amount you want to exchange, current QDT price: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'Required USDT: {amount}', - 'wallet.rechargeAddress': 'Recharge Address', - 'wallet.copyAddress': 'Copy', - 'wallet.copySuccess': 'Copied successfully!', - 'wallet.copyFailed': 'Copy failed, please copy manually', - 'wallet.rechargeAddressHint': 'Please ensure you use {chain} chain to recharge {coin} to this address', - 'wallet.qdtPrice.loading': 'Loading...', - 'wallet.rechargeTip.new': 'Please select coin and chain, then scan the QR code below to recharge', - 'wallet.exchangeRate': '1 QDT โ‰ˆ {rate} USDT', - 'wallet.withdrawableAmount': 'Withdrawable Amount', - 'wallet.totalBalance': 'Total Balance', - 'wallet.insufficientWithdrawable': 'Insufficient withdrawable amount, current withdrawable: {amount} QDT', - 'wallet.withdrawAddressRequired': 'Please enter withdrawal address', - 'wallet.withdrawAddressHint': 'Please ensure the address is correct, withdrawal cannot be revoked', - 'wallet.withdrawSubmitSuccess': 'Withdrawal application submitted successfully, please wait for review', - 'menu.footer.contactUs': 'Contact Us', - 'menu.footer.getSupport': 'Get Support', - 'menu.footer.socialAccounts': 'Social Accounts', - 'menu.footer.userAgreement': 'User Agreement', - 'menu.footer.privacyPolicy': 'Privacy Policy', - 'menu.footer.support': 'Support', - 'menu.footer.featureRequest': 'Feature request', - 'menu.footer.email': 'Email', - 'menu.footer.liveChat': '24/7 live chat', - 'dashboard.analysis.title': 'Multi-Dimensional Analysis', - 'dashboard.analysis.subtitle': 'AI-Powered Comprehensive Financial Analysis Platform', - 'dashboard.analysis.selectSymbol': 'Select or enter symbol code', - 'dashboard.analysis.selectModel': 'Select Model', - 'dashboard.analysis.startAnalysis': 'Start Analysis', - 'dashboard.analysis.history': 'History', - 'dashboard.analysis.tab.overview': 'Overview', - 'dashboard.analysis.tab.fundamental': 'Fundamental', - 'dashboard.analysis.tab.technical': 'Technical', - 'dashboard.analysis.tab.news': 'News', - 'dashboard.analysis.tab.sentiment': 'Sentiment', - 'dashboard.analysis.tab.risk': 'Risk', - 'dashboard.analysis.tab.debate': 'Debate', - 'dashboard.analysis.tab.decision': 'Final Decision', - 'dashboard.analysis.empty.selectSymbol': 'Select Symbol to Start Analysis', - 'dashboard.analysis.empty.selectSymbolDesc': 'Select from watchlist or enter symbol code to get multi-dimensional AI analysis report', - 'dashboard.analysis.empty.startAnalysis': 'Click "Start Analysis" button to perform multi-dimensional analysis', - 'dashboard.analysis.empty.startAnalysisDesc': 'We will provide comprehensive analysis from multiple dimensions including fundamental, technical, news, sentiment and risk', - 'dashboard.analysis.empty.noData': 'No {type} analysis data available, please perform comprehensive analysis first', - 'dashboard.analysis.empty.noWatchlist': 'No watchlist items', - 'dashboard.analysis.empty.noHistory': 'No history records', - 'dashboard.analysis.empty.watchlistHint': 'No watchlist, please', - 'dashboard.analysis.empty.noDebateData': 'No debate data available', - 'dashboard.analysis.empty.noDecisionData': 'No decision data available', - 'dashboard.analysis.empty.selectAgent': 'Please select an Agent to view analysis results', - 'dashboard.analysis.loading.analyzing': 'Analyzing, please wait...', - 'dashboard.analysis.loading.fundamental': 'Analyzing fundamental data...', - 'dashboard.analysis.loading.technical': 'Analyzing technical indicators...', - 'dashboard.analysis.loading.news': 'Analyzing news data...', - 'dashboard.analysis.loading.sentiment': 'Analyzing market sentiment...', - 'dashboard.analysis.loading.risk': 'Assessing risks...', - 'dashboard.analysis.loading.debate': 'Debating...', - 'dashboard.analysis.loading.decision': 'Generating final decision...', - 'dashboard.analysis.score.overall': 'Overall Score', - 'dashboard.analysis.score.recommendation': 'Recommendation', - 'dashboard.analysis.score.confidence': 'Confidence', - 'dashboard.analysis.dimension.fundamental': 'Fundamental', - 'dashboard.analysis.dimension.technical': 'Technical', - 'dashboard.analysis.dimension.news': 'News', - 'dashboard.analysis.dimension.sentiment': 'Sentiment', - 'dashboard.analysis.dimension.risk': 'Risk', - 'dashboard.analysis.card.dimensionScores': 'Dimension Scores', - 'dashboard.analysis.card.overviewReport': 'Overview Report', - 'dashboard.analysis.card.financialMetrics': 'Financial Metrics', - 'dashboard.analysis.card.fundamentalReport': 'Fundamental Analysis Report', - 'dashboard.analysis.card.technicalIndicators': 'Technical Indicators', - 'dashboard.analysis.card.technicalReport': 'Technical Analysis Report', - 'dashboard.analysis.card.newsList': 'Related News', - 'dashboard.analysis.card.newsReport': 'News Analysis Report', - 'dashboard.analysis.card.sentimentIndicators': 'Sentiment Indicators', - 'dashboard.analysis.card.sentimentReport': 'Sentiment Analysis Report', - 'dashboard.analysis.card.riskMetrics': 'Risk Metrics', - 'dashboard.analysis.card.riskReport': 'Risk Assessment Report', - 'dashboard.analysis.card.bullView': 'Bullish View (Bull)', - 'dashboard.analysis.card.bearView': 'Bearish View (Bear)', - 'dashboard.analysis.card.researchConclusion': 'Researcher Conclusion', - 'dashboard.analysis.card.traderPlan': 'Trader Plan', - 'dashboard.analysis.card.riskDebate': 'Risk Committee Debate', - 'dashboard.analysis.card.finalDecision': 'Final Decision', - 'dashboard.analysis.card.tradePlanDetail': 'Trading Plan Details', - 'dashboard.analysis.tradingPlan.entry_price': 'Entry Price', - 'dashboard.analysis.tradingPlan.position_size': 'Position Size', - 'dashboard.analysis.tradingPlan.stop_loss': 'Stop Loss', - 'dashboard.analysis.tradingPlan.take_profit': 'Take Profit', - 'dashboard.analysis.label.confidence': 'Confidence', - 'dashboard.analysis.label.keyPoints': 'Key Points', - 'dashboard.analysis.label.riskWarning': 'Risk Warning', - 'dashboard.analysis.risk.risky': 'Aggressive View (Risky)', - 'dashboard.analysis.risk.neutral': 'Neutral View (Neutral)', - 'dashboard.analysis.risk.safe': 'Conservative View (Safe)', - 'dashboard.analysis.risk.conclusion': 'Conclusion', - 'dashboard.analysis.feature.fundamental': 'Fundamental Analysis', - 'dashboard.analysis.feature.technical': 'Technical Analysis', - 'dashboard.analysis.feature.news': 'News Analysis', - 'dashboard.analysis.feature.sentiment': 'Sentiment Analysis', - 'dashboard.analysis.feature.risk': 'Risk Assessment', - 'dashboard.analysis.watchlist.title': 'My Watchlist', - 'dashboard.analysis.watchlist.add': 'Add', - 'dashboard.analysis.watchlist.addStock': 'Add Stock', - 'dashboard.analysis.modal.addStock.title': 'Add to Watchlist', - 'dashboard.analysis.modal.addStock.confirm': 'Confirm', - 'dashboard.analysis.modal.addStock.cancel': 'Cancel', - 'dashboard.analysis.modal.addStock.market': 'Market Type', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'Please select market', - 'dashboard.analysis.modal.addStock.marketRequired': 'Please select market type', - 'dashboard.analysis.modal.addStock.symbol': 'Symbol', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'e.g.: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'Please enter symbol code', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'Search symbol code or name', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Search or enter symbol code (e.g.: AAPL, BTC/USDT, EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'Search in database or enter code directly (name will be fetched automatically)', - 'dashboard.analysis.modal.addStock.search': 'Search', - 'dashboard.analysis.modal.addStock.searchResults': 'Search Results', - 'dashboard.analysis.modal.addStock.hotSymbols': 'Hot Symbols', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'No hot symbols available', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'Selected Symbol', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'Please select a symbol first', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'Please select a symbol or enter symbol code', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Please enter symbol code', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'Please select market type first', - 'dashboard.analysis.modal.addStock.searchFailed': 'Search failed, please try again later', - 'dashboard.analysis.modal.addStock.noSearchResults': 'No matching symbols found', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'Name will be fetched automatically', - 'dashboard.analysis.modal.addStock.addDirectly': 'Add Directly', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Name will be fetched automatically when adding', - 'dashboard.analysis.market.USStock': 'US Stock', - 'dashboard.analysis.market.Crypto': 'Cryptocurrency', - 'dashboard.analysis.market.Forex': 'Forex', - 'dashboard.analysis.market.Futures': 'Futures', - 'dashboard.analysis.modal.history.title': 'Analysis History', - 'dashboard.analysis.modal.history.viewResult': 'View Result', - 'dashboard.analysis.modal.history.completeTime': 'Complete Time', - 'dashboard.analysis.modal.history.error': 'Error', - 'dashboard.analysis.status.pending': 'Pending', - 'dashboard.analysis.status.processing': 'Processing', - 'dashboard.analysis.status.completed': 'Completed', - 'dashboard.analysis.status.failed': 'Failed', - 'dashboard.analysis.message.selectSymbol': 'Please select a symbol first', - 'dashboard.analysis.message.taskCreated': 'Analysis task created, executing in background...', - 'dashboard.analysis.message.analysisComplete': 'Analysis Complete', - 'dashboard.analysis.message.analysisCompleteCache': 'Analysis Complete (Using Cache)', - 'dashboard.analysis.message.analysisFailed': 'Analysis failed, please try again later', - 'dashboard.analysis.message.addStockSuccess': 'Added successfully', - 'dashboard.analysis.message.addStockFailed': 'Failed to add', - 'dashboard.analysis.message.removeStockSuccess': 'Removed successfully', - 'dashboard.analysis.message.removeStockFailed': 'Failed to remove', - 'dashboard.analysis.message.resumingAnalysis': 'Resuming analysis task...', - 'dashboard.analysis.message.deleteSuccess': 'Deleted successfully', - 'dashboard.analysis.message.deleteFailed': 'Failed to delete', - 'dashboard.analysis.modal.history.delete': 'Delete', - 'dashboard.analysis.modal.history.deleteConfirm': 'Are you sure you want to delete this analysis record?', - 'dashboard.analysis.test': 'Gongzhuan No.{no} shop', - 'dashboard.analysis.introduce': 'Introduce', - 'dashboard.analysis.total-sales': 'Total Sales', - 'dashboard.analysis.day-sales': 'Daily Sales', - 'dashboard.analysis.visits': 'Visits', - 'dashboard.analysis.visits-trend': 'Visits Trend', - 'dashboard.analysis.visits-ranking': 'Visits Ranking', - 'dashboard.analysis.day-visits': 'Daily Visits', - 'dashboard.analysis.week': 'WoW Change', - 'dashboard.analysis.day': 'DoD Change', - 'dashboard.analysis.payments': 'Payments', - 'dashboard.analysis.conversion-rate': 'Conversion Rate', - 'dashboard.analysis.operational-effect': 'Operational Effect', - 'dashboard.analysis.sales-trend': 'Stores Sales Trend', - 'dashboard.analysis.sales-ranking': 'Sales Ranking', - 'dashboard.analysis.all-year': 'All Year', - 'dashboard.analysis.all-month': 'All Month', - 'dashboard.analysis.all-week': 'All Week', - 'dashboard.analysis.all-day': 'All day', - 'dashboard.analysis.search-users': 'Search Users', - 'dashboard.analysis.per-capita-search': 'Per Capita Search', - 'dashboard.analysis.online-top-search': 'Online Top Search', - 'dashboard.analysis.the-proportion-of-sales': 'The Proportion Of Sales', - 'dashboard.analysis.dropdown-option-one': 'Operation one', - 'dashboard.analysis.dropdown-option-two': 'Operation two', - 'dashboard.analysis.channel.all': 'ALL', - 'dashboard.analysis.channel.online': 'Online', - 'dashboard.analysis.channel.stores': 'Stores', - 'dashboard.analysis.sales': 'Sales', - 'dashboard.analysis.traffic': 'Traffic', - 'dashboard.analysis.table.rank': 'Rank', - 'dashboard.analysis.table.search-keyword': 'Keyword', - 'dashboard.analysis.table.users': 'Users', - 'dashboard.analysis.table.weekly-range': 'Weekly Range', - 'dashboard.indicator.selectSymbol': 'Select or enter symbol code', - 'dashboard.indicator.emptyWatchlistHint': 'No watchlist, please add first', - 'dashboard.indicator.hint.selectSymbol': 'Please select a symbol to start analysis', - 'dashboard.indicator.hint.selectSymbolDesc': 'Select or enter stock code in the search box above to view K-line chart and technical indicators', - 'dashboard.indicator.retry': 'Retry', - 'dashboard.indicator.panel.title': 'Technical Indicators', - 'dashboard.indicator.panel.realtimeOn': 'Turn off real-time update', - 'dashboard.indicator.panel.realtimeOff': 'Turn on real-time update', - 'dashboard.indicator.panel.themeLight': 'Switch to dark theme', - 'dashboard.indicator.panel.themeDark': 'Switch to light theme', - 'dashboard.indicator.section.enabled': 'Enabled', - 'dashboard.indicator.section.added': 'My Added Indicators', - 'dashboard.indicator.section.custom': 'My Created Indicators', - 'dashboard.indicator.section.bought': 'Purchased Indicators', - 'dashboard.indicator.section.myCreated': 'My Created Indicators', - 'dashboard.indicator.section.purchased': 'Purchased Indicators', - 'dashboard.indicator.empty': 'No indicators, please add or create indicators first', - 'dashboard.indicator.emptyPurchased': 'No purchased indicators, check out the market', - 'dashboard.indicator.buy': 'Buy Indicators', - 'dashboard.indicator.action.start': 'Start', - 'dashboard.indicator.action.stop': 'Stop', - 'dashboard.indicator.action.edit': 'Edit', - 'dashboard.indicator.action.delete': 'Delete', - 'dashboard.indicator.action.backtest': 'Backtest', - 'dashboard.indicator.action.publish': 'Publish to Community', - 'dashboard.indicator.action.unpublish': 'Published (Click to Manage)', - 'dashboard.indicator.status.normal': 'Active', - 'dashboard.indicator.status.normalPermanent': 'Active (Permanent)', - 'dashboard.indicator.status.expired': 'Expired', - 'dashboard.indicator.expiry.permanent': 'Permanent', - 'dashboard.indicator.expiry.noExpiry': 'No expiration', - 'dashboard.indicator.expiry.expired': 'Expired: {date}', - 'dashboard.indicator.expiry.expiresOn': 'Expires: {date}', - 'dashboard.indicator.delete.confirmTitle': 'Confirm Deletion', - 'dashboard.indicator.delete.confirmContent': 'Are you sure you want to delete indicator "{name}"? This action cannot be undone.', - 'dashboard.indicator.delete.confirmOk': 'Delete', - 'dashboard.indicator.delete.confirmCancel': 'Cancel', - 'dashboard.indicator.delete.success': 'Deleted successfully', - 'dashboard.indicator.delete.failed': 'Failed to delete', - 'dashboard.indicator.save.success': 'Saved successfully', - 'dashboard.indicator.save.failed': 'Failed to save', - 'dashboard.indicator.publish.title': 'Publish to Community', - 'dashboard.indicator.publish.editTitle': 'Manage Publication', - 'dashboard.indicator.publish.hint': 'After publishing, other users can view and purchase your indicator in the "Indicator Community"', - 'dashboard.indicator.publish.pricingType': 'Pricing Type', - 'dashboard.indicator.publish.free': 'Free', - 'dashboard.indicator.publish.paid': 'Paid', - 'dashboard.indicator.publish.price': 'Price', - 'dashboard.indicator.publish.description': 'Description', - 'dashboard.indicator.publish.descriptionPlaceholder': 'Enter a detailed description to help others understand your indicator...', - 'dashboard.indicator.publish.confirm': 'Publish', - 'dashboard.indicator.publish.update': 'Update', - 'dashboard.indicator.publish.unpublish': 'Unpublish', - 'dashboard.indicator.publish.success': 'Published successfully', - 'dashboard.indicator.publish.failed': 'Failed to publish', - 'dashboard.indicator.publish.unpublishSuccess': 'Unpublished successfully', - 'dashboard.indicator.publish.unpublishFailed': 'Failed to unpublish', - 'dashboard.indicator.error.loadWatchlistFailed': 'Failed to load watchlist', - 'dashboard.indicator.error.chartNotReady': 'Chart component not initialized, please select a symbol and wait for the chart to load', - 'dashboard.indicator.error.chartMethodNotReady': 'Chart component method not ready, please try again later', - 'dashboard.indicator.error.chartExecuteNotReady': 'Chart component execute method not ready, please try again later', - 'dashboard.indicator.error.parseFailed': 'Failed to parse Python code', - 'dashboard.indicator.error.parseFailedCheck': 'Failed to parse Python code, please check the code format', - 'dashboard.indicator.error.addIndicatorFailed': 'Failed to add indicator', - 'dashboard.indicator.error.runIndicatorFailed': 'Failed to run indicator', - 'dashboard.indicator.error.pleaseLogin': 'Please login first', - 'dashboard.indicator.error.loadDataFailed': 'Failed to load data', - 'dashboard.indicator.error.loadDataFailedDesc': 'Please check network connection', - 'dashboard.indicator.error.tiingoSubscription': 'Forex 1-minute data requires Tiingo paid subscription. Please use other timeframes or upgrade your subscription.', - 'dashboard.indicator.error.pythonEngineFailed': 'Python engine failed to load, indicator functionality may be unavailable', - 'dashboard.indicator.error.chartInitFailed': 'Chart initialization failed', - 'dashboard.indicator.warning.enterCode': 'Please enter indicator code first', - 'dashboard.indicator.warning.chartNotInitialized': 'Chart not initialized, cannot use drawing tools', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python Engine Load Failed', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'Your current region or network environment cannot use this feature', - 'dashboard.indicator.success.runIndicator': 'Indicator ran successfully', - 'dashboard.indicator.success.clearDrawings': 'All drawings cleared', - 'dashboard.indicator.sma': 'SMA (Moving Average Group)', - 'dashboard.indicator.ema': 'EMA (Exponential Moving Average Group)', - 'dashboard.indicator.rsi': 'RSI (Relative Strength Index)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'Bollinger Bands', - 'dashboard.indicator.atr': 'ATR (Average True Range)', - 'dashboard.indicator.cci': 'CCI (Commodity Channel Index)', - 'dashboard.indicator.williams': 'Williams %R', - 'dashboard.indicator.mfi': 'MFI (Money Flow Index)', - 'dashboard.indicator.adx': 'ADX (Average Directional Index)', - 'dashboard.indicator.obv': 'OBV (On Balance Volume)', - 'dashboard.indicator.adosc': 'ADOSC (Accumulation/Distribution Oscillator)', - 'dashboard.indicator.ad': 'AD (Accumulation/Distribution Line)', - 'dashboard.indicator.kdj': 'KDJ (Stochastic Indicator)', - 'dashboard.indicator.signal.buy': 'BUY', - 'dashboard.indicator.signal.sell': 'SELL', - 'dashboard.indicator.signal.supertrendBuy': 'SuperTrend Buy', - 'dashboard.indicator.signal.supertrendSell': 'SuperTrend Sell', - 'dashboard.indicator.chart.kline': 'K-Line', - 'dashboard.indicator.chart.volume': 'Volume', - 'dashboard.indicator.chart.uptrend': 'Up Trend', - 'dashboard.indicator.chart.downtrend': 'Down Trend', - 'dashboard.indicator.tooltip.time': 'Time', - 'dashboard.indicator.tooltip.open': 'O', - 'dashboard.indicator.tooltip.close': 'C', - 'dashboard.indicator.tooltip.high': 'H', - 'dashboard.indicator.tooltip.low': 'L', - 'dashboard.indicator.tooltip.volume': 'Volume', - 'dashboard.indicator.drawing.line': 'Line', - 'dashboard.indicator.drawing.horizontalLine': 'Horizontal Line', - 'dashboard.indicator.drawing.verticalLine': 'Vertical Line', - 'dashboard.indicator.drawing.ray': 'Ray', - 'dashboard.indicator.drawing.straightLine': 'Straight Line', - 'dashboard.indicator.drawing.parallelLine': 'Parallel Line', - 'dashboard.indicator.drawing.priceLine': 'Price Line', - 'dashboard.indicator.drawing.priceChannel': 'Price Channel', - 'dashboard.indicator.drawing.fibonacciLine': 'Fibonacci Line', - 'dashboard.indicator.drawing.clearAll': 'Clear All Drawings', - 'dashboard.indicator.market.USStock': 'US Stock', - 'dashboard.indicator.market.Crypto': 'Cryptocurrency', - 'dashboard.indicator.market.Forex': 'Forex', - 'dashboard.indicator.market.Futures': 'Futures', - 'dashboard.indicator.create': 'Create Indicator', - 'dashboard.indicator.editor.title': 'Create/Edit Indicator', - 'dashboard.indicator.editor.name': 'Indicator Name', - 'dashboard.indicator.editor.nameRequired': 'Please enter indicator name', - 'dashboard.indicator.editor.namePlaceholder': 'Enter indicator name', - 'dashboard.indicator.editor.description': 'Description', - 'dashboard.indicator.editor.descriptionPlaceholder': 'Enter description (optional)', - 'dashboard.indicator.editor.code': 'Python Code', - 'dashboard.indicator.editor.codeRequired': 'Please enter indicator code', - 'dashboard.indicator.editor.codePlaceholder': 'Enter Python code', - 'dashboard.indicator.editor.run': 'Run', - 'dashboard.indicator.editor.runHint': 'Click Run button to preview indicator on K-line chart', - 'dashboard.indicator.editor.guide': 'Development Guide', - 'dashboard.indicator.editor.guideTitle': 'Python Indicator Development Guide', - 'dashboard.indicator.editor.save': 'Save', - 'dashboard.indicator.editor.cancel': 'Cancel', - 'dashboard.indicator.editor.unnamed': 'Unnamed Indicator', - 'dashboard.indicator.editor.publishToCommunity': 'Publish to Community', - 'dashboard.indicator.editor.publishToCommunityHint': 'After publishing, other users can view and use your indicator in the community', - 'dashboard.indicator.editor.indicatorType': 'Indicator Type', - 'dashboard.indicator.editor.indicatorTypeRequired': 'Please select indicator type', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'Please select indicator type', - 'dashboard.indicator.editor.previewImage': 'Preview Image', - 'dashboard.indicator.editor.uploadImage': 'Upload Image', - 'dashboard.indicator.editor.previewImageHint': 'Recommended size: 800x400, max 2MB', - 'dashboard.indicator.editor.pricing': 'Pricing (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'Free', - 'dashboard.indicator.editor.pricingType.permanent': 'Permanent', - 'dashboard.indicator.editor.pricingType.monthly': 'Monthly', - 'dashboard.indicator.editor.price': 'Price', - 'dashboard.indicator.editor.priceRequired': 'Please enter price', - 'dashboard.indicator.editor.pricePlaceholder': 'Please enter price', - 'dashboard.indicator.editor.pricingHint': 'Free indicators (price 0) will still receive platform rewards based on usage and ratings (QDT)', - 'dashboard.indicator.editor.aiGenerate': 'AI Generate', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'Describe your signal logic (buy/sell only) and plots. Position sizing, risk, scaling, fees/slippage are configured in backtest.', - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell โ†’ open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI Generate Code', - 'dashboard.indicator.editor.aiPromptRequired': 'Please enter your idea', - 'dashboard.indicator.editor.aiGenerateSuccess': 'Code generated successfully', - 'dashboard.indicator.editor.aiGenerateError': 'Code generation failed, please try again later', - 'dashboard.indicator.editor.verifyCode': 'Verify Code', - 'dashboard.indicator.editor.verifyCodeSuccess': 'Verification Passed', - 'dashboard.indicator.editor.verifyCodeFailed': 'Verification Failed', - 'dashboard.indicator.editor.verifyCodeEmpty': 'Code cannot be empty', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.paramsConfig.title': 'Indicator Parameters', - 'dashboard.indicator.paramsConfig.noParams': 'No configurable parameters for this indicator', - 'dashboard.indicator.paramsConfig.hint': 'Configure parameters and click OK to run the indicator', - 'dashboard.indicator.backtest.title': 'Indicator Backtest', - 'dashboard.indicator.backtest.config': 'Backtest Parameters', - 'dashboard.indicator.backtest.startDate': 'Start Date', - 'dashboard.indicator.backtest.endDate': 'End Date', - 'dashboard.indicator.backtest.selectStartDate': 'Select start date', - 'dashboard.indicator.backtest.selectEndDate': 'Select end date', - 'dashboard.indicator.backtest.startDateRequired': 'Please select start date', - 'dashboard.indicator.backtest.endDateRequired': 'Please select end date', - 'dashboard.indicator.backtest.initialCapital': 'Initial Capital', - 'dashboard.indicator.backtest.initialCapitalRequired': 'Please enter initial capital', - 'dashboard.indicator.backtest.commission': 'Commission Rate (%)', - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.leverage': 'Leverage', - 'dashboard.indicator.backtest.timeframe': 'Timeframe', - 'dashboard.indicator.backtest.tradeDirection': 'Trade Direction', - 'dashboard.indicator.backtest.longOnly': 'Long Only', - 'dashboard.indicator.backtest.shortOnly': 'Short Only', - 'dashboard.indicator.backtest.both': 'Both', - 'dashboard.indicator.backtest.run': 'Run Backtest', - 'dashboard.indicator.backtest.rerun': 'Run Again', - 'dashboard.indicator.backtest.close': 'Close', - 'dashboard.indicator.backtest.running': 'Running indicator backtest...', - 'dashboard.indicator.backtest.loadingTip1': 'Fetching historical K-line data...', - 'dashboard.indicator.backtest.loadingTip2': 'Executing strategy signal calculation...', - 'dashboard.indicator.backtest.loadingTip3': 'Simulating trade execution...', - 'dashboard.indicator.backtest.loadingTip4': 'Calculating backtest metrics...', - 'dashboard.indicator.backtest.loadingTip5': 'Almost done, please wait...', - 'dashboard.indicator.backtest.results': 'Backtest Results', - 'dashboard.indicator.backtest.totalReturn': 'Total Return', - 'dashboard.indicator.backtest.annualReturn': 'Annual Return', - 'dashboard.indicator.backtest.maxDrawdown': 'Max Drawdown', - 'dashboard.indicator.backtest.sharpeRatio': 'Sharpe Ratio', - 'dashboard.indicator.backtest.winRate': 'Win Rate', - 'dashboard.indicator.backtest.profitFactor': 'Profit Factor', - 'dashboard.indicator.backtest.totalTrades': 'Total Trades', - 'dashboard.indicator.totalReturn': 'Total Return', - 'dashboard.indicator.annualReturn': 'Annual Return', - 'dashboard.indicator.maxDrawdown': 'Max Drawdown', - 'dashboard.indicator.sharpeRatio': 'Sharpe Ratio', - 'dashboard.indicator.winRate': 'Win Rate', - 'dashboard.indicator.profitFactor': 'Profit Factor', - 'dashboard.indicator.totalTrades': 'Total Trades', - 'dashboard.indicator.backtest.totalCommission': 'Total Commission', - 'dashboard.indicator.backtest.equityCurve': 'Equity Curve', - 'dashboard.indicator.backtest.strategy': 'Indicator', - 'dashboard.indicator.backtest.benchmark': 'Benchmark', - 'dashboard.indicator.backtest.tradeHistory': 'Trade History', - 'dashboard.indicator.backtest.tradeTime': 'Time', - 'dashboard.indicator.backtest.tradeType': 'Type', - 'dashboard.indicator.backtest.buy': 'Buy', - 'dashboard.indicator.backtest.sell': 'Sell', - 'dashboard.indicator.backtest.liquidation': 'Liquidation', - 'dashboard.indicator.backtest.openLong': 'Open Long', - 'dashboard.indicator.backtest.closeLong': 'Close Long', - 'dashboard.indicator.backtest.closeLongStop': 'Close Long (Stop Loss)', - 'dashboard.indicator.backtest.closeLongProfit': 'Close Long (Take Profit)', - 'dashboard.indicator.backtest.addLong': 'Add Long', - 'dashboard.indicator.backtest.openShort': 'Open Short', - 'dashboard.indicator.backtest.closeShort': 'Close Short', - 'dashboard.indicator.backtest.closeShortStop': 'Close Short (Stop Loss)', - 'dashboard.indicator.backtest.closeShortProfit': 'Close Short (Take Profit)', - 'dashboard.indicator.backtest.addShort': 'Add Short', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.indicator.backtest.price': 'Price', - 'dashboard.indicator.backtest.amount': 'Amount', - 'dashboard.indicator.backtest.balance': 'Balance', - 'dashboard.indicator.backtest.profit': 'P&L', - 'dashboard.indicator.backtest.success': 'Backtest completed', - 'dashboard.indicator.backtest.failed': 'Backtest failed, please try again later', - 'dashboard.indicator.backtest.quickSelect': 'Quick Select', - // Multi-timeframe backtest precision hints - 'dashboard.indicator.backtest.precisionMode': 'Backtest Precision Mode', - 'dashboard.indicator.backtest.estimatedCandles': 'Est. {count} candles to process', - 'dashboard.indicator.backtest.highPrecisionDesc': 'Using 1-minute candles for high-precision backtest, stop-loss/take-profit triggers are more accurate', - 'dashboard.indicator.backtest.mediumPrecisionDesc': 'Range exceeds 30 days, using 5-minute candles to balance precision and performance', - 'dashboard.indicator.backtest.standardModeWarning': 'Using Standard Backtest Mode', - 'dashboard.indicator.backtest.standardModeDesc': 'Current config does not support high-precision backtest, using strategy timeframe', - 'dashboard.indicator.backtest.onlyCryptoSupported': 'High-precision backtest only supports cryptocurrency market', - 'dashboard.indicator.backtest.noIndicatorCode': 'This indicator has no backtestable code', - 'dashboard.indicator.backtest.noSymbol': 'Please select a trading symbol first', - 'dashboard.indicator.backtest.dateRangeExceeded': 'Backtest date range exceeded: {timeframe} timeframe allows max {maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Execution Config', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position, risk, scaling', - 'dashboard.indicator.backtest.steps.trading.title': 'Backtest Setup', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time, capital, fees, leverage, slippage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Summary & trades', - 'dashboard.indicator.backtest.panel.risk': 'Execution: Risk (SL / trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Execution: Scale-in (Trend / DCA)', - 'dashboard.indicator.backtest.panel.reduce': 'Execution: Scale-out (Trend / Adverse)', - 'dashboard.indicator.backtest.panel.position': 'Execution: Entry sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'dashboard.docs.title': 'Documentation', - 'dashboard.docs.search.placeholder': 'Search documents...', - 'dashboard.docs.category.all': 'All', - 'dashboard.docs.category.guide': 'Guides', - 'dashboard.docs.category.api': 'API Reference', - 'dashboard.docs.category.tutorial': 'Tutorials', - 'dashboard.docs.category.faq': 'FAQ', - 'dashboard.docs.featured.title': 'Featured Documents', - 'dashboard.docs.featured.tag': 'Featured', - 'dashboard.docs.list.views': 'views', - 'dashboard.docs.list.author': 'Author', - 'dashboard.docs.list.empty': 'No documents', - 'dashboard.docs.list.backToAll': 'Back to All Documents', - 'dashboard.docs.list.total': 'Total {count} documents', - 'dashboard.docs.detail.back': 'Back to List', - 'dashboard.docs.detail.updatedAt': 'Updated at', - 'dashboard.docs.detail.related': 'Related Documents', - 'dashboard.docs.detail.notFound': 'Document Not Found', - 'dashboard.docs.detail.error': 'Document does not exist or has been deleted', - 'dashboard.docs.search.result': 'Search Results', - 'dashboard.docs.search.keyword': 'Keyword', - 'dashboard.totalEquity': 'Total Equity', - 'dashboard.totalPnL': 'Total P&L', - 'dashboard.aiStrategies': 'AI Strategies', - 'dashboard.indicatorStrategies': 'Indicator Strategies', - 'dashboard.running': 'Running', - 'dashboard.enabled': 'Enabled', - 'dashboard.pnlHistory': 'P&L History', - 'dashboard.strategyPerformance': 'Strategy Performance', - 'dashboard.strategyRanking': 'Strategy Ranking', - // New KPI labels - 'dashboard.winRate': 'Win Rate', - 'dashboard.profitFactor': 'Profit Factor', - 'dashboard.maxDrawdown': 'Max Drawdown', - 'dashboard.totalTrades': 'Total Trades', - 'dashboard.runningStrategies': 'Running Strategies', - 'dashboard.equityCurve': 'Equity Curve', - 'dashboard.strategyAllocation': 'Strategy Allocation', - 'dashboard.drawdownCurve': 'Drawdown Curve', - 'dashboard.drawdown': 'Drawdown', - 'dashboard.hourlyDistribution': 'Hourly Distribution', - // Chart labels - 'dashboard.dailyPnl': 'Daily P&L', - 'dashboard.cumulativePnl': 'Cumulative P&L', - 'dashboard.tradeCount': 'Trade Count', - 'dashboard.profit': 'Profit', - 'dashboard.noData': 'No Data', - 'dashboard.noStrategyData': 'No strategy data', - // Ranking labels - 'dashboard.ranking.totalProfit': 'Total Profit', - 'dashboard.ranking.roi': 'ROI', - 'dashboard.ranking.trades': 'Trades', - // Units and labels - 'dashboard.unit.trades': '', - 'dashboard.unit.strategies': '', - 'dashboard.label.avgDaily': 'Avg Daily', - 'dashboard.label.avgProfit': 'Avg Profit', - 'dashboard.label.win': 'W', - 'dashboard.label.lose': 'L', - 'dashboard.label.trade': 'Trades', - 'dashboard.label.indicator': 'Indicator', - 'dashboard.label.totalPnl': 'Total P&L', - 'dashboard.label.maxDrawdownPoint': 'Max DD', - 'dashboard.profitCalendar': 'Profit Calendar', - 'dashboard.recentTrades': 'Recent Trades', - 'dashboard.currentPositions': 'Current Positions', - 'dashboard.table.time': 'Time', - 'dashboard.table.strategy': 'Strategy', - 'dashboard.table.symbol': 'Symbol', - 'dashboard.table.type': 'Type', - 'dashboard.table.side': 'Side', - 'dashboard.table.size': 'Size', - 'dashboard.table.entryPrice': 'Entry Price', - 'dashboard.table.price': 'Price', - 'dashboard.table.amount': 'Amount', - 'dashboard.table.profit': 'Profit', - 'dashboard.pendingOrders': 'Order Execution Records', - 'dashboard.totalOrders': 'Total {total} orders', - 'dashboard.viewError': 'View Error', - 'dashboard.filled': 'Filled', - 'dashboard.orderTable.time': 'Created Time', - 'dashboard.orderTable.strategy': 'Strategy', - 'dashboard.orderTable.symbol': 'Symbol', - 'dashboard.orderTable.signalType': 'Signal Type', - 'dashboard.orderTable.amount': 'Amount', - 'dashboard.orderTable.price': 'Filled Price', - 'dashboard.orderTable.status': 'Status', - 'dashboard.orderTable.timeInfo': 'Time', - 'dashboard.orderTable.executedAt': 'Executed Time', - 'dashboard.orderTable.exchange': 'Exchange', - 'dashboard.orderTable.notify': 'Notify', - 'dashboard.orderTable.actions': 'Actions', - 'dashboard.orderTable.delete': 'Delete', - 'dashboard.orderTable.deleteConfirm': 'Delete this record?', - 'dashboard.orderTable.deleteSuccess': 'Deleted', - 'dashboard.orderTable.deleteFailed': 'Delete failed', - 'dashboard.newOrderNotify': 'New Order Alert', - 'dashboard.newOrderDesc': 'New order execution record', - 'dashboard.soundEnabled': 'Sound notification enabled', - 'dashboard.soundDisabled': 'Sound notification disabled', - 'dashboard.clickToMute': 'Click to mute', - 'dashboard.clickToUnmute': 'Click to unmute', - 'dashboard.signalType.openLong': 'Open Long', - 'dashboard.signalType.openShort': 'Open Short', - 'dashboard.signalType.closeLong': 'Close Long', - 'dashboard.signalType.closeShort': 'Close Short', - 'dashboard.signalType.addLong': 'Add Long', - 'dashboard.signalType.addShort': 'Add Short', - 'dashboard.status.pending': 'Pending', - 'dashboard.status.processing': 'Processing', - 'dashboard.status.completed': 'Completed', - 'dashboard.status.failed': 'Failed', - 'dashboard.status.cancelled': 'Cancelled', - 'dashboard.table.pnl': 'Unrealized P&L', - 'form.basic-form.basic.title': 'Basic form', - 'form.basic-form.basic.description': 'Form pages are used to collect or verify information to users, and basic forms are common in scenarios where there are fewer data items.', - 'form.basic-form.title.label': 'Title', - 'form.basic-form.title.placeholder': 'Give the target a name', - 'form.basic-form.title.required': 'Please enter a title', - 'form.basic-form.date.label': 'Start and end date', - 'form.basic-form.placeholder.start': 'Start date', - 'form.basic-form.placeholder.end': 'End date', - 'form.basic-form.date.required': 'Please select the start and end date', - 'form.basic-form.goal.label': 'Goal description', - 'form.basic-form.goal.placeholder': 'Please enter your work goals', - 'form.basic-form.goal.required': 'Please enter a description of the goal', - 'form.basic-form.standard.label': 'Metrics', - 'form.basic-form.standard.placeholder': 'Please enter a metric', - 'form.basic-form.standard.required': 'Please enter a metric', - 'form.basic-form.client.label': 'Client', - 'form.basic-form.label.tooltip': 'Target service object', - 'form.basic-form.client.placeholder': 'Please describe your customer service, internal customers directly @ Name / job number', - 'form.basic-form.client.required': 'Please describe the customers you serve', - 'form.basic-form.invites.label': 'Inviting critics', - 'form.basic-form.invites.placeholder': 'Please direct @ Name / job number, you can invite up to 5 people', - 'form.basic-form.weight.label': 'Weight', - 'form.basic-form.weight.placeholder': 'Please enter weight', - 'form.basic-form.public.label': 'Target disclosure', - 'form.basic-form.label.help': 'Customers and invitees are shared by default', - 'form.basic-form.radio.public': 'Public', - 'form.basic-form.radio.partially-public': 'Partially public', - 'form.basic-form.radio.private': 'Private', - 'form.basic-form.publicUsers.placeholder': 'Open to', - 'form.basic-form.option.A': 'Colleague A', - 'form.basic-form.option.B': 'Colleague B', - 'form.basic-form.option.C': 'Colleague C', - 'form.basic-form.email.required': 'Please enter your email!', - 'form.basic-form.email.wrong-format': 'The email address is in the wrong format!', - 'form.basic-form.userName.required': 'Please enter your userName!', - 'form.basic-form.password.required': 'Please enter your password!', - 'form.basic-form.password.twice': 'The passwords entered twice do not match!', - 'form.basic-form.strength.msg': "Please enter at least 6 characters and don't use passwords that are easy to guess.", - 'form.basic-form.strength.strong': 'Strength: strong', - 'form.basic-form.strength.medium': 'Strength: medium', - 'form.basic-form.strength.short': 'Strength: too short', - 'form.basic-form.confirm-password.required': 'Please confirm your password!', - 'form.basic-form.phone-number.required': 'Please enter your phone number!', - 'form.basic-form.phone-number.wrong-format': 'Malformed phone number!', - 'form.basic-form.verification-code.required': 'Please enter the verification code!', - 'form.basic-form.form.get-captcha': 'Get Captcha', - 'form.basic-form.captcha.second': 'sec', - 'form.basic-form.form.optional': ' (optional) ', - 'form.basic-form.form.submit': 'Submit', - 'form.basic-form.form.save': 'Save', - 'form.basic-form.email.placeholder': 'Email', - 'form.basic-form.password.placeholder': 'Password', - 'form.basic-form.confirm-password.placeholder': 'Confirm password', - 'form.basic-form.phone-number.placeholder': 'Phone number', - 'form.basic-form.verification-code.placeholder': 'Verification code', - 'result.success.title': 'Submission Success', - 'result.success.description': 'The submission results page is used to feed back the results of a series of operational tasks. If it is a simple operation, use the Message global prompt feedback. This text area can show a simple supplementary explanation. If there is a similar requirement for displaying โ€œdocumentsโ€, the following gray area can present more complicated content.', - 'result.success.operate-title': 'Project Name', - 'result.success.operate-id': 'Project ID', - 'result.success.principal': 'Principal', - 'result.success.operate-time': 'Effective time', - 'result.success.step1-title': 'Create project', - 'result.success.step1-operator': 'Qu Lili', - 'result.success.step2-title': 'Departmental preliminary review', - 'result.success.step2-operator': 'Zhou Maomao', - 'result.success.step2-extra': 'Urge', - 'result.success.step3-title': 'Financial review', - 'result.success.step4-title': 'Finish', - 'result.success.btn-return': 'Back List', - 'result.success.btn-project': 'View Project', - 'result.success.btn-print': 'Print', - 'result.fail.error.title': 'Submission Failed', - 'result.fail.error.description': 'Please check and modify the following information before resubmitting.', - 'result.fail.error.hint-title': 'The content you submitted has the following error:', - 'result.fail.error.hint-text1': 'Your account has been frozen', - 'result.fail.error.hint-btn1': 'Thaw immediately', - 'result.fail.error.hint-text2': 'Your account is not yet eligible to apply', - 'result.fail.error.hint-btn2': 'Upgrade immediately', - 'result.fail.error.btn-text': 'Return to modify', - 'account.settings.menuMap.custom': 'Custom Settings', - 'account.settings.menuMap.binding': 'Account Binding', - 'account.settings.basic.avatar': 'Avatar', - 'account.settings.basic.change-avatar': 'Change avatar', - 'account.settings.basic.email': 'Email', - 'account.settings.basic.email-message': 'Please input your email!', - 'account.settings.basic.nickname': 'Nickname', - 'account.settings.basic.nickname-message': 'Please input your Nickname!', - 'account.settings.basic.profile': 'Personal profile', - 'account.settings.basic.profile-message': 'Please input your personal profile!', - 'account.settings.basic.profile-placeholder': 'Brief introduction to yourself', - 'account.settings.basic.country': 'Country/Region', - 'account.settings.basic.country-message': 'Please input your country!', - 'account.settings.basic.geographic': 'Province or city', - 'account.settings.basic.geographic-message': 'Please input your geographic info!', - 'account.settings.basic.address': 'Street Address', - 'account.settings.basic.address-message': 'Please input your address!', - 'account.settings.basic.phone': 'Phone Number', - 'account.settings.basic.phone-message': 'Please input your phone!', - 'account.settings.basic.update': 'Update Information', - 'account.settings.basic.update.success': 'Update basic information successfully', - 'account.settings.security.strong': 'Strong', - 'account.settings.security.medium': 'Medium', - 'account.settings.security.weak': 'Weak', - 'account.settings.security.password': 'Account Password', - 'account.settings.security.password-description': 'Current password strength๏ผš', - 'account.settings.security.phone': 'Security Phone', - 'account.settings.security.phone-description': 'Bound phone๏ผš', - 'account.settings.security.question': 'Security Question', - 'account.settings.security.question-description': 'The security question is not set, and the security policy can effectively protect the account security', - 'account.settings.security.email': 'Bound Email', - 'account.settings.security.email-description': 'Bound Email๏ผš', - 'account.settings.security.mfa': 'MFA Device', - 'account.settings.security.mfa-description': 'Unbound MFA device, after binding, can be confirmed twice', - 'account.settings.security.modify': 'Modify', - 'account.settings.security.set': 'Set', - 'account.settings.security.bind': 'Bind', - 'account.settings.binding.taobao': 'Binding Taobao', - 'account.settings.binding.taobao-description': 'Currently unbound Taobao account', - 'account.settings.binding.alipay': 'Binding Alipay', - 'account.settings.binding.alipay-description': 'Currently unbound Alipay account', - 'account.settings.binding.dingding': 'Binding DingTalk', - 'account.settings.binding.dingding-description': 'Currently unbound DingTalk account', - 'account.settings.binding.bind': 'Bind', - 'account.settings.notification.password': 'Account Password', - 'account.settings.notification.password-description': 'Messages from other users will be notified in the form of a station letter', - 'account.settings.notification.messages': 'System Messages', - 'account.settings.notification.messages-description': 'System messages will be notified in the form of a station letter', - 'account.settings.notification.todo': 'To-do Notification', - 'account.settings.notification.todo-description': 'The to-do list will be notified in the form of a letter from the station', - 'account.settings.settings.open': 'Open', - 'account.settings.settings.close': 'Close', - 'trading-assistant.title': 'Trading Assistant', - 'trading-assistant.strategyList': 'Strategy List', - 'trading-assistant.createStrategy': 'Create Strategy', - 'trading-assistant.noStrategy': 'No strategies', - 'trading-assistant.selectStrategy': 'Please select a strategy from the left to view details', - 'trading-assistant.startStrategy': 'Start Strategy', - 'trading-assistant.stopStrategy': 'Stop Strategy', - 'trading-assistant.editStrategy': 'Edit Strategy', - 'trading-assistant.deleteStrategy': 'Delete Strategy', - 'trading-assistant.startAll': 'Start All', - 'trading-assistant.stopAll': 'Stop All', - 'trading-assistant.deleteAll': 'Delete All', - 'trading-assistant.symbolCount': 'symbols', - 'trading-assistant.strategyCount': 'strategies', - 'trading-assistant.groupBy': 'Group By', - 'trading-assistant.groupByStrategy': 'Strategy', - 'trading-assistant.groupBySymbol': 'Symbol', - 'trading-assistant.timeframe': 'Timeframe', - 'trading-assistant.indicator': 'Indicator', - 'trading-assistant.status.running': 'Running', - 'trading-assistant.status.stopped': 'Stopped', - 'trading-assistant.status.error': 'Error', - 'trading-assistant.strategyType.IndicatorStrategy': 'Indicator Strategy', - 'trading-assistant.strategyType.PromptBasedStrategy': 'Prompt Strategy', - 'trading-assistant.strategyType.GridStrategy': 'Grid Strategy', - 'trading-assistant.tabs.tradingRecords': 'Trading Records', - 'trading-assistant.tabs.positions': 'Positions', - 'trading-assistant.tabs.equityCurve': 'Equity Curve', - 'trading-assistant.form.step1': 'Select Indicator', - 'trading-assistant.form.step2': 'Exchange Configuration', - 'trading-assistant.form.step3': 'Strategy Parameters', - 'trading-assistant.form.step2Params': 'Parameters', - 'trading-assistant.form.step3Signal': 'Signal Delivery', - 'trading-assistant.form.simpleMode': 'Simple', - 'trading-assistant.form.advancedMode': 'Advanced', - 'trading-assistant.form.simpleModeHint': 'Quick setup with recommended defaults', - 'trading-assistant.form.advancedModeHint': 'Customize all parameters for pros', - 'trading-assistant.form.simpleStep1': 'Select Indicator & Pair', - 'trading-assistant.form.simpleStep2': 'Launch Mode', - 'trading-assistant.form.simpleDefaultsHint': 'Defaults (expand to customize)', - 'trading-assistant.form.showAdvancedSettings': 'Show Advanced Settings', - 'trading-assistant.form.hideAdvancedSettings': 'Hide Advanced Settings', - 'trading-assistant.form.marketCategory': 'Market Category', - 'trading-assistant.form.marketCategoryHint': 'Select a market first. Only Crypto can enable live trading; other markets are signal-only.', - 'trading-assistant.market.USStock': 'US Stock', - 'trading-assistant.market.Crypto': 'Crypto', - 'trading-assistant.market.Forex': 'Forex', - 'trading-assistant.form.indicator': 'Select Indicator', - 'trading-assistant.form.indicatorHint': 'You can only select indicators you have purchased or created', - 'trading-assistant.form.qdtCostHints': 'Using strategies will consume QDT, please ensure your account has sufficient QDT balance', - 'trading-assistant.form.indicatorDescription': 'Indicator Description', - 'trading-assistant.form.noDescription': 'No description', - 'trading-assistant.form.indicatorParams': 'Indicator Parameters', - 'trading-assistant.form.indicatorParamsHint': 'These parameters will be passed to the indicator code. Different strategies can use different parameter values.', - 'trading-assistant.form.exchange': 'Select Exchange', - 'trading-assistant.form.apiKey': 'API Key', - 'trading-assistant.form.secretKey': 'Secret Key', - 'trading-assistant.form.passphrase': 'Passphrase', - 'trading-assistant.form.testConnection': 'Test Connection', - 'trading-assistant.form.strategyName': 'Strategy Name', - 'trading-assistant.form.symbol': 'Trading Pair', - 'trading-assistant.form.symbols': 'Trading Pairs (Multi-select)', - 'trading-assistant.form.symbolHint': 'Symbol format depends on the selected market', - 'trading-assistant.form.symbolsHint': 'Select multiple pairs to create strategies for each', - 'trading-assistant.form.strategyType': 'Strategy Type', - 'trading-assistant.form.strategyTypeSingle': 'Single Symbol Strategy', - 'trading-assistant.form.strategyTypeCrossSectional': 'Cross-Sectional Strategy', - 'trading-assistant.form.strategyTypeHint': 'Single Symbol: Trade a single symbol; Cross-Sectional: Manage a portfolio of multiple symbols', - 'trading-assistant.form.symbolList': 'Symbol List', - 'trading-assistant.form.symbolListHint': 'Select multiple symbols, strategy will rank and rebalance based on indicator scores', - 'trading-assistant.form.portfolioSize': 'Portfolio Size', - 'trading-assistant.form.portfolioSizeHint': 'Number of symbols to hold simultaneously', - 'trading-assistant.form.longRatio': 'Long Ratio', - 'trading-assistant.form.longRatioHint': 'Proportion of long positions (0-1), e.g. 0.5 means 50% long, 50% short', - 'trading-assistant.form.rebalanceFrequency': 'Rebalance Frequency', - 'trading-assistant.form.rebalanceDaily': 'Daily', - 'trading-assistant.form.rebalanceWeekly': 'Weekly', - 'trading-assistant.form.rebalanceMonthly': 'Monthly', - 'trading-assistant.form.rebalanceFrequencyHint': 'Frequency of portfolio rebalancing', - 'trading-assistant.form.addSymbol': 'Add Symbol', - 'trading-assistant.form.addSymbolTitle': 'Add Symbol to Watchlist', - 'trading-assistant.form.searchSymbolPlaceholder': 'Search by code, e.g. BTC, AAPL', - 'trading-assistant.form.noSymbolFound': 'No matching symbol found', - 'trading-assistant.form.canDirectAdd': 'You can directly add the code', - 'trading-assistant.form.searchSymbolHint': 'Enter code to search symbols', - 'trading-assistant.form.confirmAdd': 'Confirm Add', - 'trading-assistant.form.addSymbolSuccess': 'Symbol added successfully', - 'trading-assistant.form.addSymbolFailed': 'Failed to add, please try again', - 'trading-assistant.form.pleaseSelectSymbol': 'Please select or enter a symbol', - 'trading-assistant.form.symbolHintCrypto': 'Crypto: use trading pairs like BTC/USDT', - 'trading-assistant.form.symbolHintGeneral': 'Enter the symbol for the selected market (e.g. 600519, AAPL, EURUSD).', - 'trading-assistant.form.initialCapital': 'Initial Capital', - 'trading-assistant.form.marketType': 'Market Type', - 'trading-assistant.form.marketTypeFutures': 'Futures', - 'trading-assistant.form.marketTypeSpot': 'Spot', - 'trading-assistant.form.marketTypeHint': 'Futures support bidirectional trading and leverage, spot only supports long positions with fixed 1x leverage', - 'trading-assistant.form.leverage': 'Leverage', - 'trading-assistant.form.leverageHint': 'Futures: 1-125x, Spot: Fixed 1x', - 'trading-assistant.form.spotLeverageFixed': 'Spot trading leverage is fixed at 1x', - 'trading-assistant.form.spotOnlyLongHint': 'Spot trading only supports long positions', - 'trading-assistant.form.tradeDirection': 'Trade Direction', - 'trading-assistant.form.tradeDirectionLong': 'Long Only', - 'trading-assistant.form.tradeDirectionShort': 'Short Only', - 'trading-assistant.form.tradeDirectionBoth': 'Both', - 'trading-assistant.form.timeframe': 'Timeframe', - 'trading-assistant.form.klinePeriod': 'K-Line Period', - 'trading-assistant.form.timeframe1m': '1 Minute', - 'trading-assistant.form.timeframe5m': '5 Minutes', - 'trading-assistant.form.timeframe15m': '15 Minutes', - 'trading-assistant.form.timeframe30m': '30 Minutes', - 'trading-assistant.form.timeframe1H': '1 Hour', - 'trading-assistant.form.timeframe4H': '4 Hours', - 'trading-assistant.form.timeframe1D': '1 Day', - 'trading-assistant.form.selectStrategyType': 'Select Strategy Type', - 'trading-assistant.form.indicatorStrategy': 'Indicator Strategy', - 'trading-assistant.form.indicatorStrategyDesc': 'Automated trading strategy based on technical indicators', - 'trading-assistant.form.aiStrategy': 'AI Strategy', - 'trading-assistant.form.aiStrategyDesc': 'Automated trading strategy based on AI intelligent decision-making', - 'trading-assistant.form.enableAiFilter': 'Enable AI Intelligent Decision Filter', - 'trading-assistant.form.enableAiFilterHint': 'When enabled, indicator signals will be filtered by AI to improve trading quality', - 'trading-assistant.form.aiFilterPrompt': 'Custom Prompt', - 'trading-assistant.form.aiFilterPromptHint': 'Provide custom instructions for AI filtering, leave blank to use system default', - 'trading-assistant.validation.strategyTypeRequired': 'Please select a strategy type', - 'trading-assistant.validation.marketCategoryRequired': 'Please select a market category', - 'trading-assistant.form.advancedSettings': 'Advanced Settings', - 'trading-assistant.form.orderMode': 'Order Mode', - 'trading-assistant.form.orderModeMaker': 'Maker (Limit)', - 'trading-assistant.form.orderModeTaker': 'Taker (Market)', - 'trading-assistant.form.orderModeHint': 'Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees', - 'trading-assistant.form.makerWaitSec': 'Maker Wait Time (seconds)', - 'trading-assistant.form.makerWaitSecHint': 'Time to wait for order fill before canceling and retrying', - 'trading-assistant.form.makerRetries': 'Maker Retries', - 'trading-assistant.form.makerRetriesHint': 'Maximum number of retries when maker order is not filled', - 'trading-assistant.form.fallbackToMarket': 'Fallback to Market on failure', - 'trading-assistant.form.fallbackToMarketHint': 'If limit order (open/close) is not filled, downgrade to market order to ensure execution', - 'trading-assistant.form.marginMode': 'Margin Mode', - 'trading-assistant.form.marginModeCross': 'Cross Margin', - 'trading-assistant.form.marginModeIsolated': 'Isolated Margin', - 'trading-assistant.form.stopLossPct': 'Stop Loss (%)', - 'trading-assistant.form.stopLossPctHint': 'Set stop loss percentage, 0 means disabled', - 'trading-assistant.form.takeProfitPct': 'Take Profit (%)', - 'trading-assistant.form.takeProfitPctHint': 'Set take profit percentage, 0 means disabled', - 'trading-assistant.form.commission': 'Commission (%)', - 'trading-assistant.form.commissionHint': 'Trading fee percentage (optional)', - 'trading-assistant.form.slippage': 'Slippage (%)', - 'trading-assistant.form.slippageHint': 'Estimated slippage percentage (optional)', - 'trading-assistant.form.executionMode': 'Execution', - 'trading-assistant.form.executionModeSignal': 'Signal only (push notifications)', - 'trading-assistant.form.executionModeLive': 'Live trading', - 'trading-assistant.form.liveTradingCryptoOnlyHint': 'Live trading is available for Crypto only. Other markets can only push signals.', - 'trading-assistant.form.liveTradingNotSupportedHint': 'Live trading is not available for this market', - 'trading-assistant.form.broker': 'Broker', - 'trading-assistant.form.localDeploymentRequired': 'โš ๏ธ Local Deployment Required', - 'trading-assistant.form.localDeploymentHint': 'IBKR and MT5 are external trading interfaces that require local deployment of QuantDinger. Cloud SaaS mode is not supported. Please ensure you have installed and configured the trading software (TWS/IB Gateway or MT5 terminal) on your local machine.', - 'trading-assistant.form.ibkrConnectionTitle': 'Interactive Brokers Connection', - 'trading-assistant.form.ibkrConnectionHint': 'Make sure TWS or IB Gateway is running with API enabled', - 'trading-assistant.validation.brokerRequired': 'Please select a broker', - 'trading-assistant.placeholders.selectBroker': 'Select broker', - 'trading-assistant.brokerNames': { - 'ibkr': 'Interactive Brokers (IBKR)', - 'mt5': 'MetaTrader 5 (MT5)', - 'mt4': 'MetaTrader 4 (MT4)', - 'futu': 'Futu Securities', - 'tiger': 'Tiger Brokers', - 'td': 'TD Ameritrade', - 'schwab': 'Charles Schwab' - }, - 'trading-assistant.form.ibkrHost': 'Host', - 'trading-assistant.form.ibkrPort': 'Port', - 'trading-assistant.form.ibkrPortHint': 'TWS Live:7497, TWS Paper:7496, Gateway Live:4001, Gateway Paper:4002', - 'trading-assistant.form.ibkrClientId': 'Client ID', - 'trading-assistant.form.ibkrAccount': 'Account', - 'trading-assistant.form.ibkrAccountHint': 'Leave empty to auto-select first account. Specify for multi-account users.', - 'trading-assistant.placeholders.ibkrAccount': 'Optional, e.g. U1234567', - 'trading-assistant.exchange.ibkrConnectionSuccess': 'IBKR connected successfully', - 'trading-assistant.exchange.ibkrConnectionFailed': 'IBKR connection failed. Please check if TWS/Gateway is running.', - 'trading-assistant.exchange.checkLocalDeployment': 'Please ensure you are running locally. Cloud SaaS does not support external trading interfaces.', - // MT5/Forex configuration - 'trading-assistant.form.forexBroker': 'Forex Broker', - 'trading-assistant.form.mt5ConnectionTitle': 'MetaTrader 5 Connection', - 'trading-assistant.form.mt5ConnectionHint': 'Make sure MT5 terminal is running and logged in (Windows only)', - 'trading-assistant.form.mt5Server': 'Server', - 'trading-assistant.form.mt5ServerHint': 'Broker server name (e.g., ICMarkets-Demo)', - 'trading-assistant.form.mt5Login': 'Account Number', - 'trading-assistant.form.mt5Password': 'Password', - 'trading-assistant.form.mt5TerminalPath': 'MT5 Terminal Path (Optional)', - 'trading-assistant.form.mt5TerminalPathHint': 'If MT5 terminal is not installed in the default location, specify the full path to terminal64.exe (e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe)', - 'trading-assistant.placeholders.mt5Server': 'e.g., ICMarkets-Demo', - 'trading-assistant.placeholders.mt5Login': 'e.g., 12345678', - 'trading-assistant.placeholders.mt5Password': 'Your MT5 password', - 'trading-assistant.placeholders.mt5TerminalPath': 'e.g., C:\\Program Files\\MetaTrader 5\\terminal64.exe', - 'trading-assistant.validation.mt5ServerRequired': 'Please enter MT5 server', - 'trading-assistant.validation.mt5LoginRequired': 'Please enter MT5 account number', - 'trading-assistant.validation.mt5PasswordRequired': 'Please enter MT5 password', - 'trading-assistant.validation.portfolioSizeRequired': 'Please enter portfolio size', - 'trading-assistant.validation.longRatioRequired': 'Please enter long ratio', - 'trading-assistant.exchange.mt5ConnectionSuccess': 'MT5 connected successfully', - 'trading-assistant.exchange.mt5ConnectionFailed': 'MT5 connection failed. Please check if terminal is running.', - 'trading-assistant.form.notifyChannels': 'Notification Channels', - 'trading-assistant.form.notifyChannelsHint': 'Choose how you want to receive buy/sell and risk-management signals.', - 'trading-assistant.notify.browser': 'Browser', - 'trading-assistant.notify.email': 'Email', - 'trading-assistant.notify.phone': 'Phone', - 'trading-assistant.notify.telegram': 'Telegram', - 'trading-assistant.notify.discord': 'Discord', - 'trading-assistant.notify.webhook': 'Webhook', - 'trading-assistant.form.notifyEmail': 'Email', - 'trading-assistant.form.notifyPhone': 'Phone number', - 'trading-assistant.form.notifyTelegram': 'Telegram (chat id / username)', - 'trading-assistant.form.notifyDiscord': 'Discord (webhook url)', - 'trading-assistant.form.notifyWebhook': 'Webhook URL', - 'trading-assistant.form.liveTradingConfigTitle': 'Exchange Credentials', - 'trading-assistant.form.liveTradingConfigHint': 'Provide your exchange API credentials. You can test the connection before saving.', - 'trading-assistant.form.savedCredential': 'Saved credential', - 'trading-assistant.form.savedCredentialHint': 'Select a saved credential to auto-fill API keys (optional).', - 'trading-assistant.form.saveCredential': 'Save this credential for future use', - 'trading-assistant.form.credentialName': 'Credential name (optional)', - 'trading-assistant.form.signalMode': 'Signal Mode', - 'trading-assistant.form.signalModeConfirmed': 'Confirmed', - 'trading-assistant.form.signalModeAggressive': 'Aggressive', - 'trading-assistant.form.signalModeHint': 'Confirmed: only check completed candles; Aggressive: also check forming candles', - 'trading-assistant.form.cancel': 'Cancel', - 'trading-assistant.form.prev': 'Previous', - 'trading-assistant.form.next': 'Next', - 'trading-assistant.form.confirmCreate': 'Confirm Create', - 'trading-assistant.form.confirmEdit': 'Confirm Edit', - 'trading-assistant.messages.createSuccess': 'Strategy created successfully', - 'trading-assistant.messages.createFailed': 'Failed to create strategy', - 'trading-assistant.messages.updateSuccess': 'Strategy updated successfully', - 'trading-assistant.messages.updateFailed': 'Failed to update strategy', - 'trading-assistant.messages.deleteSuccess': 'Strategy deleted successfully', - 'trading-assistant.messages.deleteFailed': 'Failed to delete strategy', - 'trading-assistant.messages.startSuccess': 'Strategy started successfully', - 'trading-assistant.messages.startFailed': 'Failed to start strategy', - 'trading-assistant.messages.stopSuccess': 'Strategy stopped successfully', - 'trading-assistant.messages.stopFailed': 'Failed to stop strategy', - 'trading-assistant.messages.loadFailed': 'Failed to load strategy list', - 'trading-assistant.messages.runningWarning': 'Strategy is running, please stop it before editing', - 'trading-assistant.messages.deleteConfirmWithName': 'Are you sure you want to delete strategy "{name}"? This action cannot be undone.', - 'trading-assistant.messages.deleteConfirm': 'Are you sure you want to delete this strategy? This action cannot be undone.', - 'trading-assistant.messages.loadTradesFailed': 'Failed to load trading records', - 'trading-assistant.messages.loadPositionsFailed': 'Failed to load position records', - 'trading-assistant.messages.loadEquityFailed': 'Failed to load equity curve', - 'trading-assistant.messages.loadIndicatorsFailed': 'Failed to load indicator list, please try again later', - 'trading-assistant.messages.spotLimitations': 'Spot trading has been automatically set to long only with 1x leverage', - 'trading-assistant.messages.autoFillApiConfig': 'Auto-filled API configuration for this exchange from history', - 'trading-assistant.messages.batchCreateSuccess': 'Successfully created {count} strategies', - 'trading-assistant.messages.batchStartSuccess': 'Successfully started {count} strategies', - 'trading-assistant.messages.batchStartFailed': 'Failed to start strategies', - 'trading-assistant.messages.batchStopSuccess': 'Successfully stopped {count} strategies', - 'trading-assistant.messages.batchStopFailed': 'Failed to stop strategies', - 'trading-assistant.messages.batchDeleteSuccess': 'Successfully deleted {count} strategies', - 'trading-assistant.messages.batchDeleteFailed': 'Failed to delete strategies', - 'trading-assistant.messages.batchDeleteConfirm': 'Are you sure you want to delete {count} strategies in group "{name}"? This action cannot be undone.', - 'trading-assistant.placeholders.selectIndicator': 'Please select an indicator', - 'trading-assistant.placeholders.selectExchange': 'Please select an exchange', - 'trading-assistant.placeholders.selectMarketCategory': 'Please select market category', - 'trading-assistant.placeholders.inputApiKey': 'Please enter API Key', - 'trading-assistant.placeholders.inputSecretKey': 'Please enter Secret Key', - 'trading-assistant.placeholders.inputPassphrase': 'Please enter Passphrase', - 'trading-assistant.placeholders.inputStrategyName': 'Please enter strategy name', - 'trading-assistant.placeholders.selectSymbol': 'Please select trading pair', - 'trading-assistant.placeholders.selectSymbols': 'Please select trading pairs (multi-select)', - 'trading-assistant.placeholders.inputSymbol': 'Please enter symbol', - 'trading-assistant.placeholders.selectTimeframe': 'Please select timeframe', - 'trading-assistant.placeholders.selectKlinePeriod': 'Please select K-line period', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'Please enter custom prompt (optional)', - 'trading-assistant.placeholders.inputEmail': 'Please enter email', - 'trading-assistant.placeholders.inputPhone': 'Please enter phone number', - 'trading-assistant.placeholders.inputTelegram': 'Please enter Telegram chat id / username', - 'trading-assistant.placeholders.inputDiscord': 'Please enter Discord webhook url', - 'trading-assistant.placeholders.inputWebhook': 'Please enter webhook url', - 'trading-assistant.placeholders.selectSavedCredential': 'Select saved credential', - 'trading-assistant.placeholders.inputCredentialName': 'For example: Binance main key', - 'trading-assistant.validation.indicatorRequired': 'Please select an indicator', - 'trading-assistant.validation.exchangeRequired': 'Please select an exchange', - 'trading-assistant.validation.apiKeyRequired': 'Please enter API Key', - 'trading-assistant.validation.secretKeyRequired': 'Please enter Secret Key', - 'trading-assistant.validation.passphraseRequired': 'Please enter Passphrase', - 'trading-assistant.validation.exchangeConfigIncomplete': 'Please fill in complete exchange configuration information', - 'trading-assistant.validation.testConnectionRequired': 'Please click "Test Connection" button and ensure the connection is successful', - 'trading-assistant.validation.testConnectionFailed': 'Connection test failed, please check the configuration and test again', - 'trading-assistant.validation.strategyNameRequired': 'Please enter strategy name', - 'trading-assistant.validation.symbolRequired': 'Please select trading pair', - 'trading-assistant.validation.symbolsRequired': 'Please select at least one trading pair', - 'trading-assistant.validation.initialCapitalRequired': 'Please enter initial capital', - 'trading-assistant.validation.leverageRequired': 'Please enter leverage', - 'trading-assistant.validation.emailInvalid': 'Invalid email address', - 'trading-assistant.validation.notifyChannelRequired': 'Please select at least one notification channel', - 'trading-assistant.table.time': 'Time', - 'trading-assistant.table.type': 'Type', - 'trading-assistant.table.price': 'Price', - 'trading-assistant.table.amount': 'Amount', - 'trading-assistant.table.value': 'Value', - 'trading-assistant.table.commission': 'Commission', - 'trading-assistant.table.symbol': 'Trading Pair', - 'trading-assistant.table.side': 'Side', - 'trading-assistant.table.size': 'Position Size', - 'trading-assistant.table.entryPrice': 'Entry Price', - 'trading-assistant.table.currentPrice': 'Current Price', - 'trading-assistant.table.unrealizedPnl': 'Unrealized P&L', - 'trading-assistant.table.pnlPercent': 'P&L %', - 'trading-assistant.table.buy': 'Buy', - 'trading-assistant.table.sell': 'Sell', - 'trading-assistant.table.long': 'Long', - 'trading-assistant.table.short': 'Short', - 'trading-assistant.table.noPositions': 'No positions', - 'trading-assistant.detail.title': 'Strategy Details', - 'trading-assistant.detail.strategyName': 'Strategy Name', - 'trading-assistant.detail.strategyType': 'Strategy Type', - 'trading-assistant.detail.status': 'Status', - 'trading-assistant.detail.tradingMode': 'Trading Mode', - 'trading-assistant.detail.exchange': 'Exchange', - 'trading-assistant.detail.initialCapital': 'Initial Capital', - 'trading-assistant.detail.totalInvestment': 'Total Investment', - 'trading-assistant.detail.currentEquity': 'Current Equity', - 'trading-assistant.detail.totalPnl': 'Total P&L', - 'trading-assistant.detail.indicatorName': 'Indicator Name', - 'trading-assistant.detail.maxLeverage': 'Max Leverage', - 'trading-assistant.detail.decideInterval': 'Decision Interval', - 'trading-assistant.detail.symbols': 'Trading Symbols', - 'trading-assistant.detail.createdAt': 'Created At', - 'trading-assistant.detail.updatedAt': 'Updated At', - 'trading-assistant.detail.llmConfig': 'AI Model Configuration', - 'trading-assistant.detail.exchangeConfig': 'Exchange Configuration', - 'trading-assistant.detail.provider': 'Provider', - 'trading-assistant.detail.modelId': 'Model ID', - 'trading-assistant.detail.close': 'Close', - 'trading-assistant.detail.loadFailed': 'Failed to load strategy details', - 'trading-assistant.equity.noData': 'No equity data', - 'trading-assistant.equity.equity': 'Equity', - 'trading-assistant.exchange.tradingMode': 'Trading Mode', - 'trading-assistant.exchange.virtual': 'Virtual Trading', - 'trading-assistant.exchange.live': 'Live Trading', - 'trading-assistant.exchange.selectExchange': 'Select Exchange', - 'trading-assistant.exchange.walletAddress': 'Wallet Address', - 'trading-assistant.exchange.walletAddressPlaceholder': 'Please enter wallet address (starts with 0x)', - 'trading-assistant.exchange.privateKey': 'Private Key', - 'trading-assistant.exchange.privateKeyPlaceholder': 'Please enter private key (64 characters)', - 'trading-assistant.exchange.testConnection': 'Test Connection', - 'trading-assistant.exchange.connectionSuccess': 'Connection successful', - 'trading-assistant.exchange.connectionFailed': 'Connection failed', - 'trading-assistant.exchange.testFailed': 'Connection test failed', - 'trading-assistant.exchange.fillComplete': 'Please fill in complete exchange configuration information', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'trading-assistant.strategyTypeOptions.ai': 'AI-Driven Strategy', - 'trading-assistant.strategyTypeOptions.indicator': 'Indicator Strategy', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI-Driven Strategy feature is under development, stay tuned', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI-Driven Strategy feature is under development', - 'trading-assistant.indicatorType.trend': 'Trend', - 'trading-assistant.indicatorType.momentum': 'Momentum', - 'trading-assistant.indicatorType.volatility': 'Volatility', - 'trading-assistant.indicatorType.volume': 'Volume', - 'trading-assistant.indicatorType.custom': 'Custom', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'Binance', - 'hyperliquid': 'Hyperliquid', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Gate.io', - 'mexc': 'MEXC', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': 'Huobi', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Deribit', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Bitstamp', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Gemini', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Upbit', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBank', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX US', - 'binanceus': 'Binance US', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDโ“ˆ-M', - 'ibkr': 'Interactive Brokers (IBKR)', - 'deepcoin': 'Deepcoin' - }, - 'ai-trading-assistant.title': 'AI Trading Assistant', - 'ai-trading-assistant.strategyList': 'Strategy List', - 'ai-trading-assistant.createStrategy': 'Create Strategy', - 'ai-trading-assistant.noStrategy': 'No strategies', - 'ai-trading-assistant.selectStrategy': 'Please select a strategy from the left to view details', - 'ai-trading-assistant.startStrategy': 'Start Strategy', - 'ai-trading-assistant.stopStrategy': 'Stop Strategy', - 'ai-trading-assistant.editStrategy': 'Edit Strategy', - 'ai-trading-assistant.deleteStrategy': 'Delete Strategy', - 'ai-trading-assistant.status.running': 'Running', - 'ai-trading-assistant.status.stopped': 'Stopped', - 'ai-trading-assistant.status.error': 'Error', - 'ai-trading-assistant.tabs.tradingRecords': 'Trading Records', - 'ai-trading-assistant.tabs.positions': 'Positions', - 'ai-trading-assistant.tabs.aiDecisions': 'AI Decisions', - 'ai-trading-assistant.tabs.equityCurve': 'Equity Curve', - 'ai-trading-assistant.form.createTitle': 'Create AI Trading Strategy', - 'ai-trading-assistant.form.editTitle': 'Edit AI Trading Strategy', - 'ai-trading-assistant.form.strategyName': 'Strategy Name', - 'ai-trading-assistant.form.modelId': 'AI Model', - 'ai-trading-assistant.form.modelIdHint': 'Using system OpenRouter service, no API Key configuration needed', - 'ai-trading-assistant.form.decideInterval': 'Decision Interval', - 'ai-trading-assistant.form.decideInterval5m': '5 Minutes', - 'ai-trading-assistant.form.decideInterval10m': '10 Minutes', - 'ai-trading-assistant.form.decideInterval30m': '30 Minutes', - 'ai-trading-assistant.form.decideInterval1h': '1 Hour', - 'ai-trading-assistant.form.decideInterval4h': '4 Hours', - 'ai-trading-assistant.form.decideInterval1d': '1 Day', - 'ai-trading-assistant.form.decideInterval1w': '1 Week', - 'ai-trading-assistant.form.decideIntervalHint': 'Time interval for AI decision making', - 'ai-trading-assistant.form.runPeriod': 'Run Period', - 'ai-trading-assistant.form.runPeriodHint': 'Start and end time for strategy execution', - 'ai-trading-assistant.form.startDate': 'Start Date', - 'ai-trading-assistant.form.endDate': 'End Date', - 'ai-trading-assistant.form.qdtCostTitle': 'QDT Cost Notice', - 'ai-trading-assistant.form.qdtCostHint': 'Each AI decision will cost {cost} QDT. Please ensure your account has sufficient QDT balance. During strategy execution, each decision will be charged in real-time.', - 'ai-trading-assistant.form.apiKey': 'API Key', - 'ai-trading-assistant.form.exchange': 'Select Exchange', - 'ai-trading-assistant.form.secretKey': 'Secret Key', - 'ai-trading-assistant.form.passphrase': 'Passphrase', - 'ai-trading-assistant.form.testConnection': 'Test Connection', - 'ai-trading-assistant.form.symbol': 'Trading Pair', - 'ai-trading-assistant.form.symbolHint': 'Select the trading pair to trade', - 'ai-trading-assistant.form.initialCapital': 'Initial Capital (Margin)', - 'ai-trading-assistant.form.leverage': 'Leverage', - 'ai-trading-assistant.form.timeframe': 'Timeframe', - 'ai-trading-assistant.form.timeframe1m': '1 Minute', - 'ai-trading-assistant.form.timeframe5m': '5 Minutes', - 'ai-trading-assistant.form.timeframe15m': '15 Minutes', - 'ai-trading-assistant.form.timeframe30m': '30 Minutes', - 'ai-trading-assistant.form.timeframe1H': '1 Hour', - 'ai-trading-assistant.form.timeframe4H': '4 Hours', - 'ai-trading-assistant.form.timeframe1D': '1 Day', - 'ai-trading-assistant.form.marketType': 'Market Type', - 'ai-trading-assistant.form.marketTypeFutures': 'Futures', - 'ai-trading-assistant.form.marketTypeSpot': 'Spot', - 'ai-trading-assistant.form.totalPnl': 'Total PnL', - 'ai-trading-assistant.form.customPrompt': 'Custom Prompt', - 'ai-trading-assistant.form.customPromptHint': 'Optional, used to customize AI trading strategy and decision logic', - 'ai-trading-assistant.form.cancel': 'Cancel', - 'ai-trading-assistant.form.prev': 'Previous', - 'ai-trading-assistant.form.next': 'Next', - 'ai-trading-assistant.form.confirmCreate': 'Confirm Create', - 'ai-trading-assistant.form.confirmEdit': 'Confirm Edit', - 'ai-trading-assistant.messages.createSuccess': 'Strategy created successfully', - 'ai-trading-assistant.messages.createFailed': 'Failed to create strategy', - 'ai-trading-assistant.messages.updateSuccess': 'Strategy updated successfully', - 'ai-trading-assistant.messages.updateFailed': 'Failed to update strategy', - 'ai-trading-assistant.messages.deleteSuccess': 'Strategy deleted successfully', - 'ai-trading-assistant.messages.deleteFailed': 'Failed to delete strategy', - 'ai-trading-assistant.messages.startSuccess': 'Strategy started successfully', - 'ai-trading-assistant.messages.startFailed': 'Failed to start strategy', - 'ai-trading-assistant.messages.stopSuccess': 'Strategy stopped successfully', - 'ai-trading-assistant.messages.stopFailed': 'Failed to stop strategy', - 'ai-trading-assistant.messages.loadFailed': 'Failed to load strategy list', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'Failed to load AI decision records', - 'ai-trading-assistant.messages.deleteConfirm': 'Are you sure you want to delete this strategy? This action cannot be undone.', - 'ai-trading-assistant.placeholders.inputStrategyName': 'Please enter strategy name', - 'ai-trading-assistant.placeholders.selectModelId': 'Please select AI model', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'Please select decision interval', - 'ai-trading-assistant.placeholders.startTime': 'Start Time', - 'ai-trading-assistant.placeholders.endTime': 'End Time', - 'ai-trading-assistant.placeholders.inputApiKey': 'Please enter API Key', - 'ai-trading-assistant.placeholders.selectExchange': 'Please select an exchange', - 'ai-trading-assistant.placeholders.inputSecretKey': 'Please enter Secret Key', - 'ai-trading-assistant.placeholders.inputPassphrase': 'Please enter Passphrase', - 'ai-trading-assistant.placeholders.selectSymbol': 'Please select trading pair, e.g.: BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'Please select timeframe', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'Please enter custom prompt (optional)', - 'ai-trading-assistant.validation.strategyNameRequired': 'Please enter strategy name', - 'ai-trading-assistant.validation.modelIdRequired': 'Please select AI model', - 'ai-trading-assistant.validation.runPeriodRequired': 'Please select run period', - 'ai-trading-assistant.validation.apiKeyRequired': 'Please enter API Key', - 'ai-trading-assistant.validation.exchangeRequired': 'Please select an exchange', - 'ai-trading-assistant.validation.secretKeyRequired': 'Please enter Secret Key', - 'ai-trading-assistant.validation.symbolRequired': 'Please select trading pair', - 'ai-trading-assistant.validation.initialCapitalRequired': 'Please enter initial capital', - 'ai-trading-assistant.table.time': 'Time', - 'ai-trading-assistant.table.type': 'Type', - 'ai-trading-assistant.table.price': 'Price', - 'ai-trading-assistant.table.amount': 'Amount', - 'ai-trading-assistant.table.value': 'Value', - 'ai-trading-assistant.table.symbol': 'Trading Pair', - 'ai-trading-assistant.table.side': 'Side', - 'ai-trading-assistant.table.size': 'Position Size', - 'ai-trading-assistant.table.entryPrice': 'Entry Price', - 'ai-trading-assistant.table.currentPrice': 'Current Price', - 'ai-trading-assistant.table.unrealizedPnl': 'Unrealized P&L', - 'ai-trading-assistant.table.profit': 'Profit', - 'ai-trading-assistant.table.openLong': 'Open Long', - 'ai-trading-assistant.table.closeLong': 'Close Long', - 'ai-trading-assistant.table.openShort': 'Open Short', - 'ai-trading-assistant.table.closeShort': 'Close Short', - 'ai-trading-assistant.table.addLong': 'Add Long', - 'ai-trading-assistant.table.addShort': 'Add Short', - 'ai-trading-assistant.table.closeShortProfit': 'Close Short (TP)', - 'ai-trading-assistant.table.closeShortStop': 'Close Short (SL)', - 'ai-trading-assistant.table.closeLongProfit': 'Close Long (TP)', - 'ai-trading-assistant.table.closeLongStop': 'Close Long (SL)', - 'ai-trading-assistant.table.buy': 'Buy', - 'ai-trading-assistant.table.sell': 'Sell', - 'ai-trading-assistant.table.long': 'Long', - 'ai-trading-assistant.table.short': 'Short', - 'ai-trading-assistant.table.hold': 'Hold', - 'ai-trading-assistant.table.reasoning': 'Analysis Reasoning', - 'ai-trading-assistant.table.decisions': 'Decisions', - 'ai-trading-assistant.table.riskAssessment': 'Risk', - 'ai-trading-assistant.table.confidence': 'Confidence', - 'ai-trading-assistant.table.totalRecords': 'Total {total} records', - 'ai-trading-assistant.table.noPositions': 'No positions', - 'ai-trading-assistant.detail.title': 'Strategy Details', - 'ai-trading-assistant.equity.noData': 'No equity data', - 'ai-trading-assistant.equity.equity': 'Equity', - 'ai-trading-assistant.exchange.testFailed': 'Connection test failed', - 'ai-trading-assistant.exchange.connectionSuccess': 'Connection successful', - 'ai-trading-assistant.exchange.connectionFailed': 'Connection failed', - 'ai-trading-assistant.form.advancedSettings': 'Advanced Settings', - 'ai-trading-assistant.form.orderMode': 'Order Mode', - 'ai-trading-assistant.form.orderModeMaker': 'Maker (Limit)', - 'ai-trading-assistant.form.orderModeTaker': 'Taker (Market)', - 'ai-trading-assistant.form.orderModeHint': 'Maker mode uses limit orders with lower fees; Taker mode executes immediately with higher fees', - 'ai-trading-assistant.form.makerWaitSec': 'Maker Wait Time (seconds)', - 'ai-trading-assistant.form.makerWaitSecHint': 'Time to wait for order fill before canceling and retrying', - 'ai-trading-assistant.form.makerRetries': 'Maker Retries', - 'ai-trading-assistant.form.makerRetriesHint': 'Maximum number of retries when maker order is not filled', - 'ai-trading-assistant.form.fallbackToMarket': 'Fallback to Market on failure', - 'ai-trading-assistant.form.fallbackToMarketHint': 'If limit order (open/close) is not filled, downgrade to market order to ensure execution', - 'ai-trading-assistant.form.marginMode': 'Margin Mode', - 'ai-trading-assistant.form.marginModeCross': 'Cross Margin', - 'ai-trading-assistant.form.marginModeIsolated': 'Isolated Margin', - 'ai-analysis.title': 'Quantum Trading Engine', - 'ai-analysis.system.online': 'ONLINE', - 'ai-analysis.system.agents': 'AGENTS', - 'ai-analysis.system.active': 'ACTIVE', - 'ai-analysis.system.stage': 'STAGE', - 'ai-analysis.panel.roster': 'AGENTS ROSTER', - 'ai-analysis.panel.thinking': 'Thinking...', - 'ai-analysis.panel.done': 'Done', - 'ai-analysis.panel.standby': 'Standby', - 'ai-analysis.input.title': 'QUANTUM TRADING ENGINE', - 'ai-analysis.input.placeholder': 'SELECT TARGET ASSET (e.g. BTC/USDT)', - 'ai-analysis.input.watchlist': 'Watchlist', - 'ai-analysis.input.start': 'START ANALYSIS', - 'ai-analysis.input.recent': 'RECENT MISSIONS:', - 'ai-analysis.vis.stage': 'STAGE', - 'ai-analysis.vis.processing': 'PROCESSING', - 'ai-analysis.result.complete': 'ANALYSIS COMPLETE', - 'ai-analysis.result.signal': 'FINAL SIGNAL', - 'ai-analysis.result.confidence': 'CONFIDENCE:', - 'ai-analysis.result.new': 'NEW ANALYSIS', - 'ai-analysis.result.full': 'VIEW FULL DOSSIER', - 'ai-analysis.logs.title': 'SYSTEM LOGS', - 'ai-analysis.modal.title': 'CLASSIFIED REPORT', - 'ai-analysis.modal.fundamental': 'FUNDAMENTAL ANALYSIS', - 'ai-analysis.modal.technical': 'TECHNICAL ANALYSIS', - 'ai-analysis.modal.sentiment': 'SENTIMENT ANALYSIS', - 'ai-analysis.modal.risk': 'RISK ASSESSMENT', - 'ai-analysis.stage.idle': 'IDLE', - 'ai-analysis.stage.1': 'PHASE 1: MULTI-DIMENSIONAL ANALYSIS', - 'ai-analysis.stage.2': 'PHASE 2: BULL/BEAR DEBATE', - 'ai-analysis.stage.3': 'PHASE 3: STRATEGIC PLANNING', - 'ai-analysis.stage.4': 'PHASE 4: RISK COMMITTEE REVIEW', - 'ai-analysis.stage.complete': 'COMPLETE', - 'ai-analysis.agent.investment_director': 'Investment Director', - 'ai-analysis.agent.role.investment_director': 'Comprehensive Analysis & Final Conclusion', - 'ai-analysis.agent.market': 'Market Analyst', - 'ai-analysis.agent.role.market': 'Technical & Market Data', - 'ai-analysis.agent.fundamental': 'Fundamental Analyst', - 'ai-analysis.agent.role.fundamental': 'Financials & Valuation', - 'ai-analysis.agent.technical': 'Technical Analyst', - 'ai-analysis.agent.role.technical': 'Technical Indicators & Charts', - 'ai-analysis.agent.news': 'News Analyst', - 'ai-analysis.agent.role.news': 'Global News Filter', - 'ai-analysis.agent.sentiment': 'Sentiment Analyst', - 'ai-analysis.agent.role.sentiment': 'Social & Emotional', - 'ai-analysis.agent.risk': 'Risk Analyst', - 'ai-analysis.agent.role.risk': 'Basic Risk Check', - 'ai-analysis.agent.bull': 'Bull Researcher', - 'ai-analysis.agent.role.bull': 'Growth Catalyst Hunter', - 'ai-analysis.agent.bear': 'Bear Researcher', - 'ai-analysis.agent.role.bear': 'Risk & Flaw Hunter', - 'ai-analysis.agent.manager': 'Research Manager', - 'ai-analysis.agent.role.manager': 'Debate Moderator', - 'ai-analysis.agent.trader': 'Trader Agent', - 'ai-analysis.agent.role.trader': 'Execution Strategist', - 'ai-analysis.agent.risky': 'Risky Analyst', - 'ai-analysis.agent.role.risky': 'Aggressive Strategy', - 'ai-analysis.agent.neutral': 'Neutral Analyst', - 'ai-analysis.agent.role.neutral': 'Balanced Strategy', - 'ai-analysis.agent.safe': 'Safe Analyst', - 'ai-analysis.agent.role.safe': 'Conservative Strategy', - 'ai-analysis.agent.cro': 'Risk Manager (CRO)', - 'ai-analysis.agent.role.cro': 'Final Decision Authority', - 'ai-analysis.script.market': 'Fetching OHLCV data from major exchanges...', - 'ai-analysis.script.fundamental': 'Retrieving quarterly financial reports...', - 'ai-analysis.script.technical': 'Analyzing technical indicators and chart patterns...', - 'ai-analysis.script.news': 'Scanning global financial news feeds...', - 'ai-analysis.script.sentiment': 'Analyzing social media trends...', - 'ai-analysis.script.risk': 'Calculating historical volatility...', - 'invite.inviteLink': 'Invite Link', - 'invite.copy': 'Copy Link', - 'invite.copySuccess': 'Copied successfully!', - 'invite.copyFailed': 'Copy failed, please copy manually', - 'invite.noInviteLink': 'Invite link not generated', - 'invite.totalInvites': 'Total Invites', - 'invite.totalReward': 'Total Reward', - 'invite.rules': 'Invite Rules', - 'invite.rule1': 'You will receive a reward for each friend you successfully invite to register', - 'invite.rule2': 'When your invited friend completes their first transaction, you will receive an additional reward', - 'invite.rule3': 'Invite rewards will be directly credited to your account', - 'invite.inviteList': 'Invite List', - 'invite.tasks': 'Task Center', - 'invite.inviteeName': 'Invitee', - 'invite.inviteTime': 'Invite Time', - 'invite.status': 'Status', - 'invite.reward': 'Reward', - 'invite.active': 'Active', - 'invite.inactive': 'Inactive', - 'invite.completed': 'Completed', - 'invite.claimed': 'Claimed', - 'invite.pending': 'Pending', - 'invite.goToTask': 'Go to Task', - 'invite.claimReward': 'Claim Reward', - 'invite.verify': 'Verify', - 'invite.verifySuccess': 'Verification successful! Task completed', - 'invite.verifyNotCompleted': 'Task not completed yet, please complete the task first', - 'invite.verifyFailed': 'Verification failed, please try again later', - 'invite.claimSuccess': 'Successfully claimed {reward} QDT!', - 'invite.claimFailed': 'Claim failed, please try again later', - 'invite.totalRecords': 'Total {total} records', - 'invite.task.twitter.title': 'Share Tweet on X (Twitter)', - 'invite.task.twitter.desc': 'Share our official tweet to your X (Twitter) account', - 'invite.task.youtube.title': 'Follow our YouTube Channel', - 'invite.task.youtube.desc': 'Subscribe and follow our official YouTube channel', - 'invite.task.telegram.title': 'Join Telegram Group', - 'invite.task.telegram.desc': 'Join our official Telegram community group', - 'invite.task.discord.title': 'Join Discord Server', - 'invite.task.discord.desc': 'Join our Discord community server', - 'message': '-', - 'layouts.usermenu.dialog.title': 'Message', - 'layouts.usermenu.dialog.content': 'Are you sure you would like to logout?', - 'layouts.userLayout.title': 'Clarity from Uncertainty', - // Signal Robot - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings - 'settings.title': 'System Settings', - 'settings.description': 'Configure application settings, API keys, and system preferences', - 'settings.save': 'Save Settings', - 'settings.reset': 'Reset', - 'settings.saveSuccess': 'Settings saved successfully', - 'settings.saveFailed': 'Failed to save settings', - 'settings.loadFailed': 'Failed to load settings', - 'settings.openrouterBalance': 'OpenRouter Account Balance', - 'settings.queryBalance': 'Query Balance', - 'settings.balanceUsage': 'Used', - 'settings.balanceRemaining': 'Remaining', - 'settings.balanceLimit': 'Total Limit', - 'settings.balanceQuerySuccess': 'Balance query successful', - 'settings.balanceQueryFailed': 'Failed to query balance', - 'settings.balanceNotQueried': 'Click "Query Balance" to get account info', - 'settings.default': 'Default', - 'settings.pleaseSelect': 'Please select', - 'settings.inputApiKey': 'Enter key', - 'settings.getApi': 'Get API', - // Settings link texts - 'settings.link.getApi': 'Get API', - 'settings.link.getApiKey': 'Get API Key', - 'settings.link.getToken': 'Get Token', - 'settings.link.createBot': 'Create Bot', - 'settings.link.viewModels': 'View Models', - 'settings.link.freeRegister': 'Free Register', - 'settings.link.supportedExchanges': 'Supported Exchanges', - 'settings.link.applyApi': 'Apply API', - 'settings.link.createSearchEngine': 'Create Search Engine', - 'settings.link.getTurnstileKey': 'Get Turnstile Key', - 'settings.link.getGoogleCredentials': 'Get Google Credentials', - 'settings.link.getGithubCredentials': 'Get GitHub Credentials', - 'settings.restartRequired': 'Settings saved. Some changes require Python service restart to take effect.', - 'settings.copyRestartCmd': 'Copy restart command', - 'settings.copySuccess': 'Copied', - 'settings.copyFailed': 'Copy failed', - // Settings groups - // Settings groups (ordered by backend order) - 'settings.group.server': 'Server Configuration', - 'settings.group.auth': 'Security & Authentication', - 'settings.group.ai': 'AI / LLM Configuration', - 'settings.group.trading': 'Live Trading', - 'settings.group.strategy': 'Strategy Execution', - 'settings.group.data_source': 'Data Sources', - 'settings.group.notification': 'Notifications', - 'settings.group.email': 'Email (SMTP)', - 'settings.group.sms': 'SMS (Twilio)', - 'settings.group.agent': 'AI Agent', - 'settings.group.network': 'Network & Proxy', - 'settings.group.search': 'Web Search', - 'settings.group.security': 'Registration & Security', - 'settings.group.app': 'Application', - // Settings fields - Auth - 'settings.field.SECRET_KEY': 'Secret Key', - 'settings.field.ADMIN_USER': 'Admin Username', - 'settings.field.ADMIN_PASSWORD': 'Admin Password', - 'settings.field.ADMIN_EMAIL': 'Admin Email', - // Settings fields - Security - 'settings.field.ENABLE_REGISTRATION': 'Enable Registration', - 'settings.field.TURNSTILE_SITE_KEY': 'Turnstile Site Key', - 'settings.field.TURNSTILE_SECRET_KEY': 'Turnstile Secret Key', - 'settings.field.FRONTEND_URL': 'Frontend URL', - 'settings.field.GOOGLE_CLIENT_ID': 'Google Client ID', - 'settings.field.GOOGLE_CLIENT_SECRET': 'Google Client Secret', - 'settings.field.GOOGLE_REDIRECT_URI': 'Google Redirect URI', - 'settings.field.GITHUB_CLIENT_ID': 'GitHub Client ID', - 'settings.field.GITHUB_CLIENT_SECRET': 'GitHub Client Secret', - 'settings.field.GITHUB_REDIRECT_URI': 'GitHub Redirect URI', - 'settings.field.SECURITY_IP_MAX_ATTEMPTS': 'IP Max Failed Attempts', - 'settings.field.SECURITY_IP_WINDOW_MINUTES': 'IP Window (minutes)', - 'settings.field.SECURITY_IP_BLOCK_MINUTES': 'IP Block Duration (minutes)', - 'settings.field.SECURITY_ACCOUNT_MAX_ATTEMPTS': 'Account Max Failed Attempts', - 'settings.field.SECURITY_ACCOUNT_WINDOW_MINUTES': 'Account Window (minutes)', - 'settings.field.SECURITY_ACCOUNT_BLOCK_MINUTES': 'Account Block Duration (minutes)', - 'settings.field.VERIFICATION_CODE_EXPIRE_MINUTES': 'Verification Code Expiry (minutes)', - 'settings.field.VERIFICATION_CODE_RATE_LIMIT': 'Code Rate Limit (seconds)', - 'settings.field.VERIFICATION_CODE_IP_HOURLY_LIMIT': 'Code Hourly Limit per IP', - 'settings.field.VERIFICATION_CODE_MAX_ATTEMPTS': 'Code Max Attempts', - 'settings.field.VERIFICATION_CODE_LOCK_MINUTES': 'Code Lock Minutes', - // Settings fields - Server - 'settings.field.PYTHON_API_HOST': 'Listen Address', - 'settings.field.PYTHON_API_PORT': 'Port', - 'settings.field.PYTHON_API_DEBUG': 'Debug Mode', - // Settings fields - Worker - 'settings.field.ENABLE_PENDING_ORDER_WORKER': 'Enable Order Worker', - 'settings.field.PENDING_ORDER_STALE_SEC': 'Order Stale Timeout (sec)', - // Settings fields - Trading - 'settings.field.ORDER_MODE': 'Order Mode', - 'settings.field.MAKER_WAIT_SEC': 'Limit Order Wait Time (sec)', - 'settings.field.MAKER_OFFSET_BPS': 'Limit Order Price Offset (bps)', - // Settings fields - Notification - 'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL', - 'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token', - 'settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC': 'Notify Timeout (sec)', - 'settings.field.TELEGRAM_BOT_TOKEN': 'Telegram Bot Token', - // Settings fields - SMTP - 'settings.field.SMTP_HOST': 'SMTP Host', - 'settings.field.SMTP_PORT': 'SMTP Port', - 'settings.field.SMTP_USER': 'SMTP Username', - 'settings.field.SMTP_PASSWORD': 'SMTP Password', - 'settings.field.SMTP_FROM': 'From Address', - 'settings.field.SMTP_USE_TLS': 'Use TLS', - 'settings.field.SMTP_USE_SSL': 'Use SSL', - // Settings fields - Twilio - 'settings.field.TWILIO_ACCOUNT_SID': 'Account SID', - 'settings.field.TWILIO_AUTH_TOKEN': 'Auth Token', - 'settings.field.TWILIO_FROM_NUMBER': 'From Number', - // Settings fields - Strategy - 'settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES': 'Disable Auto Restore', - 'settings.field.STRATEGY_TICK_INTERVAL_SEC': 'Tick Interval (sec)', - 'settings.field.PRICE_CACHE_TTL_SEC': 'Price Cache TTL (sec)', - // Settings fields - Proxy - 'settings.field.PROXY_PORT': 'Proxy Port', - 'settings.field.PROXY_HOST': 'Proxy Host', - 'settings.field.PROXY_SCHEME': 'Proxy Scheme', - 'settings.field.PROXY_URL': 'Full Proxy URL', - // Settings fields - App - 'settings.field.CORS_ORIGINS': 'CORS Origins', - 'settings.field.RATE_LIMIT': 'Rate Limit (per min)', - 'settings.field.ENABLE_CACHE': 'Enable Cache', - 'settings.field.ENABLE_REQUEST_LOG': 'Enable Request Log', - 'settings.field.ENABLE_AI_ANALYSIS': 'Enable AI Analysis', - // Settings fields - Memory/Reflection - 'settings.field.ENABLE_AGENT_MEMORY': 'Enable Agent Memory', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Enable Vector Retrieval (Local)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding Dimension', - 'settings.field.AGENT_MEMORY_TOP_K': 'Top-K Retrieval Count', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'Candidate Window Size', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Time Decay Half-life (days)', - 'settings.field.AGENT_MEMORY_W_SIM': 'Similarity Weight', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'Recency Weight', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'Returns Weight', - // Settings fields - Reflection Worker - 'settings.field.ENABLE_REFLECTION_WORKER': 'Enable Auto Verification', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Verification Interval (sec)', - // Settings fields - AI - 'settings.field.OPENROUTER_API_KEY': 'OpenRouter API Key', - 'settings.field.OPENROUTER_API_URL': 'OpenRouter API URL', - 'settings.field.OPENROUTER_MODEL': 'Default Model', - 'settings.field.OPENROUTER_TEMPERATURE': 'Temperature', - 'settings.field.OPENROUTER_MAX_TOKENS': 'Max Tokens', - 'settings.field.OPENROUTER_TIMEOUT': 'Timeout (sec)', - 'settings.field.OPENROUTER_CONNECT_TIMEOUT': 'Connect Timeout (sec)', - 'settings.field.AI_MODELS_JSON': 'Models JSON', - // Settings fields - Market - 'settings.field.MARKET_TYPES_JSON': 'Market Types JSON', - 'settings.field.TRADING_SUPPORTED_SYMBOLS_JSON': 'Supported Symbols JSON', - // Settings fields - Data Source - 'settings.field.DATA_SOURCE_TIMEOUT': 'Timeout (sec)', - 'settings.field.DATA_SOURCE_RETRY': 'Retry Count', - 'settings.field.DATA_SOURCE_RETRY_BACKOFF': 'Retry Backoff (sec)', - 'settings.field.FINNHUB_API_KEY': 'Finnhub API Key', - 'settings.field.FINNHUB_TIMEOUT': 'Finnhub Timeout (sec)', - 'settings.field.FINNHUB_RATE_LIMIT': 'Finnhub Rate Limit', - 'settings.field.CCXT_DEFAULT_EXCHANGE': 'CCXT Default Exchange', - 'settings.field.CCXT_TIMEOUT': 'CCXT Timeout (ms)', - 'settings.field.CCXT_PROXY': 'CCXT Proxy', - 'settings.field.YFINANCE_TIMEOUT': 'YFinance Timeout (sec)', - 'settings.field.TIINGO_API_KEY': 'Tiingo API Key', - 'settings.field.TIINGO_TIMEOUT': 'Tiingo Timeout (sec)', - // Settings fields - Search - 'settings.field.SEARCH_PROVIDER': 'Search Provider', - 'settings.field.SEARCH_MAX_RESULTS': 'Max Results', - 'settings.field.TAVILY_API_KEYS': 'Tavily API Keys', - 'settings.field.BOCHA_API_KEYS': 'Bocha API Keys', - 'settings.field.SERPAPI_KEYS': 'SerpAPI Keys', - 'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key', - 'settings.field.SEARCH_GOOGLE_CX': 'Google CX', - 'settings.field.SEARCH_BING_API_KEY': 'Bing API Key', - 'settings.field.INTERNAL_API_KEY': 'Internal API Key', - - // Settings descriptions (config item descriptions) - // Note: These are optional since backend already provides English descriptions - 'settings.desc.SEARCH_PROVIDER': 'Web search provider for AI research', - 'settings.desc.TAVILY_API_KEYS': 'Tavily Search API keys, comma-separated for rotation. Free 1000 requests/month', - 'settings.desc.BOCHA_API_KEYS': 'Bocha Search API keys, comma-separated for rotation', - 'settings.desc.SERPAPI_KEYS': 'SerpAPI keys for Google/Bing search, comma-separated for rotation', - 'settings.desc.ORDER_MODE': 'maker: Limit order first (lower fees), market: Market order (instant fill)', - 'settings.desc.MAKER_WAIT_SEC': 'Wait time for limit order fill before switching to market order', - 'settings.desc.MAKER_OFFSET_BPS': 'Price offset in basis points. Buy: price*(1-offset), Sell: price*(1+offset)', - 'settings.desc.TIINGO_API_KEY': 'Tiingo API key for Forex/Metals data (free tier does not support 1-minute data)', - 'settings.desc.TIINGO_TIMEOUT': 'Tiingo API request timeout', - - // Portfolio - 'portfolio.summary.totalValue': 'Total Value', - 'portfolio.summary.totalCost': 'Total Cost', - 'portfolio.summary.totalPnl': 'Total P&L', - 'portfolio.summary.positionCount': 'Positions', - 'portfolio.summary.profitLossRatio': 'Profit/Loss', - 'portfolio.summary.today': 'Today', - 'portfolio.summary.todayPnl': 'Today P&L', - 'portfolio.summary.bestPerformer': 'Best Performer', - 'portfolio.summary.worstPerformer': 'Worst Performer', - 'portfolio.summary.priceSync': 'Price Sync', - 'portfolio.summary.syncInterval': 'Refresh', - 'portfolio.summary.justNow': 'Just now', - 'portfolio.summary.ago': ' ago', - 'portfolio.positions.title': 'My Positions', - 'portfolio.positions.add': 'Add Position', - 'portfolio.positions.addFirst': 'Add Your First Position', - 'portfolio.positions.empty': 'No positions yet', - 'portfolio.positions.deleteConfirm': 'Are you sure to delete this position?', - 'portfolio.positions.currentPrice': 'Current', - 'portfolio.positions.entryPrice': 'Entry', - 'portfolio.positions.quantity': 'Quantity', - 'portfolio.positions.side': 'Side', - 'portfolio.positions.long': 'Long', - 'portfolio.positions.short': 'Short', - 'portfolio.positions.marketValue': 'Value', - 'portfolio.positions.pnl': 'P&L', - 'portfolio.positions.items': 'positions', - 'portfolio.monitors.title': 'AI Monitors', - 'portfolio.monitors.add': 'Add Monitor', - 'portfolio.monitors.addFirst': 'Add AI Monitor', - 'portfolio.monitors.empty': 'No monitors yet', - 'portfolio.monitors.deleteConfirm': 'Are you sure to delete this monitor?', - 'portfolio.monitors.interval': 'Interval', - 'portfolio.monitors.lastRun': 'Last Run', - 'portfolio.monitors.nextRun': 'Next Run', - 'portfolio.monitors.channels': 'Channels', - 'portfolio.monitors.runNow': 'Run Now', - 'portfolio.monitors.analysisResult': 'AI Analysis Result', - 'portfolio.monitors.runningTitle': 'AI Analysis Started', - 'portfolio.monitors.runningDesc': 'Analysis is running in background. Results will be pushed via notification. Analyzing multiple positions may take a few minutes.', - 'portfolio.monitors.timeoutTitle': 'Request Timeout', - 'portfolio.monitors.timeoutDesc': 'Analysis may still be running in background. Please check notifications for results later. If no notification is received, please try again.', - 'portfolio.modal.addPosition': 'Add Position', - 'portfolio.modal.editPosition': 'Edit Position', - 'portfolio.modal.addMonitor': 'Add Monitor', - 'portfolio.modal.editMonitor': 'Edit Monitor', - 'portfolio.form.market': 'Market', - 'portfolio.form.marketRequired': 'Please select a market', - 'portfolio.form.selectMarket': 'Select Market', - 'portfolio.form.symbol': 'Symbol', - 'portfolio.form.symbolRequired': 'Please enter symbol', - 'portfolio.form.searchSymbol': 'Search or enter symbol', - 'portfolio.form.useAsSymbol': 'Use', - 'portfolio.form.asSymbolCode': 'as symbol code', - 'portfolio.form.symbolHint': 'Search symbols or enter any code directly', - 'portfolio.form.side': 'Side', - 'portfolio.form.quantity': 'Quantity', - 'portfolio.form.quantityRequired': 'Please enter quantity', - 'portfolio.form.enterQuantity': 'Enter quantity', - 'portfolio.form.entryPrice': 'Entry Price', - 'portfolio.form.entryPriceRequired': 'Please enter entry price', - 'portfolio.form.enterEntryPrice': 'Enter entry price', - 'portfolio.form.notes': 'Notes', - 'portfolio.form.enterNotes': 'Optional: Add notes', - 'portfolio.form.monitorName': 'Monitor Name', - 'portfolio.form.monitorNameRequired': 'Please enter monitor name', - 'portfolio.form.enterMonitorName': 'e.g. Daily Portfolio Analysis', - 'portfolio.form.interval': 'Interval', - 'portfolio.form.minutes': 'minutes', - 'portfolio.form.hour': 'hour', - 'portfolio.form.hours': 'hours', - 'portfolio.form.notifyChannels': 'Notify Channels', - 'portfolio.form.browser': 'Browser', - 'portfolio.form.email': 'Email', - 'portfolio.form.telegramChatId': 'Telegram Chat ID', - 'portfolio.form.enterTelegramChatId': 'Enter Telegram Chat ID', - 'portfolio.form.telegramRequired': 'Please enter Telegram Chat ID', - 'portfolio.form.emailAddress': 'Email Address', - 'portfolio.form.enterEmail': 'Enter email address', - 'portfolio.form.emailRequired': 'Please enter email address', - 'portfolio.form.emailInvalid': 'Please enter a valid email address', - 'portfolio.form.customPrompt': 'Custom Prompt', - 'portfolio.form.customPromptPlaceholder': 'Optional: Add focus areas, e.g. "Focus on tech stock risks"', - 'portfolio.form.monitorScope': 'Monitor Scope', - 'portfolio.form.allPositions': 'All Positions', - 'portfolio.form.selectedPositions': 'Selected Positions', - 'portfolio.form.selectPositions': 'Select Positions', - 'portfolio.form.selectAll': 'Select All', - 'portfolio.form.deselectAll': 'Deselect All', - 'portfolio.form.selectedCount': '{count} of {total} selected', - 'portfolio.form.pleaseSelectPositions': 'Please select at least one position to monitor', - 'portfolio.form.notificationFromProfile': 'Notifications will be sent to addresses configured in your profile', - 'portfolio.form.goToProfile': 'Go to settings', - 'portfolio.message.loadFailed': 'Failed to load data', - 'portfolio.message.saveSuccess': 'Saved successfully', - 'portfolio.message.saveFailed': 'Failed to save', - 'portfolio.message.deleteSuccess': 'Deleted successfully', - 'portfolio.message.deleteFailed': 'Failed to delete', - 'portfolio.message.updateFailed': 'Failed to update', - 'portfolio.message.monitorEnabled': 'Monitor enabled', - 'portfolio.message.monitorDisabled': 'Monitor paused', - 'portfolio.message.monitorRunSuccess': 'Analysis completed', - 'portfolio.message.monitorRunFailed': 'Analysis failed', - 'portfolio.message.monitorRunning': 'AI analysis started, please wait for notification', - // Portfolio - Groups - 'portfolio.groups.all': 'All Positions', - 'portfolio.groups.ungrouped': 'Ungrouped', - 'portfolio.form.group': 'Group', - 'portfolio.form.enterGroup': 'Enter or select group', - // Portfolio - Alerts - 'portfolio.alerts.title': 'Price/PnL Alerts', - 'portfolio.alerts.addAlert': 'Add Alert', - 'portfolio.alerts.editAlert': 'Edit Alert', - 'portfolio.alerts.alertType': 'Alert Type', - 'portfolio.alerts.priceAbove': 'Price Above', - 'portfolio.alerts.priceBelow': 'Price Below', - 'portfolio.alerts.pnlAbove': 'Profit Above (%)', - 'portfolio.alerts.pnlBelow': 'Loss Below (%)', - 'portfolio.alerts.threshold': 'Threshold', - 'portfolio.alerts.thresholdRequired': 'Please enter threshold', - 'portfolio.alerts.enterPrice': 'Enter price', - 'portfolio.alerts.enterPercent': 'Enter percentage', - 'portfolio.alerts.currentPrice': 'Current Price', - 'portfolio.alerts.currentPriceHint': 'Current price', - 'portfolio.alerts.repeatInterval': 'Repeat Alert', - 'portfolio.alerts.noRepeat': 'No repeat (trigger once)', - 'portfolio.alerts.every5min': 'Every 5 minutes', - 'portfolio.alerts.every15min': 'Every 15 minutes', - 'portfolio.alerts.every30min': 'Every 30 minutes', - 'portfolio.alerts.every1hour': 'Every 1 hour', - 'portfolio.alerts.every4hours': 'Every 4 hours', - 'portfolio.alerts.onceDaily': 'Once daily', - 'portfolio.alerts.enabled': 'Enable Alert', - 'portfolio.alerts.enabledDesc': 'Auto-monitor and trigger notifications', - 'portfolio.alerts.delete': 'Delete', - 'portfolio.alerts.deleteConfirm': 'Are you sure you want to delete this alert?', - 'portfolio.modal.addAlert': 'Add Alert', - 'portfolio.modal.editAlert': 'Edit Alert', - - // User Management - 'menu.userManage': 'User Management', - 'menu.myProfile': 'My Profile', - 'common.actions': 'Actions', - 'common.refresh': 'Refresh', - - 'userManage.title': 'User Management', - 'userManage.searchPlaceholder': 'Search by username/email/nickname', - 'userManage.description': 'Manage system users, roles and permissions', - 'userManage.createUser': 'Create User', - 'userManage.editUser': 'Edit User', - 'userManage.username': 'Username', - 'userManage.password': 'Password', - 'userManage.nickname': 'Nickname', - 'userManage.email': 'Email', - 'userManage.role': 'Role', - 'userManage.status': 'Status', - 'userManage.lastLogin': 'Last Login', - 'userManage.active': 'Active', - 'userManage.disabled': 'Disabled', - 'userManage.neverLogin': 'Never', - 'userManage.usernameRequired': 'Please enter username', - 'userManage.usernamePlaceholder': 'Enter username', - 'userManage.passwordRequired': 'Please enter password', - 'userManage.passwordPlaceholder': 'Enter password (min 6 chars)', - 'userManage.passwordMin': 'Password must be at least 6 characters', - 'userManage.nicknamePlaceholder': 'Enter nickname', - 'userManage.emailPlaceholder': 'Enter email', - 'userManage.emailInvalid': 'Invalid email format', - 'userManage.rolePlaceholder': 'Select role', - 'userManage.statusPlaceholder': 'Select status', - 'userManage.resetPassword': 'Reset Password', - 'userManage.resetPasswordWarning': 'This will reset the user\'s password', - 'userManage.newPassword': 'New Password', - 'userManage.newPasswordPlaceholder': 'Enter new password', - 'userManage.confirmDelete': 'Are you sure to delete this user?', - 'userManage.roleAdmin': 'Admin', - 'userManage.roleManager': 'Manager', - 'userManage.roleUser': 'User', - 'userManage.roleViewer': 'Viewer', - - // Profile - 'profile.title': 'My Profile', - 'profile.description': 'Manage your account settings and preferences', - 'profile.basicInfo': 'Basic Info', - 'profile.changePassword': 'Change Password', - 'profile.username': 'Username', - 'profile.nickname': 'Nickname', - 'profile.email': 'Email', - 'profile.lastLogin': 'Last Login', - 'profile.nicknamePlaceholder': 'Enter your nickname', - 'profile.emailPlaceholder': 'Enter your email', - 'profile.emailInvalid': 'Invalid email format', - 'profile.emailCannotChange': 'Email cannot be changed after registration', - 'profile.passwordHint': 'Password must be at least 6 characters', - 'profile.oldPassword': 'Current Password', - 'profile.newPassword': 'New Password', - 'profile.confirmPassword': 'Confirm Password', - 'profile.oldPasswordRequired': 'Please enter current password', - 'profile.oldPasswordPlaceholder': 'Enter current password', - 'profile.newPasswordRequired': 'Please enter new password', - 'profile.newPasswordPlaceholder': 'Enter new password', - 'profile.confirmPasswordRequired': 'Please confirm password', - 'profile.confirmPasswordPlaceholder': 'Confirm new password', - 'profile.passwordMin': 'Password must be at least 6 characters', - 'profile.passwordMismatch': 'Passwords do not match', - - // Profile - Credits - 'profile.credits.title': 'My Credits', - 'profile.credits.unit': 'Credits', - 'profile.credits.recharge': 'Top Up', - 'profile.credits.vipExpires': 'VIP expires on', - 'profile.credits.vipExpired': 'VIP expired', - 'profile.credits.noVip': 'Not a VIP', - 'profile.credits.hint': 'AI analysis/backtest/monitoring will consume credits; VIP only makes VIP-free indicators free to use.', - - // Profile - Credits Log - 'profile.creditsLog': 'Credits History', - 'profile.creditsLog.time': 'Time', - 'profile.creditsLog.action': 'Type', - 'profile.creditsLog.amount': 'Change', - 'profile.creditsLog.balance': 'Balance', - 'profile.creditsLog.remark': 'Remark', - 'profile.creditsLog.actionConsume': 'Consume', - 'profile.creditsLog.actionRecharge': 'Recharge', - 'profile.creditsLog.actionAdjust': 'Adjust', - 'profile.creditsLog.actionRefund': 'Refund', - 'profile.creditsLog.actionVipGrant': 'VIP Grant', - 'profile.creditsLog.actionVipRevoke': 'VIP Revoke', - 'profile.creditsLog.actionRegisterBonus': 'Register Bonus', - 'profile.creditsLog.actionReferralBonus': 'Referral Bonus', - 'profile.creditsLog.actionIndicatorPurchase': 'Indicator Purchase', - 'profile.creditsLog.actionIndicatorSale': 'Indicator Sale', - - // Profile - Referral - 'profile.referral.title': 'Invite Friends', - 'profile.referral.listTab': 'Referrals', - 'profile.referral.totalInvited': 'Invited', - 'profile.referral.bonusPerInvite': 'Per Invite', - 'profile.referral.yourLink': 'Your Referral Link', - 'profile.referral.copyLink': 'Copy Link', - 'profile.referral.linkCopied': 'Referral link copied', - 'profile.referral.newUserBonus': 'New users get', - 'profile.referral.user': 'User', - 'profile.referral.registerTime': 'Registered', - 'profile.referral.noReferrals': 'No referrals yet', - 'profile.referral.shareNow': 'Share Now', - - // Profile - Notification Settings - 'profile.notifications.title': 'Notification Settings', - 'profile.notifications.hint': 'Configure your default notification methods, which will be used automatically when creating asset monitors and alerts', - 'profile.notifications.defaultChannels': 'Default Notification Channels', - 'profile.notifications.browser': 'In-App Notification', - 'profile.notifications.email': 'Email', - 'profile.notifications.phone': 'SMS', - 'profile.notifications.telegramBotToken': 'Telegram Bot Token', - 'profile.notifications.telegramBotTokenPlaceholder': 'Enter your Telegram Bot Token', - 'profile.notifications.telegramBotTokenHint': 'Get Token by creating a bot via @BotFather', - 'profile.notifications.telegramChatId': 'Telegram Chat ID', - 'profile.notifications.telegramPlaceholder': 'Enter your Telegram Chat ID (e.g. 123456789)', - 'profile.notifications.telegramHint': 'Send /start to @userinfobot to get your Chat ID', - 'profile.notifications.notifyEmail': 'Notification Email', - 'profile.notifications.emailPlaceholder': 'Email address to receive notifications', - 'profile.notifications.emailHint': 'Uses your account email by default, or set a different one', - 'profile.notifications.phonePlaceholder': 'Enter phone number (e.g. +1234567890)', - 'profile.notifications.phoneHint': 'Requires admin to configure Twilio service', - 'profile.notifications.discordWebhook': 'Discord Webhook', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'Create Webhook in Discord server settings', - 'profile.notifications.webhookUrl': 'Webhook URL', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': 'Custom Webhook URL, notifications sent via POST JSON', - 'profile.notifications.webhookToken': 'Webhook Token (Optional)', - 'profile.notifications.webhookTokenPlaceholder': 'Bearer Token for request authentication', - 'profile.notifications.webhookTokenHint': 'Sent as Authorization: Bearer Token to Webhook', - 'profile.notifications.testBtn': 'Send Test Notification', - 'profile.notifications.saveSuccess': 'Notification settings saved successfully', - 'profile.notifications.selectChannel': 'Please select at least one notification channel', - 'profile.notifications.fillTelegramToken': 'Please fill in Telegram Bot Token', - 'profile.notifications.fillTelegram': 'Please fill in Telegram Chat ID', - 'profile.notifications.fillEmail': 'Please fill in notification email', - 'profile.notifications.testSent': 'Test notification sent, please check your notification channels', - - // User Manage - Credits & VIP - 'userManage.credits': 'Credits', - 'userManage.adjustCredits': 'Adjust Credits', - 'userManage.setVip': 'Set VIP', - 'userManage.currentCredits': 'Current Credits', - 'userManage.newCredits': 'New Credits', - 'userManage.enterCredits': 'Enter new credits amount', - 'userManage.creditsNonNegative': 'Credits cannot be negative', - 'userManage.currentVip': 'Current VIP Status', - 'userManage.vipActive': 'Active', - 'userManage.vipExpired': 'Expired', - 'userManage.vipDays': 'VIP Days', - 'userManage.vipExpiresAt': 'VIP Expires At', - 'userManage.cancelVip': 'Cancel VIP', - 'userManage.days': 'days', - 'userManage.customDate': 'Custom Date', - 'userManage.selectDate': 'Please select a date', - 'userManage.remark': 'Remark', - 'userManage.remarkPlaceholder': 'Optional remark', - 'userManage.tabUsers': 'User Management', - - // System Overview (Admin) - 'systemOverview.tabTitle': 'System Overview', - 'systemOverview.totalStrategies': 'Total Strategies', - 'systemOverview.runningStrategies': 'Running', - 'systemOverview.totalCapital': 'Total Capital', - 'systemOverview.totalPnl': 'Total PnL', - 'systemOverview.filterAll': 'All Status', - 'systemOverview.filterRunning': 'Running', - 'systemOverview.filterStopped': 'Stopped', - 'systemOverview.searchPlaceholder': 'Search strategy/symbol/user', - 'systemOverview.running': 'Running', - 'systemOverview.stopped': 'Stopped', - 'systemOverview.colUser': 'User', - 'systemOverview.colStrategy': 'Strategy', - 'systemOverview.colStatus': 'Status', - 'systemOverview.colSymbol': 'Symbol', - 'systemOverview.colCapital': 'Capital', - 'systemOverview.colPnl': 'PnL / ROI', - 'systemOverview.colPositions': 'Pos', - 'systemOverview.colTrades': 'Trades', - 'systemOverview.colIndicator': 'Indicator', - 'systemOverview.colExchange': 'Exchange', - 'systemOverview.colTimeframe': 'TF', - 'systemOverview.colLeverage': 'Lev', - 'systemOverview.colCreatedAt': 'Created', - 'systemOverview.realized': 'Real', - 'systemOverview.unrealized': 'Unreal', - 'systemOverview.symbols': 'symbols', - 'systemOverview.live': 'Live', - 'systemOverview.signal': 'Signal Only', - - // Settings - Billing - 'settings.group.billing': 'Billing & Credits', - 'settings.field.BILLING_ENABLED': 'Enable Billing', - 'settings.field.BILLING_VIP_BYPASS': 'VIP Bypass (Legacy)', - 'settings.field.BILLING_COST_AI_ANALYSIS': 'AI Analysis Cost', - 'settings.field.BILLING_COST_STRATEGY_RUN': 'Strategy Run Cost', - 'settings.field.BILLING_COST_BACKTEST': 'Backtest Cost', - 'settings.field.BILLING_COST_PORTFOLIO_MONITOR': 'Portfolio Monitor Cost', - 'settings.field.CREDITS_REGISTER_BONUS': 'Register Bonus', - 'settings.field.CREDITS_REFERRAL_BONUS': 'Referral Bonus', - 'settings.field.RECHARGE_TELEGRAM_URL': 'Recharge Telegram URL', - 'settings.field.MEMBERSHIP_MONTHLY_PRICE_USD': 'Monthly Membership Price (USD)', - 'settings.field.MEMBERSHIP_MONTHLY_CREDITS': 'Monthly Membership Bonus Credits', - 'settings.field.MEMBERSHIP_YEARLY_PRICE_USD': 'Yearly Membership Price (USD)', - 'settings.field.MEMBERSHIP_YEARLY_CREDITS': 'Yearly Membership Bonus Credits', - 'settings.field.MEMBERSHIP_LIFETIME_PRICE_USD': 'Lifetime Membership Price (USD)', - 'settings.field.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS': 'Lifetime Monthly Credits', - 'settings.field.USDT_PAY_ENABLED': 'Enable USDT Pay', - 'settings.field.USDT_PAY_CHAIN': 'USDT Chain', - 'settings.field.USDT_TRC20_XPUB': 'TRC20 XPUB (Watch-only)', - 'settings.field.USDT_TRC20_CONTRACT': 'USDT TRC20 Contract', - 'settings.field.TRONGRID_BASE_URL': 'TronGrid Base URL', - 'settings.field.TRONGRID_API_KEY': 'TronGrid API Key', - 'settings.field.USDT_PAY_CONFIRM_SECONDS': 'Confirm Delay (sec)', - 'settings.field.USDT_PAY_EXPIRE_MINUTES': 'Order Expire (min)', - 'settings.desc.BILLING_ENABLED': 'Enable billing system. Users need credits to use certain features when enabled', - 'settings.desc.BILLING_VIP_BYPASS': 'Legacy switch. If enabled, VIP users bypass ALL feature credit costs. Recommended OFF: VIP should only unlock VIP-free indicators.', - 'settings.desc.BILLING_COST_AI_ANALYSIS': 'Credits consumed per AI analysis request', - 'settings.desc.BILLING_COST_STRATEGY_RUN': 'Credits consumed when starting a strategy', - 'settings.desc.BILLING_COST_BACKTEST': 'Credits consumed per backtest run', - 'settings.desc.BILLING_COST_PORTFOLIO_MONITOR': 'Credits consumed per portfolio AI monitoring run', - 'settings.desc.CREDITS_REGISTER_BONUS': 'Credits awarded to new users on registration', - 'settings.desc.CREDITS_REFERRAL_BONUS': 'Credits awarded to referrer when someone signs up with their referral code', - 'settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS': 'Maximum attempts to verify a code before lockout', - 'settings.desc.VERIFICATION_CODE_LOCK_MINUTES': 'Lockout duration after exceeding max attempts', - 'settings.desc.RECHARGE_TELEGRAM_URL': 'Telegram customer service URL for recharge inquiries', - 'settings.desc.MEMBERSHIP_MONTHLY_PRICE_USD': 'Monthly membership price in USD (mock payment in current version).', - 'settings.desc.MEMBERSHIP_MONTHLY_CREDITS': 'Credits granted immediately after purchasing monthly membership.', - 'settings.desc.MEMBERSHIP_YEARLY_PRICE_USD': 'Yearly membership price in USD (mock payment in current version).', - 'settings.desc.MEMBERSHIP_YEARLY_CREDITS': 'Credits granted immediately after purchasing yearly membership.', - 'settings.desc.MEMBERSHIP_LIFETIME_PRICE_USD': 'Lifetime membership price in USD (mock payment in current version).', - 'settings.desc.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS': 'Credits granted every 30 days for lifetime members (first grant happens immediately on purchase).', - 'settings.desc.USDT_PAY_ENABLED': 'Enable USDT scan-to-pay flow (per-order unique address + auto reconciliation).', - 'settings.desc.USDT_PAY_CHAIN': 'Currently only TRC20 is supported.', - 'settings.desc.USDT_TRC20_XPUB': 'Watch-only xpub used to derive per-order deposit addresses. Do NOT paste private key/seed.', - 'settings.desc.USDT_TRC20_CONTRACT': 'USDT contract address on TRON (default prefilled).', - 'settings.desc.TRONGRID_BASE_URL': 'TronGrid API base URL (default is fine).', - 'settings.desc.TRONGRID_API_KEY': 'Optional. For higher TronGrid rate limits and stability.', - 'settings.desc.USDT_PAY_CONFIRM_SECONDS': 'After a payment is detected, wait N seconds before marking it confirmed.', - 'settings.desc.USDT_PAY_EXPIRE_MINUTES': 'Order expiration time; users need to regenerate an order after it expires.', - - // Global Market - 'globalMarket.title': 'Global Market Dashboard', - 'globalMarket.fearGreedShort': 'F&G', - 'globalMarket.calendar': 'Calendar', - 'globalMarket.lastUpdate': 'Last Update', - 'globalMarket.refresh': 'Refresh', - 'globalMarket.name': 'Name', - 'globalMarket.price': 'Price', - 'globalMarket.change': 'Change', - 'globalMarket.trend': 'Trend', - 'globalMarket.pair': 'Pair', - 'globalMarket.unit': 'Unit', - 'globalMarket.refreshSuccess': 'Data refreshed successfully', - 'globalMarket.refreshError': 'Failed to refresh data', - 'globalMarket.fetchError': 'Failed to fetch data', - 'globalMarket.loading': 'Loading...', - 'globalMarket.fearGreedIndex': 'Fear & Greed Index', - 'globalMarket.fearGreedTip': 'Fear & Greed Index measures market sentiment, 0 = Extreme Fear, 100 = Extreme Greed', - 'globalMarket.volatilityIndex': 'Volatility Index', - 'globalMarket.dollarIndex': 'Dollar Index', - 'globalMarket.majorIndices': 'Major Indices', - 'globalMarket.vixTitle': 'VIX Volatility Index', - 'globalMarket.vixTip': 'VIX measures expected market volatility, higher values indicate more market fear', - 'globalMarket.extremeFear': 'Extreme Fear', - 'globalMarket.fear': 'Fear', - 'globalMarket.neutral': 'Neutral', - 'globalMarket.greed': 'Greed', - 'globalMarket.extremeGreed': 'Extreme Greed', - 'globalMarket.marketOverview': 'Market Overview', - 'globalMarket.indices': 'Indices', - 'globalMarket.forex': 'Forex', - 'globalMarket.crypto': 'Crypto', - 'globalMarket.commodities': 'Commodities', - 'globalMarket.heatmap': 'Market Heatmap', - 'globalMarket.cryptoHeatmap': 'Crypto', - 'globalMarket.commoditiesHeatmap': 'Commodities', - 'globalMarket.sectorHeatmap': 'Sectors', - 'globalMarket.forexHeatmap': 'Forex', - 'globalMarket.opportunities': 'Trading Opportunities', - 'globalMarket.noOpportunities': 'No significant opportunities detected', - 'globalMarket.financialNews': 'Financial News', - 'globalMarket.noNews': 'No news available', - 'globalMarket.economicCalendar': 'Economic Calendar', - 'globalMarket.noEvents': 'No events scheduled', - 'globalMarket.actual': 'Actual', - 'globalMarket.forecast': 'Forecast', - 'globalMarket.previous': 'Previous', - 'globalMarket.signal.bullish': 'Bullish Momentum', - 'globalMarket.signal.bearish': 'Bearish Momentum', - 'globalMarket.signal.overbought': 'Overbought Warning', - 'globalMarket.signal.oversold': 'Oversold Opportunity', - 'globalMarket.worldMap': 'Global Markets Map', - 'globalMarket.rising': 'Rising', - 'globalMarket.falling': 'Falling', - 'globalMarket.bullish': 'Bullish', - 'globalMarket.bearish': 'Bearish', - 'globalMarket.expectedImpact': 'Expected Impact', - 'globalMarket.aboveForecast': 'Above Forecast', - 'globalMarket.belowForecast': 'Below Forecast', - 'globalMarket.upcomingEvents': 'Upcoming Events', - 'globalMarket.releasedEvents': 'Released Data', - - // Trading Assistant - 'trading-assistant.form.notificationFromProfile': 'Notifications will be sent to the address configured in your profile.', - 'trading-assistant.form.notificationConfigMissing': 'You have not configured parameters for selected channels ({channels}). Please go to your profile to configure them.', - 'trading-assistant.form.goToProfile': 'Go to Profile', - - // Indicator Community - 'community.title': 'Indicator Market', - 'community.searchPlaceholder': 'Search indicators...', - 'community.all': 'All', - 'community.freeOnly': 'Free', - 'community.paidOnly': 'Paid', - 'community.sortNewest': 'Newest', - 'community.sortHot': 'Popular', - 'community.sortRating': 'Top Rated', - 'community.sortPriceLow': 'Price: Low to High', - 'community.sortPriceHigh': 'Price: High to Low', - 'community.myPurchases': 'My Purchases', - 'community.noIndicators': 'No indicators yet', - 'community.createFirst': 'Create Your First Indicator', - 'community.total': 'Total', - 'community.items': 'items', - 'community.free': 'Free', - 'community.credits': 'Credits', - 'community.myIndicator': 'My Indicator', - 'community.purchased': 'Purchased', - 'community.noDescription': 'No description', - 'community.loadFailed': 'Failed to load', - 'community.publishedAt': 'Published', - 'community.downloads': 'Downloads', - 'community.rating': 'Rating', - 'community.views': 'Views', - 'community.description': 'Description', - 'community.performance': 'Live Performance', - 'community.strategyCount': 'Strategies', - 'community.tradeCount': 'Trades', - 'community.winRate': 'Win Rate', - 'community.totalProfit': 'Total Profit', - 'community.reviews': 'Reviews', - 'community.useNow': 'Use Now', - 'community.getFree': 'Get Free', - 'community.buyNow': 'Buy Now', - 'community.purchaseSuccess': 'Purchase successful! Indicator added to your list', - 'community.purchaseFailed': 'Purchase failed', - 'community.indicator_not_found': 'Indicator not found or unavailable', - 'community.cannot_buy_own': 'Cannot buy your own indicator', - 'community.already_purchased': 'You have already purchased this indicator', - 'community.insufficient_credits': 'Insufficient credits', - 'community.commentSuccess': 'Comment submitted', - 'community.commentFailed': 'Failed to submit comment', - 'community.commentUpdateSuccess': 'Comment updated successfully', - 'community.commentUpdateFailed': 'Failed to update comment', - 'community.editComment': 'Edit Comment', - 'community.cancelEdit': 'Cancel', - 'community.updateComment': 'Update Comment', - 'community.alreadyCommented': 'You have already reviewed this indicator', - 'community.editMyComment': 'Edit Review', - 'community.me': 'Me', - 'community.edited': 'edited', - 'community.not_purchased': 'Please purchase/get the indicator first to leave a review', - 'community.cannot_comment_own': 'Cannot review your own indicator', - 'community.already_commented': 'You have already reviewed this indicator', - 'community.noComments': 'No reviews yet', - 'community.yourRating': 'Your Rating', - 'community.commentPlaceholder': 'Share your experience...', - 'community.submitComment': 'Submit Review', - 'community.pleaseRate': 'Please select a rating', - 'community.loadMore': 'Load More', - 'community.justNow': 'Just now', - 'community.minutesAgo': 'minutes ago', - 'community.hoursAgo': 'hours ago', - 'community.daysAgo': 'days ago', - 'community.noPurchases': 'No purchases yet', - 'community.purchasedFrom': 'Seller', - 'community.purchaseTime': 'Purchase Time', - - // Admin Review - 'community.admin.reviewTab': 'Review', - 'community.admin.pending': 'Pending', - 'community.admin.approved': 'Approved', - 'community.admin.rejected': 'Rejected', - 'community.admin.noItems': 'No items', - 'community.admin.noDescription': 'No description', - 'community.admin.viewCode': 'View Code', - 'community.admin.note': 'Note', - 'community.admin.approve': 'Approve', - 'community.admin.reject': 'Reject', - 'community.admin.unpublish': 'Unpublish', - 'community.admin.delete': 'Delete', - 'community.admin.deleteConfirm': 'Are you sure to delete this indicator? This cannot be undone.', - 'community.admin.unpublishConfirm': 'Are you sure to unpublish this indicator?', - 'community.admin.unpublishHint': 'This indicator will be hidden from the market', - 'community.admin.confirm': 'Confirm', - 'community.admin.cancel': 'Cancel', - 'community.admin.approveTitle': 'Approve Indicator', - 'community.admin.rejectTitle': 'Reject Indicator', - 'community.admin.noteLabel': 'Note (optional)', - 'community.admin.notePlaceholder': 'Enter review note...', - 'community.admin.loadFailed': 'Failed to load', - 'community.admin.reviewSuccess': 'Review submitted', - 'community.admin.reviewFailed': 'Review failed', - 'community.admin.unpublishSuccess': 'Unpublished successfully', - 'community.admin.unpublishFailed': 'Failed to unpublish', - 'community.admin.deleteSuccess': 'Deleted successfully', - 'community.admin.deleteFailed': 'Failed to delete', - - // Fast Analysis - 'fastAnalysis.aiAnalysis': 'AI Analysis', - 'fastAnalysis.analyzing': 'AI is analyzing...', - 'fastAnalysis.pleaseWait': 'Please wait, fetching real-time data and generating professional report', - 'fastAnalysis.error': 'Analysis Failed', - 'fastAnalysis.retry': 'Retry', - 'fastAnalysis.selectSymbol': 'Select a symbol to start', - 'fastAnalysis.selectHint': 'Choose from your watchlist or add a new symbol', - 'fastAnalysis.confidence': 'Confidence', - 'fastAnalysis.currentPrice': 'Current Price', - 'fastAnalysis.entryPrice': 'Entry Price', - 'fastAnalysis.stopLoss': 'Stop Loss', - 'fastAnalysis.takeProfit': 'Take Profit', - 'fastAnalysis.stopLossHint': 'Based on 2x ATR & support', - 'fastAnalysis.takeProfitHint': 'Based on 3x ATR & resistance', - 'fastAnalysis.atrBased': 'ATR-based', - 'fastAnalysis.riskReward': 'Risk/Reward', - 'fastAnalysis.technical': 'Technical', - 'fastAnalysis.fundamental': 'Fundamental', - 'fastAnalysis.sentiment': 'Sentiment', - 'fastAnalysis.overall': 'Overall', - 'fastAnalysis.keyReasons': 'Key Reasons', - 'fastAnalysis.risks': 'Risks', - 'fastAnalysis.indicators': 'Technical Indicators', - 'fastAnalysis.maTrend': 'MA Trend', - 'fastAnalysis.support': 'Support', - 'fastAnalysis.resistance': 'Resistance', - 'fastAnalysis.volatility': 'Volatility', - 'fastAnalysis.wasHelpful': 'Was this analysis helpful?', - 'fastAnalysis.helpful': 'Helpful', - 'fastAnalysis.notHelpful': 'Not Helpful', - 'fastAnalysis.feedbackThanks': 'Thanks for your feedback!', - 'fastAnalysis.feedbackFailed': 'Failed to submit feedback', - 'fastAnalysis.feedbackUnavailable': 'Feedback unavailable, please re-analyze', - 'fastAnalysis.analysisTime': 'Analysis time', - 'fastAnalysis.startAnalysis': 'Analyze', - 'fastAnalysis.history': 'History', - 'fastAnalysis.systemTitle': 'QUANTDINGER AI', - 'fastAnalysis.systemOnline': 'Online', - 'fastAnalysis.version': 'Fast', - 'fastAnalysis.preparing': 'Preparing...', - 'fastAnalysis.step1': 'Fetching real-time data', - 'fastAnalysis.step2': 'Calculating indicators', - 'fastAnalysis.step3': 'AI deep analysis', - 'fastAnalysis.step4': 'Generating report', - - // Detailed analysis titles - 'fastAnalysis.technicalAnalysis': 'Technical Analysis', - 'fastAnalysis.fundamentalAnalysis': 'Fundamental Analysis', - 'fastAnalysis.sentimentAnalysis': 'Market Sentiment', - - // Technical indicator signals - 'fastAnalysis.signal.bullish': 'Bullish', - 'fastAnalysis.signal.bearish': 'Bearish', - 'fastAnalysis.signal.neutral': 'Neutral', - 'fastAnalysis.signal.overbought': 'Overbought', - 'fastAnalysis.signal.oversold': 'Oversold', - 'fastAnalysis.signal.strong_bullish': 'Strong Bullish', - 'fastAnalysis.signal.strong_bearish': 'Strong Bearish', - - // Trend translations - 'fastAnalysis.trend.uptrend': 'Uptrend', - 'fastAnalysis.trend.downtrend': 'Downtrend', - 'fastAnalysis.trend.sideways': 'Sideways', - 'fastAnalysis.trend.consolidating': 'Consolidating', - 'fastAnalysis.trend.golden_cross': 'Golden Cross', - 'fastAnalysis.trend.death_cross': 'Death Cross', - 'fastAnalysis.trend.strong_uptrend': 'Strong Uptrend', - 'fastAnalysis.trend.strong_downtrend': 'Strong Downtrend', - - // Volatility translations - 'fastAnalysis.volatilityLevel.high': 'High', - 'fastAnalysis.volatilityLevel.medium': 'Medium', - 'fastAnalysis.volatilityLevel.low': 'Low', - 'fastAnalysis.volatilityLevel.unknown': 'Unknown', - - // Market Overview - 'fastAnalysis.marketOverview': 'Market Overview', - 'fastAnalysis.selectTip': 'Select a symbol from your watchlist to start AI analysis', - - // ==================== AI Quant ==================== - 'aiQuant.title': 'AI Quant', - 'aiQuant.strategyList': 'Strategies', - 'aiQuant.create': 'Create', - 'aiQuant.edit': 'Edit', - 'aiQuant.delete': 'Delete', - 'aiQuant.start': 'Start', - 'aiQuant.stop': 'Stop', - 'aiQuant.analyze': 'Analyze Now', - 'aiQuant.noStrategy': 'No strategies yet, click to create', - 'aiQuant.selectStrategy': 'Select a strategy from the left', - 'aiQuant.createFirst': 'Create Your First Strategy', - 'aiQuant.createStrategy': 'Create Strategy', - 'aiQuant.editStrategy': 'Edit Strategy', - 'aiQuant.confirmDelete': 'Are you sure you want to delete this strategy?', - 'aiQuant.latestAnalysis': 'Latest Analysis', - 'aiQuant.analysisHistory': 'Analysis History', - 'aiQuant.decision': 'Decision', - 'aiQuant.confidence': 'Confidence', - 'aiQuant.currentPrice': 'Current Price', - 'aiQuant.entryPrice': 'Entry Price', - 'aiQuant.stopLoss': 'Stop Loss', - 'aiQuant.takeProfit': 'Take Profit', - 'aiQuant.reason': 'Reason', - 'aiQuant.analyzedAt': 'Analyzed At', - 'aiQuant.tradeSettings': 'Trade Settings', - 'aiQuant.minutes': 'min', - 'aiQuant.hour': 'hour', - 'aiQuant.hours': 'hours', - - // AI Quant Stats - 'aiQuant.stats.totalStrategies': 'Total Strategies', - 'aiQuant.stats.runningStrategies': 'Running', - 'aiQuant.stats.totalAnalyses': 'Analyses', - 'aiQuant.stats.totalPnl': 'Total PnL', - - // AI Quant Status - 'aiQuant.status.running': 'Running', - 'aiQuant.status.stopped': 'Stopped', - 'aiQuant.status.paused': 'Paused', - - // AI Quant Execution Mode - 'aiQuant.executionMode.signal': 'Signal Only', - 'aiQuant.executionMode.live': 'Live Trading', - - // AI Quant Market Type - 'aiQuant.marketType.spot': 'Spot', - 'aiQuant.marketType.futures': 'Futures', - - // AI Quant Fields - 'aiQuant.field.strategyName': 'Strategy Name', - 'aiQuant.field.market': 'Market', - 'aiQuant.field.symbol': 'Symbol', - 'aiQuant.field.marketType': 'Market Type', - 'aiQuant.field.aiModel': 'AI Model', - 'aiQuant.field.interval': 'Analysis Interval', - 'aiQuant.field.aiPrompt': 'AI Prompt', - 'aiQuant.field.executionMode': 'Execution Mode', - 'aiQuant.field.positionSize': 'Position Size', - 'aiQuant.field.stopLoss': 'Stop Loss %', - 'aiQuant.field.takeProfit': 'Take Profit %', - 'aiQuant.field.totalAnalyses': 'Total Analyses', - 'aiQuant.field.totalTrades': 'Total Trades', - 'aiQuant.field.totalPnl': 'Total PnL', - - // AI Quant Placeholders - 'aiQuant.placeholder.strategyName': 'Enter strategy name', - 'aiQuant.placeholder.market': 'Select market', - 'aiQuant.placeholder.symbol': 'e.g., BTC/USDT', - 'aiQuant.placeholder.aiModel': 'Use system default', - 'aiQuant.placeholder.aiPrompt': 'Enter your trading strategy prompt, e.g., Buy when RSI is below 30...', - - // AI Quant Validation - 'aiQuant.validation.strategyName': 'Please enter strategy name', - 'aiQuant.validation.market': 'Please select market', - 'aiQuant.validation.symbol': 'Please enter symbol', - - // AI Quant Table Columns - 'aiQuant.table.decision': 'Decision', - 'aiQuant.table.confidence': 'Confidence', - 'aiQuant.table.entryPrice': 'Entry', - 'aiQuant.table.stopLoss': 'Stop Loss', - 'aiQuant.table.takeProfit': 'Take Profit', - 'aiQuant.table.time': 'Time', - - // AI Quant Messages - 'aiQuant.msg.createSuccess': 'Strategy created successfully', - 'aiQuant.msg.updateSuccess': 'Strategy updated successfully', - 'aiQuant.msg.deleteSuccess': 'Strategy deleted successfully', - 'aiQuant.msg.startSuccess': 'Strategy started', - 'aiQuant.msg.stopSuccess': 'Strategy stopped', - 'aiQuant.msg.analyzeSuccess': 'Analysis completed', - - // AI Quant New Fields - 'aiQuant.field.initialCapital': 'Initial Capital', - 'aiQuant.field.leverage': 'Leverage', - 'aiQuant.field.tradeDirection': 'Trade Direction', - 'aiQuant.field.trailingStop': 'Trailing Stop', - 'aiQuant.field.trailingStopPct': 'Trailing Stop %', - 'aiQuant.direction.long': 'Long Only', - 'aiQuant.direction.short': 'Short Only', - 'aiQuant.direction.both': 'Both', - 'aiQuant.riskControl': 'Risk Control', - 'aiQuant.aiSettings': 'AI Settings', - 'aiQuant.systemDefault': 'System Default', - 'aiQuant.placeholder.selectSymbol': 'Select from watchlist', - 'aiQuant.hint.symbolFromWatchlist': 'Select from your watchlist, market type is auto-detected', - 'aiQuant.hint.spotLeverageFixed': 'Spot market leverage is fixed at 1x', - 'aiQuant.hint.stopLossEnforced': 'Enforced stop loss, AI cannot modify', - 'aiQuant.hint.takeProfitEnforced': 'Enforced take profit, AI cannot modify', - 'aiQuant.hint.aiPromptOnly': 'AI only determines direction based on prompt, will not modify your risk settings', - 'aiQuant.aiLimitWarning': 'AI Permission Restricted', - 'aiQuant.aiLimitDescription': 'AI can ONLY determine trade direction (BUY/SELL/HOLD). Leverage, position size, stop loss/take profit are fully controlled by you and CANNOT be modified by AI.', - 'aiQuant.userStopLoss': 'Your Stop Loss', - 'aiQuant.userTakeProfit': 'Your Take Profit', - 'aiQuant.userLeverage': 'Your Leverage', - 'aiQuant.validation.initialCapital': 'Please enter initial capital', - 'aiQuant.table.currentPrice': 'Current Price', - - // AI Quant Prompt Templates - 'aiQuant.field.promptTemplate': 'Strategy Template', - 'aiQuant.placeholder.selectTemplate': 'Select a preset template', - 'aiQuant.template.default': '๐Ÿ“Š Comprehensive Analysis (Recommended)', - 'aiQuant.template.trend': '๐Ÿ“ˆ Trend Following', - 'aiQuant.template.swing': '๐Ÿ”„ Swing Trading', - 'aiQuant.template.news': '๐Ÿ“ฐ News Driven', - 'aiQuant.template.custom': 'โœ๏ธ Custom', - 'aiQuant.hint.dataProvided': 'System auto-provides: real-time price, indicators (RSI/MACD/MA), recent news, macro data. AI analyzes these with your prompt to determine direction.', - 'aiQuant.hint.liveWarning': 'Live mode will trade with REAL money! Make sure you have configured exchange API and understand the risks!', - - // Trading Assistant - Live Trading Disclaimer - 'trading-assistant.liveDisclaimer.title': 'Live Trading Disclaimer', - 'trading-assistant.liveDisclaimer.content': 'Live trading involves significant risk and may result in partial or total loss of funds. The platform does not guarantee returns or profits. You are responsible for your own decisions and outcomes.', - 'trading-assistant.liveDisclaimer.agree': 'I have read and understood the disclaimer and still want to enable live trading', - 'trading-assistant.liveDisclaimer.required': 'Please accept the disclaimer before enabling live trading', - 'trading-assistant.liveDisclaimer.blockTitle': 'Please accept the disclaimer first', - 'trading-assistant.liveDisclaimer.blockDesc': 'You must accept the disclaimer to configure live trading connection and order settings.', - - // Billing / Membership - 'menu.billing': 'Membership', - 'billing.title': 'Membership / Credits', - 'billing.desc': 'Choose a plan to activate VIP and receive bonus credits.', - 'billing.snapshot.credits': 'Current Credits', - 'billing.snapshot.vip': 'VIP Status', - 'billing.snapshot.notVip': 'Not VIP', - 'billing.snapshot.expires': 'Expires', - 'billing.vipRule.title': 'VIP Benefit', - 'billing.vipRule.desc': 'VIP has only one special permission: VIP-free indicators can be used without credits deduction. Other paid features/indicators still consume credits.', - 'billing.plan.monthly': 'Monthly', - 'billing.plan.yearly': 'Yearly', - 'billing.plan.lifetime': 'Lifetime', - 'billing.perMonth': 'month', - 'billing.perYear': 'year', - 'billing.once': 'one-time', - 'billing.credits': 'Credits', - 'billing.lifetimeMonthly': 'Monthly bonus', - 'billing.buyNow': 'Buy Now', - 'billing.purchaseSuccess': 'Purchase successful', - 'billing.purchaseFailed': 'Purchase failed', - 'billing.usdt.title': 'USDT Scan to Pay', - 'billing.usdt.hintTitle': 'Scan with your wallet and send USDT', - 'billing.usdt.hintDesc': 'Make sure the network and amount are correct (TRC20 only for now). Membership will be activated automatically after payment is confirmed.', - 'billing.usdt.chain': 'Chain', - 'billing.usdt.amount': 'Amount', - 'billing.usdt.address': 'Deposit Address', - 'billing.usdt.copyAddress': 'Copy Address', - 'billing.usdt.copyAmount': 'Copy Amount', - 'billing.usdt.refresh': 'Refresh', - 'billing.usdt.expires': 'Expires', - 'billing.usdt.paidSuccess': 'Payment confirmed. Membership activated.', - 'billing.usdt.status.pending': 'Waiting for payment', - 'billing.usdt.status.paid': 'Payment detected', - 'billing.usdt.status.confirmed': 'Confirmed', - 'billing.usdt.status.expired': 'Expired', - 'billing.usdt.status.cancelled': 'Cancelled', - 'billing.usdt.status.failed': 'Failed', - - // Community - 'community.vipFree': 'VIP Free', - - // Indicator publish - 'dashboard.indicator.publish.vipFree': 'VIP Free', - 'dashboard.indicator.publish.vipFreeHint': 'When enabled: VIP users can use this indicator for free (non-VIP still need to purchase).' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/fr-FR.js b/quantdinger_vue/src/locales/lang/fr-FR.js deleted file mode 100644 index af8d638..0000000 --- a/quantdinger_vue/src/locales/lang/fr-FR.js +++ /dev/null @@ -1,1823 +0,0 @@ -import antdFrFR from 'ant-design-vue/es/locale-provider/fr_FR' -import momentFR from 'moment/locale/fr' - -const components = { - antLocale: antdFrFR, - momentName: 'fr', - momentLocale: momentFR -} - -const locale = { - 'submit': 'Soumettre', - 'save': 'enregistrer', - 'submit.ok': 'Soumission rรฉussie', - 'save.ok': 'Enregistrรฉ avec succรจs', - 'menu.welcome': 'bienvenue', - 'menu.home': "Page d'accueil", - 'menu.dashboard': 'Tableau de bord', - 'menu.dashboard.indicator': 'Analyse des indicateurs', - 'menu.dashboard.community': 'communautรฉ des indicateurs', - 'menu.dashboard.analysis': "Analyse de l'IA", - 'menu.dashboard.tradingAssistant': 'Assistante commerciale', - 'menu.dashboard.aiTradingAssistant': 'Assistant de trading IA', - 'menu.dashboard.signalRobot': 'Robot de signal', - 'menu.dashboard.monitor': 'Page de surveillance', - 'menu.dashboard.workplace': 'รฉtabli', - 'menu.form': 'page de formulaire', - 'menu.form.basic-form': 'forme de base', - 'menu.form.step-form': 'formulaire รฉtape par รฉtape', - 'menu.form.step-form.info': 'Formulaire รฉtape par รฉtape (remplir les informations de transfert)', - 'menu.form.step-form.confirm': 'Formulaire รฉtape par รฉtape (confirmer les informations de transfert)', - 'menu.form.step-form.result': 'Formulaire รฉtape par รฉtape (ร  complรฉter)', - 'menu.form.advanced-form': 'Formulaires avancรฉs', - 'menu.list': 'Page de liste', - 'menu.list.table-list': 'Formulaire de demande', - 'menu.list.basic-list': 'Liste standard', - 'menu.list.card-list': 'liste de cartes', - 'menu.list.search-list': 'liste de recherche', - 'menu.list.search-list.articles': 'Liste de recherche (articles)', - 'menu.list.search-list.projects': 'Liste de recherche (projet)', - 'menu.list.search-list.applications': 'Liste de recherche (application)', - 'menu.profile': 'Page de dรฉtails', - 'menu.profile.basic': 'Page de dรฉtails de base', - 'menu.profile.advanced': 'Page de dรฉtails avancรฉs', - 'menu.result': 'Page de rรฉsultats', - 'menu.result.success': 'page de rรฉussite', - 'menu.result.fail': "page d'รฉchec", - 'menu.exception': "Page d'exceptions", - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'erreur de dรฉclenchement', - 'menu.account': 'Page personnelle', - 'menu.account.center': 'Centre personnel', - 'menu.account.settings': 'paramรจtres personnels', - 'menu.account.trigger': 'Erreur de dรฉclenchement', - 'menu.account.logout': 'Se dรฉconnecter', - 'menu.wallet': 'mon portefeuille', - 'menu.docs': 'Centre de documentation', - 'menu.docs.detail': 'Dรฉtails du document', - 'menu.header.refreshPage': 'actualiser la page', - 'menu.invite.friends': 'Inviter des amis', - 'app.setting.pagestyle': 'paramรจtres de style gรฉnรฉraux', - 'app.setting.pagestyle.light': 'Style de menu lumineux', - 'app.setting.pagestyle.dark': 'style de menu sombre', - 'app.setting.pagestyle.realdark': 'mode sombre', - 'app.setting.themecolor': 'couleur du thรจme', - 'app.setting.navigationmode': 'Mode navigation', - 'app.setting.sidemenu.nav': 'Navigation dans la barre latรฉrale', - 'app.setting.topmenu.nav': 'Navigation dans la barre supรฉrieure', - 'app.setting.content-width': 'largeur de la zone de contenu', - 'app.setting.content-width.tooltip': "Ce paramรจtre n'est efficace que lorsque [Navigation dans la barre supรฉrieure]", - 'app.setting.content-width.fixed': 'Corrigรฉ', - 'app.setting.content-width.fluid': 'diffusion en continu', - 'app.setting.fixedheader': 'En-tรชte fixe', - 'app.setting.fixedheader.tooltip': "Configurable lorsqu'il est fixe", - 'app.setting.autoHideHeader': "Masquer l'en-tรชte lors du dรฉfilement", - 'app.setting.fixedsidebar': 'Menu latรฉral fixe', - 'app.setting.sidemenu': 'Disposition du menu latรฉral', - 'app.setting.topmenu': 'Disposition du menu supรฉrieur', - 'app.setting.othersettings': 'Autres paramรจtres', - 'app.setting.weakmode': 'Mode de faiblesse des couleurs', - 'app.setting.multitab': 'Mode multi-onglets', - 'app.setting.copy': 'Paramรจtres de copie', - 'app.setting.loading': 'Chargement du thรจme', - 'app.setting.copyinfo': 'Copiez les paramรจtres avec succรจs src/config/defaultSettings.js', - 'app.setting.copy.success': 'Copie terminรฉe', - 'app.setting.copy.fail': 'ร‰chec de la copie', - 'app.setting.theme.switching': 'Changer de thรจme !', - 'app.setting.production.hint': "La barre de configuration est uniquement utilisรฉe pour l'aperรงu dans l'environnement de dรฉveloppement et ne sera pas affichรฉe dans l'environnement de production. Veuillez copier et modifier le fichier de configuration manuellement.", - 'app.setting.themecolor.daybreak': 'Bleu aube (par dรฉfaut)', - 'app.setting.themecolor.dust': 'crรฉpuscule', - 'app.setting.themecolor.volcano': 'volcan', - 'app.setting.themecolor.sunset': 'coucher de soleil', - 'app.setting.themecolor.cyan': 'Mingqing', - 'app.setting.themecolor.green': 'aurore verte', - 'app.setting.themecolor.geekblue': 'bleu geek', - 'app.setting.themecolor.purple': 'Jiang Zi', - 'app.setting.tooltip': 'Paramรจtres des pages', - 'user.login.userName': "Nom d'utilisateur", - 'user.login.password': 'Mot de passe', - 'user.login.username.placeholder': 'Compteย : administrateur', - 'user.login.password.placeholder': 'Mot de passe : admin ou ant.design', - 'user.login.message-invalid-credentials': 'La connexion a รฉchouรฉ, veuillez vรฉrifier votre e-mail et votre code de vรฉrification', - 'user.login.message-invalid-verification-code': 'Erreur de code de vรฉrification', - 'user.login.tab-login-credentials': 'Connexion par mot de passe du compte', - 'user.login.tab-login-email': 'Connexion par e-mail', - 'user.login.tab-login-mobile': 'Connexion au numรฉro de tรฉlรฉphone portable', - 'user.login.captcha.placeholder': 'Veuillez saisir le code de vรฉrification graphique', - 'user.login.mobile.placeholder': 'Numรฉro de tรฉlรฉphone portable', - 'user.login.mobile.verification-code.placeholder': 'Code de vรฉrification', - 'user.login.email.placeholder': 'Veuillez entrer votre adresse e-mail', - 'user.login.email.verification-code.placeholder': 'Veuillez entrer le code de vรฉrification', - 'user.login.email.sending': "Le code de vรฉrification est en cours d'envoi...", - 'user.login.email.send-success-title': 'Conseils', - 'user.login.email.send-success': 'Code de vรฉrification envoyรฉ avec succรจs, veuillez vรฉrifier votre email', - 'user.login.sms.send-success': 'Code de vรฉrification envoyรฉ avec succรจs, veuillez vรฉrifier le message texte', - 'user.login.remember-me': 'Connexion automatique', - 'user.login.forgot-password': 'Mot de passe oubliรฉ', - 'user.login.sign-in-with': 'Autres mรฉthodes de connexion', - 'user.login.signup': 'Crรฉer un compte', - 'user.login.login': 'Connexion', - 'user.register.register': "S'inscrire", - 'user.register.email.placeholder': 'Courriel', - 'user.register.password.placeholder': 'Veuillez saisir au moins 6 caractรจres. Veuillez ne pas utiliser de mots de passe faciles ร  deviner.', - 'user.register.password.popover-message': 'Veuillez saisir au moins 6 caractรจres. Veuillez ne pas utiliser de mots de passe faciles ร  deviner.', - 'user.register.confirm-password.placeholder': 'Confirmer le mot de passe', - 'user.register.get-verification-code': 'Obtenir le code de vรฉrification', - 'user.register.sign-in': 'Connectez-vous en utilisant un compte existant', - 'user.register-result.msg': 'Votre compteย : {email} Inscription rรฉussie', - 'user.register-result.activation-email': "L'e-mail d'activation a รฉtรฉ envoyรฉ dans votre boรฎte mail et est valable 24 heures. Veuillez vous connecter rapidement ร  votre messagerie et cliquer sur le lien contenu dans l'e-mail pour activer votre compte.", - 'user.register-result.back-home': "Retour ร  la page d'accueil", - 'user.register-result.view-mailbox': 'Vรฉrifiez votre boรฎte aux lettres', - 'user.email.required': 'Veuillez entrer votre adresse e-mailย !', - 'user.email.wrong-format': "Le format de l'adresse e-mail est incorrectย !", - 'user.userName.required': 'Veuillez saisir votre nom de compte ou votre adresse e-mail', - 'user.password.required': 'Veuillez entrer votre mot de passeย !', - 'user.password.twice.msg': 'Les mots de passe saisis deux fois ne correspondent pasย !', - 'user.password.strength.msg': "Le mot de passe n'est pas assez fort", - 'user.password.strength.strong': 'Forceย : Forte', - 'user.password.strength.medium': 'Forceย : moyenne', - 'user.password.strength.low': 'Force : faible', - 'user.password.strength.short': 'Force : trop courte', - 'user.confirm-password.required': 'Veuillez confirmer votre mot de passeย !', - 'user.phone-number.required': 'Veuillez saisir le bon numรฉro de tรฉlรฉphone portable', - 'user.phone-number.wrong-format': 'Le format du numรฉro de tรฉlรฉphone portable est erronรฉย !', - 'user.verification-code.required': 'Veuillez entrer le code de vรฉrificationย !', - 'user.captcha.required': 'Veuillez saisir le code de vรฉrification graphiqueย !', - 'user.login.infos': "QuantDinger est un outil auxiliaire d'analyse boursiรจre multi-agents d'IA et n'a pas de qualifications en conseil en investissement en valeurs mobiliรจres. Tous les rรฉsultats d'analyse, scores et avis de rรฉfรฉrence de la plateforme sont automatiquement gรฉnรฉrรฉs par l'IA sur la base de donnรฉes historiques et sont utilisรฉs uniquement ร  des fins d'apprentissage, de recherche et d'รฉchange technique, et ne constituent aucun conseil d'investissement ou base de prise de dรฉcision. L'investissement en actions implique divers risques tels que le risque de marchรฉ, le risque de liquiditรฉ, le risque politique, etc., qui peuvent entraรฎner une perte du principal. Les utilisateurs doivent prendre des dรฉcisions indรฉpendantes en fonction de leur propre tolรฉrance au risque, et tout comportement d'investissement et consรฉquences dรฉcoulant de l'utilisation de cet outil seront ร  la charge de l'utilisateur. Le marchรฉ est risquรฉ et les investissements doivent รชtre prudents.", - 'user.login.tab-login-web3': 'Connexion Web3', - 'user.login.web3.tip': "Connexion par signature ร  l'aide du portefeuille", - 'user.login.web3.connect': 'Connectez le portefeuille et connectez-vous', - 'user.login.web3.no-wallet': 'Portefeuille non dรฉtectรฉ', - 'user.login.web3.no-address': 'Adresse du portefeuille non obtenue', - 'user.login.web3.nonce-failed': "Impossible d'obtenir un nombre alรฉatoire", - 'user.login.web3.verify-failed': 'La vรฉrification de la signature a รฉchouรฉ', - 'user.login.web3.success': 'Connexion rรฉussie', - 'user.login.web3.failed': 'ร‰chec de la connexion au portefeuille', - 'nav.no_wallet': 'Portefeuille non dรฉtectรฉ', - 'nav.copy': 'Copier', - 'nav.copy_success': 'Copiรฉ avec succรจs', - 'user.login.oauth.google': 'Connectez-vous avec Google', - 'user.login.oauth.github': 'Connectez-vous avec GitHub', - 'user.login.oauth.loading': "Redirection vers la page d'autorisation...", - 'user.login.oauth.failed': 'ร‰chec de la connexion OAuth', - 'user.login.oauth.get-url-failed': "ร‰chec de l'obtention du lien d'autorisation", - 'user.login.subtitle': 'Informations quantitatives sur les marchรฉs mondiaux', - 'user.login.legal.title': 'Mentions lรฉgales', - 'user.login.legal.view': 'Voir les mentions lรฉgales', - 'user.login.legal.collapse': 'Rรฉduire les mentions lรฉgales', - 'user.login.legal.agree': "J'ai lu et j'accepte les mentions lรฉgales", - 'user.login.legal.required': "Veuillez d'abord lire et vรฉrifier les mentions lรฉgales", - 'user.login.legal.content': "QuantDinger est un outil auxiliaire d'analyse boursiรจre multi-agents d'IA et n'a pas de qualifications en conseil en investissement en valeurs mobiliรจres. Tous les rรฉsultats d'analyse, notes et avis de rรฉfรฉrence de la plateforme sont automatiquement gรฉnรฉrรฉs par l'IA sur la base de donnรฉes historiques et sont utilisรฉs uniquement ร  des fins d'apprentissage, de recherche et d'รฉchange technique, et ne constituent aucun conseil d'investissement ou base de prise de dรฉcision. L'investissement en actions implique divers risques tels que le risque de marchรฉ, le risque de liquiditรฉ, le risque politique, etc., qui peuvent entraรฎner une perte du principal. Les utilisateurs doivent prendre des dรฉcisions indรฉpendantes en fonction de leur propre tolรฉrance au risque, et tout comportement d'investissement et consรฉquences dรฉcoulant de l'utilisation de cet outil seront ร  la charge de l'utilisateur. Le marchรฉ est risquรฉ et les investissements doivent รชtre prudents.", - 'user.login.privacy.title': 'Politique de confidentialitรฉ des utilisateurs', - 'user.login.privacy.view': 'Afficher la politique de confidentialitรฉ des utilisateurs', - 'user.login.privacy.collapse': 'Fermer les conditions de confidentialitรฉ des utilisateurs', - 'user.login.privacy.content': "Nous accordons une grande importance ร  votre vie privรฉe et ร  la protection de vos donnรฉes. 1) Portรฉe de la collecteย : seules les informations nรฉcessaires ร  la mise en ล“uvre de la fonction (telles que l'e-mail, le numรฉro de tรฉlรฉphone mobile, l'indicatif rรฉgional, l'adresse du portefeuille Web3) ainsi que les journaux et informations sur l'appareil nรฉcessaires sont collectรฉs. 2) Objectif d'utilisationย : Pour la connexion au compte et la vรฉrification de la sรฉcuritรฉ, la fourniture de fonctions de service, le dรฉpannage et les exigences de conformitรฉ. 3) Stockage et sรฉcuritรฉย : les donnรฉes sont cryptรฉes et stockรฉes, et les autorisations et mesures de contrรดle d'accรจs nรฉcessaires sont prises pour tenter d'empรชcher tout accรจs non autorisรฉ, toute divulgation ou toute perte. 4) Partage avec des tiersย : sauf si les lois et rรฉglementations l'exigent ou si cela est nรฉcessaire ร  l'exรฉcution des services, vos informations personnelles ne seront pas partagรฉes avec des tiersย ; si des services tiers (tels que des portefeuilles, des fournisseurs de services SMS) sont impliquรฉs, ils ne seront traitรฉs que dans la mesure minimale nรฉcessaire ร  la mise en ล“uvre de la fonction. 5) Cookies/stockage localย : utilisรฉs pour le statut de connexion et la maintenance de session nรฉcessaire (tels que les jetons, PHPSESSID), vous pouvez les effacer ou les restreindre dans le navigateur. 6) Droits personnels : Vous pouvez exercer vos droits d'information, de rectification, de suppression, de retrait de consentement, etc. conformรฉment aux lois et rรจglements. 7) Modifications et avisย : lorsque ces conditions seront mises ร  jour, elles seront affichรฉes bien en รฉvidence sur la page. En continuant ร  utiliser ce service, vous รชtes rรฉputรฉ avoir lu et acceptรฉ le contenu mis ร  jour. Si vous n'acceptez pas ces Conditions ou toute mise ร  jour de celles-ci, veuillez cesser d'utiliser le Service et nous contacter.", - 'account.basicInfo': 'Informations de base', - 'account.id': 'Identifiant utilisateur', - 'account.username': "Nom d'utilisateur", - 'account.nickname': 'Surnom', - 'account.email': 'Courriel', - 'account.mobile': 'Numรฉro de tรฉlรฉphone portable', - 'account.web3address': 'adresse du portefeuille', - 'account.pid': 'Identifiant du rรฉfรฉrent', - 'account.level': 'Niveau utilisateur', - 'account.money': 'รฉquilibre', - 'account.qdtBalance': 'Solde QDT', - 'account.score': 'Points', - 'account.createtime': "Heure d'inscription", - 'account.inviteLink': "Lien d'invitation", - 'account.recharge': 'Recharger', - 'account.rechargeTip': 'Veuillez utiliser WeChat ou Alipay pour scanner le code QR ci-dessous pour recharger.', - 'account.qrCodePlaceholder': 'Espace rรฉservรฉ au code QR (รฉmulation)', - 'account.rechargeAmount': 'Montant de la recharge', - 'account.enterAmount': 'Veuillez saisir le montant de la recharge', - 'account.rechargeHint': 'Montant minimum du dรฉpรดtย : 1 QDT', - 'account.confirmRecharge': 'Confirmer la recharge', - 'account.enterValidAmount': 'Veuillez saisir un montant de recharge valide', - 'account.rechargeSuccess': 'Recharge rรฉussieย ! Dรฉposรฉ {montant} QDT', - 'account.settings.menuMap.basic': 'Paramรจtres de base', - 'account.settings.menuMap.security': 'Paramรจtres de sรฉcuritรฉ', - 'account.settings.menuMap.notification': 'Notification de nouveau message', - 'account.settings.menuMap.moneyLog': 'Dรฉtails du fonds', - 'account.moneyLog.empty': "Aucun dรฉtail sur le fonds pour l'instant", - 'account.moneyLog.total': '{total} enregistrements au total', - 'account.moneyLog.type.purchase': "indicateur d'achat", - 'account.moneyLog.type.recharge': 'Recharger', - 'account.moneyLog.type.refund': 'Remboursement', - 'account.moneyLog.type.reward': 'rรฉcompense', - 'account.moneyLog.type.income': "Revenu de l'indicateur", - 'account.moneyLog.type.commission': 'Frais de gestion de la plateforme', - 'wallet.balance': 'Solde QDT', - 'wallet.recharge': 'Recharger', - 'wallet.withdraw': "Retirer de l'argent", - 'wallet.filter': 'Filtrer', - 'wallet.reset': 'rรฉinitialiser', - 'wallet.totalRecharge': 'Recharge accumulรฉe', - 'wallet.totalWithdraw': 'Retraits cumulรฉs', - 'wallet.totalIncome': 'Revenu cumulรฉ', - 'wallet.records': 'Enregistrements de transactions et dรฉtails des fonds', - 'wallet.tradingRecords': 'historique des transactions', - 'wallet.moneyLog': 'Dรฉtails du fonds', - 'wallet.rechargeTip': 'Veuillez utiliser WeChat ou Alipay pour scanner le code QR ci-dessous pour recharger.', - 'wallet.qrCodePlaceholder': 'Espace rรฉservรฉ au code QR (รฉmulation)', - 'wallet.rechargeAmount': 'Montant de la recharge', - 'wallet.enterAmount': 'Veuillez saisir le montant de la recharge', - 'wallet.rechargeHint': 'Montant minimum du dรฉpรดtย : 1 QDT', - 'wallet.confirmRecharge': 'Confirmer la recharge', - 'wallet.enterValidAmount': 'Veuillez saisir un montant de recharge valide', - 'wallet.rechargeSuccess': 'Recharge rรฉussieย ! Dรฉposรฉ {montant} QDT', - 'wallet.rechargeFailed': 'La recharge a รฉchouรฉ', - 'wallet.withdrawTip': "Veuillez saisir le montant du retrait et l'adresse de retrait", - 'wallet.withdrawAmount': 'Montant du retrait', - 'wallet.enterWithdrawAmount': 'Veuillez saisir le montant du retrait', - 'wallet.withdrawHint': 'Montant minimum de retrait : 1 QDT', - 'wallet.withdrawAddress': 'Adresse de retrait (facultatif)', - 'wallet.enterWithdrawAddress': "Veuillez saisir l'adresse de retrait", - 'wallet.confirmWithdraw': 'Confirmer le retrait', - 'wallet.enterValidWithdrawAmount': 'Veuillez saisir un montant de retrait valide', - 'wallet.insufficientBalance': 'Solde insuffisant', - 'wallet.withdrawSuccess': 'Retrait rรฉussi ! Retirรฉ {montant} QDT', - 'wallet.withdrawFailed': 'ร‰chec du retrait', - 'wallet.noTradingRecords': "Aucun enregistrement de transaction pour l'instant", - 'wallet.noMoneyLog': "Aucun dรฉtail sur le fonds pour l'instant", - 'wallet.loadTradingRecordsFailed': 'ร‰chec du chargement des enregistrements de transaction', - 'wallet.loadMoneyLogFailed': 'ร‰chec du chargement des dรฉtails du fonds', - 'wallet.moneyLogTotal': '{total} enregistrements au total', - 'wallet.moneyLogTypeTitle': 'Tapez', - 'wallet.moneyLogType.all': 'Tous types', - 'wallet.table.time': 'temps', - 'wallet.table.type': 'Tapez', - 'wallet.table.price': 'prix', - 'wallet.table.amount': 'Quantitรฉ', - 'wallet.table.money': 'Montant', - 'wallet.table.balance': 'รฉquilibre', - 'wallet.table.memo': 'Remarques', - 'wallet.table.value': 'valeur', - 'wallet.table.profit': 'Profits et pertes', - 'wallet.table.commission': 'frais de traitement', - 'wallet.table.total': '{total} enregistrements au total', - 'wallet.tradeType.buy': 'acheter', - 'wallet.tradeType.sell': 'vendre', - 'wallet.tradeType.liquidation': 'liquidation forcรฉe', - 'wallet.tradeType.openLong': 'Ouvert longtemps', - 'wallet.tradeType.addLong': 'Gadot', - 'wallet.tradeType.closeLong': 'Pinduo', - 'wallet.tradeType.closeLongStop': 'Stop loss et long', - 'wallet.tradeType.closeLongProfit': 'Prenez des bรฉnรฉfices et gagnez plus de niveaux', - 'wallet.tradeType.openShort': 'Ouvert court', - 'wallet.tradeType.addShort': 'ajouter un court', - 'wallet.tradeType.closeShort': 'vide', - 'wallet.tradeType.closeShortStop': 'Arrรชter la perte', - 'wallet.tradeType.closeShortProfit': 'Prenez des bรฉnรฉfices et clรดturez ร  dรฉcouvert', - 'wallet.moneyLogType.purchase': "indicateur d'achat", - 'wallet.moneyLogType.recharge': 'Recharger', - 'wallet.moneyLogType.withdraw': "Retirer de l'argent", - 'wallet.moneyLogType.refund': 'Remboursement', - 'wallet.moneyLogType.reward': 'rรฉcompense', - 'wallet.moneyLogType.income': 'revenu', - 'wallet.moneyLogType.commission': 'frais de traitement', - 'wallet.web3Address.required': "Veuillez d'abord remplir l'adresse du portefeuille Web3", - 'wallet.web3Address.requiredDescription': "Avant de recharger, vous devez lier l'adresse de votre portefeuille Web3 pour recevoir la recharge.", - 'wallet.web3Address.placeholder': "Veuillez saisir l'adresse de votre portefeuille Web3 (en commenรงant par 0x)", - 'wallet.web3Address.save': "Enregistrer l'adresse du portefeuille", - 'wallet.web3Address.saveSuccess': 'Adresse du portefeuille enregistrรฉe avec succรจs', - 'wallet.web3Address.saveFailed': "ร‰chec de l'enregistrement de l'adresse du portefeuille", - 'wallet.web3Address.invalidFormat': 'Veuillez saisir une adresse de portefeuille Web3 valide (format Ethereum : 42 caractรจres commenรงant par 0x, ou format TRC20 : 34 caractรจres commenรงant par T)', - 'wallet.selectCoin': 'Sรฉlectionnez la devise', - 'wallet.selectChain': 'chaรฎne de sรฉlection', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'Le montant de QDT que vous souhaitez รฉchanger (facultatif)', - 'wallet.targetQdtAmount.placeholder': 'Veuillez saisir la quantitรฉ de QDT que vous souhaitez utiliser, le prix actuel du QDTย :ย {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'Besoin de rechargeย :ย {amount}ย USDT', - 'wallet.rechargeAddress': 'Adresse de recharge', - 'wallet.copyAddress': 'Copier', - 'wallet.copySuccess': 'Copiez avec succรจsย !', - 'wallet.copyFailed': 'ร‰chec de la copie, veuillez copier manuellement', - 'wallet.rechargeAddressHint': "Veuillez vous assurer d'utiliser {chain} pour dรฉposer {coin} ร  cette adresse", - 'wallet.qdtPrice.loading': 'Chargement...', - 'wallet.rechargeTip.new': 'Veuillez sรฉlectionner la devise et la chaรฎne, puis scannez le code QR ci-dessous pour recharger', - 'wallet.exchangeRate': '1 QDT โ‰ˆ {taux} USDT', - 'wallet.withdrawableAmount': 'Montant des liquiditรฉs disponibles', - 'wallet.totalBalance': 'solde total', - 'wallet.insufficientWithdrawable': 'Le montant en espรจces pouvant รชtre retirรฉ est insuffisant. Le montant actuel qui peut รชtre retirรฉ estย :ย {amount} QDT', - 'wallet.withdrawAddressRequired': "Veuillez saisir l'adresse de retrait", - 'wallet.withdrawAddressHint': "Veuillez vous assurer que l'adresse est correcte. Aprรจs le retrait, il ne peut รชtre rรฉvoquรฉ.", - 'wallet.withdrawSubmitSuccess': "Demande de retrait soumise avec succรจs, veuillez attendre l'examen", - 'menu.footer.contactUs': 'Contactez-nous', - 'menu.footer.getSupport': "Obtenir de l'aide", - 'menu.footer.socialAccounts': 'compte social', - 'menu.footer.userAgreement': "Contrat d'utilisation", - 'menu.footer.privacyPolicy': 'politique de confidentialitรฉ', - 'menu.footer.support': 'Assistance', - 'menu.footer.featureRequest': 'Demande de fonctionnalitรฉ', - 'menu.footer.email': 'Courriel', - 'menu.footer.liveChat': 'Chat en direct 24h/24 et 7j/7', - 'dashboard.analysis.title': 'Analyse multidimensionnelle', - 'dashboard.analysis.subtitle': "Plateforme d'analyse financiรจre complรจte basรฉe sur l'IA", - 'dashboard.analysis.selectSymbol': 'Sรฉlectionnez ou saisissez le code sous-jacent', - 'dashboard.analysis.selectModel': 'Sรฉlectionnez le modรจle', - 'dashboard.analysis.startAnalysis': "Dรฉmarrer l'analyse", - 'dashboard.analysis.history': 'Histoire', - 'dashboard.analysis.tab.overview': 'analyse complรจte', - 'dashboard.analysis.tab.fundamental': 'Fondamentaux', - 'dashboard.analysis.tab.technical': 'technologie', - 'dashboard.analysis.tab.news': 'Actualitรฉs', - 'dashboard.analysis.tab.sentiment': 'รฉmotions', - 'dashboard.analysis.tab.risk': 'risque', - 'dashboard.analysis.tab.debate': 'Le dรฉbat long-court', - 'dashboard.analysis.tab.decision': 'dรฉcision finale', - 'dashboard.analysis.empty.selectSymbol': "Sรฉlectionnez une cible pour dรฉmarrer l'analyse", - 'dashboard.analysis.empty.selectSymbolDesc': "Sรฉlectionnez dans la liste d'actions auto-sรฉlectionnรฉe ou entrez le code sous-jacent pour obtenir un rapport d'analyse IA multidimensionnel", - 'dashboard.analysis.empty.startAnalysis': "Cliquez sur le bouton \"Dรฉmarrer l'analyse\" pour effectuer une analyse multidimensionnelle", - 'dashboard.analysis.empty.startAnalysisDesc': "Nous vous fournirons une analyse complรจte portant sur plusieurs dimensions telles que les fondamentaux, la technologie, l'actualitรฉ, le sentiment et le risque.", - 'dashboard.analysis.empty.noData': "Il n'y a actuellement aucune donnรฉe d'analyse {type}, veuillez d'abord effectuer une analyse complรจte", - 'dashboard.analysis.empty.noWatchlist': "Il n'y a actuellement aucun titre auto-sรฉlectionnรฉ", - 'dashboard.analysis.empty.noHistory': "Pas encore d'historique", - 'dashboard.analysis.empty.watchlistHint': "Il n'y a actuellement aucun stock auto-sรฉlectionnรฉ, veuillez d'abord", - 'dashboard.analysis.empty.noDebateData': "Aucune donnรฉe de dรฉbat pour l'instant", - 'dashboard.analysis.empty.noDecisionData': "Aucune donnรฉe de dรฉcision pour l'instant", - 'dashboard.analysis.empty.selectAgent': "Veuillez sรฉlectionner un agent pour afficher les rรฉsultats de l'analyse", - 'dashboard.analysis.loading.analyzing': 'Analyse, veuillez patienter...', - 'dashboard.analysis.loading.fundamental': 'Analyser les donnรฉes fondamentales...', - 'dashboard.analysis.loading.technical': 'Analyse des indicateurs techniques...', - 'dashboard.analysis.loading.news': "Analyser les donnรฉes d'actualitรฉ...", - 'dashboard.analysis.loading.sentiment': 'Analyser le sentiment du marchรฉ...', - 'dashboard.analysis.loading.risk': 'ร‰valuer le risque...', - 'dashboard.analysis.loading.debate': 'Le dรฉbat long-court est en cours...', - 'dashboard.analysis.loading.decision': 'Gรฉnรฉrer la dรฉcision finale...', - 'dashboard.analysis.score.overall': 'Note globale', - 'dashboard.analysis.score.recommendation': 'conseil en investissement', - 'dashboard.analysis.score.confidence': 'Confiance', - 'dashboard.analysis.dimension.fundamental': 'Fondamentaux', - 'dashboard.analysis.dimension.technical': 'technologie', - 'dashboard.analysis.dimension.news': 'Actualitรฉs', - 'dashboard.analysis.dimension.sentiment': 'รฉmotions', - 'dashboard.analysis.dimension.risk': 'risque', - 'dashboard.analysis.card.dimensionScores': 'Notes pour chaque dimension', - 'dashboard.analysis.card.overviewReport': "Rapport d'analyse complet", - 'dashboard.analysis.card.financialMetrics': 'indicateurs financiers', - 'dashboard.analysis.card.fundamentalReport': "Rapport d'analyse fondamentale", - 'dashboard.analysis.card.technicalIndicators': 'Indicateurs techniques', - 'dashboard.analysis.card.technicalReport': "rapport d'analyse technique", - 'dashboard.analysis.card.newsList': 'Actualitรฉs connexes', - 'dashboard.analysis.card.newsReport': "Rapport d'analyse de l'actualitรฉ", - 'dashboard.analysis.card.sentimentIndicators': 'indicateur de sentiment', - 'dashboard.analysis.card.sentimentReport': "Rapport d'analyse des sentiments", - 'dashboard.analysis.card.riskMetrics': 'indicateurs de risque', - 'dashboard.analysis.card.riskReport': "rapport d'รฉvaluation des risques", - 'dashboard.analysis.card.bullView': 'Vue haussiรจre (Taureau)', - 'dashboard.analysis.card.bearView': 'Vue baissiรจre (ours)', - 'dashboard.analysis.card.researchConclusion': 'Conclusion du chercheur', - 'dashboard.analysis.card.traderPlan': 'plan de commerรงant', - 'dashboard.analysis.card.riskDebate': 'Dรฉbat en commission des risques', - 'dashboard.analysis.card.finalDecision': 'Dรฉcision finale', - 'dashboard.analysis.card.tradePlanDetail': 'Dรฉtails du plan de trading', - 'dashboard.analysis.tradingPlan.entry_price': "Prix d'entrรฉe", - 'dashboard.analysis.tradingPlan.position_size': 'Taille du poste', - 'dashboard.analysis.tradingPlan.stop_loss': 'arrรชter les pertes', - 'dashboard.analysis.tradingPlan.take_profit': 'Profiter', - 'dashboard.analysis.label.confidence': 'Confiance', - 'dashboard.analysis.label.keyPoints': 'points essentiels', - 'dashboard.analysis.label.riskWarning': 'Avertissement de risque', - 'dashboard.analysis.risk.risky': 'Risquรฉ', - 'dashboard.analysis.risk.neutral': 'Point de vue neutre (Neutre)', - 'dashboard.analysis.risk.safe': 'Vue conservatrice (sรปr)', - 'dashboard.analysis.risk.conclusion': 'Conclusion', - 'dashboard.analysis.feature.fundamental': 'analyse fondamentale', - 'dashboard.analysis.feature.technical': 'analyse technique', - 'dashboard.analysis.feature.news': "analyse de l'actualitรฉ", - 'dashboard.analysis.feature.sentiment': 'analyse des sentiments', - 'dashboard.analysis.feature.risk': 'รฉvaluation des risques', - 'dashboard.analysis.watchlist.title': 'Ma sรฉlection de titres', - 'dashboard.analysis.watchlist.add': 'ajouter', - 'dashboard.analysis.watchlist.addStock': 'ajouter du stock', - 'dashboard.analysis.modal.addStock.title': 'Ajouter des actions facultatives', - 'dashboard.analysis.modal.addStock.confirm': "D'accord", - 'dashboard.analysis.modal.addStock.cancel': 'Annuler', - 'dashboard.analysis.modal.addStock.market': 'type de marchรฉ', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'Veuillez sรฉlectionner un marchรฉ', - 'dashboard.analysis.modal.addStock.marketRequired': 'Veuillez sรฉlectionner le type de marchรฉ', - 'dashboard.analysis.modal.addStock.symbol': 'Code de stock', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'Par exempleย :ย AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'Veuillez entrer le code de stock', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'Rechercher le code ou le nom de la cible', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Recherchez ou saisissez le code sous-jacent (par exempleย : AAPL, BTC/USDT, EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': "Prend en charge la recherche d'objets dans la base de donnรฉes ou la saisie directe du code (le systรจme obtiendra automatiquement le nom)", - 'dashboard.analysis.modal.addStock.search': 'Rechercher', - 'dashboard.analysis.modal.addStock.searchResults': 'Rรฉsultats de la recherche', - 'dashboard.analysis.modal.addStock.hotSymbols': 'Cibles populaires', - 'dashboard.analysis.modal.addStock.noHotSymbols': "Aucune cible populaire pour l'instant", - 'dashboard.analysis.modal.addStock.selectedSymbol': 'Sรฉlectionnรฉ', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': "Veuillez d'abord sรฉlectionner une cible", - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': "Veuillez sรฉlectionner une cible ou saisir d'abord le code cible", - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Veuillez entrer le code cible', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': "Veuillez d'abord sรฉlectionner le type de marchรฉ", - 'dashboard.analysis.modal.addStock.searchFailed': 'La recherche a รฉchouรฉ, veuillez rรฉessayer plus tard', - 'dashboard.analysis.modal.addStock.noSearchResults': 'Aucune cible correspondante trouvรฉe', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'Le systรจme obtiendra automatiquement le nom', - 'dashboard.analysis.modal.addStock.addDirectly': 'Ajouter directement', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Le nom sera rรฉcupรฉrรฉ automatiquement une fois ajoutรฉ', - 'dashboard.analysis.market.USStock': 'Actions amรฉricaines', - 'dashboard.analysis.market.Crypto': 'crypto-monnaie', - 'dashboard.analysis.market.Forex': 'Forex', - 'dashboard.analysis.market.Futures': 'Contrats ร  terme', - 'dashboard.analysis.modal.history.title': "Enregistrements d'analyse historique", - 'dashboard.analysis.modal.history.viewResult': 'Afficher les rรฉsultats', - 'dashboard.analysis.modal.history.completeTime': "temps d'achรจvement", - 'dashboard.analysis.modal.history.error': 'Erreur', - 'dashboard.analysis.status.pending': 'En attente', - 'dashboard.analysis.status.processing': 'Traitement', - 'dashboard.analysis.status.completed': 'Terminรฉ', - 'dashboard.analysis.status.failed': 'รฉchouรฉ', - 'dashboard.analysis.message.selectSymbol': "Veuillez d'abord sรฉlectionner la cible", - 'dashboard.analysis.message.taskCreated': "La tรขche d'analyse a รฉtรฉ crรฉรฉe et est exรฉcutรฉe en arriรจre-plan...", - 'dashboard.analysis.message.analysisComplete': 'Analyse terminรฉe', - 'dashboard.analysis.message.analysisCompleteCache': "Analyse terminรฉe (ร  l'aide des donnรฉes mises en cache)", - 'dashboard.analysis.message.analysisFailed': "L'analyse a รฉchouรฉ, veuillez rรฉessayer plus tard", - 'dashboard.analysis.message.addStockSuccess': 'Ajoutรฉ avec succรจs', - 'dashboard.analysis.message.addStockFailed': "L'ajout a รฉchouรฉ", - 'dashboard.analysis.message.removeStockSuccess': 'Supprimรฉ avec succรจs', - 'dashboard.analysis.message.removeStockFailed': 'ร‰chec de la suppression', - 'dashboard.analysis.message.resumingAnalysis': "Reprise de la tรขche d'analyse...", - 'dashboard.analysis.message.deleteSuccess': 'Supprimรฉ avec succรจs', - 'dashboard.analysis.message.deleteFailed': 'ร‰chec de la suppression', - 'dashboard.analysis.modal.history.delete': 'Supprimer', - 'dashboard.analysis.modal.history.deleteConfirm': "รŠtes-vous sรปr de vouloir supprimer cet enregistrement d'analyse ?", - 'dashboard.analysis.test': 'Magasin nยฐ {no}, route Gongzhuan', - 'dashboard.analysis.introduce': "Description de l'indicateur", - 'dashboard.analysis.total-sales': 'ventes totales', - 'dashboard.analysis.day-sales': 'Ventes quotidiennes moyennes๏ฟฅ', - 'dashboard.analysis.visits': 'Visites', - 'dashboard.analysis.visits-trend': 'Tendances du trafic', - 'dashboard.analysis.visits-ranking': 'Classement des visites en magasin', - 'dashboard.analysis.day-visits': 'Visites quotidiennes', - 'dashboard.analysis.week': 'Hebdomadaire, annรฉe sur annรฉe', - 'dashboard.analysis.day': 'Annรฉe aprรจs annรฉe', - 'dashboard.analysis.payments': 'Nombre de paiements', - 'dashboard.analysis.conversion-rate': 'taux de conversion', - 'dashboard.analysis.operational-effect': "Effets sur l'activitรฉ opรฉrationnelle", - 'dashboard.analysis.sales-trend': 'tendances des ventes', - 'dashboard.analysis.sales-ranking': 'Classement des ventes en magasin', - 'dashboard.analysis.all-year': "Toute l'annรฉe", - 'dashboard.analysis.all-month': 'ce mois-ci', - 'dashboard.analysis.all-week': 'cette semaine', - 'dashboard.analysis.all-day': "aujourd'hui", - 'dashboard.analysis.search-users': "Nombre d'utilisateurs de recherche", - 'dashboard.analysis.per-capita-search': 'Recherches par habitant', - 'dashboard.analysis.online-top-search': 'Recherches populaires en ligne', - 'dashboard.analysis.the-proportion-of-sales': 'Proportion de la catรฉgorie de ventes', - 'dashboard.analysis.dropdown-option-one': 'Premiรจre opรฉration', - 'dashboard.analysis.dropdown-option-two': 'Opรฉration 2', - 'dashboard.analysis.channel.all': 'Toutes les chaรฎnes', - 'dashboard.analysis.channel.online': 'en ligne', - 'dashboard.analysis.channel.stores': 'magasin', - 'dashboard.analysis.sales': 'ventes', - 'dashboard.analysis.traffic': 'flux de passagers', - 'dashboard.analysis.table.rank': 'Classement', - 'dashboard.analysis.table.search-keyword': 'Rechercher des mots-clรฉs', - 'dashboard.analysis.table.users': "Nombre d'utilisateurs", - 'dashboard.analysis.table.weekly-range': 'Augmentation hebdomadaire', - 'dashboard.indicator.selectSymbol': 'Sรฉlectionnez ou saisissez le code sous-jacent', - 'dashboard.indicator.emptyWatchlistHint': "Il n'y a actuellement aucun titre auto-sรฉlectionnรฉ, veuillez d'abord les ajouter", - 'dashboard.indicator.hint.selectSymbol': "Veuillez sรฉlectionner une cible pour dรฉmarrer l'analyse", - 'dashboard.indicator.hint.selectSymbolDesc': 'Sรฉlectionnez ou entrez un code boursier dans la zone de recherche ci-dessus pour afficher les graphiques K-line et les indicateurs techniques.', - 'dashboard.indicator.retry': 'Rรฉessayez', - 'dashboard.indicator.panel.title': 'Indicateurs techniques', - 'dashboard.indicator.panel.realtimeOn': 'Dรฉsactivez les mises ร  jour en temps rรฉel', - 'dashboard.indicator.panel.realtimeOff': 'Activer les mises ร  jour en temps rรฉel', - 'dashboard.indicator.panel.themeLight': 'Passer au thรจme sombre', - 'dashboard.indicator.panel.themeDark': 'Passer au thรจme clair', - 'dashboard.indicator.section.enabled': 'Activรฉ', - 'dashboard.indicator.section.added': "Indicateurs que j'ai ajoutรฉs", - 'dashboard.indicator.section.custom': 'Indicateurs crรฉรฉs par vous-mรชme', - 'dashboard.indicator.section.bought': "Indicateurs que j'ai achetรฉs", - 'dashboard.indicator.section.myCreated': "Indicateurs que j'ai crรฉรฉs", - 'dashboard.indicator.empty': "Il n'y a pas encore d'indicateur, veuillez d'abord ajouter ou crรฉer un indicateur", - 'dashboard.indicator.buy': "indicateur d'achat", - 'dashboard.indicator.action.start': 'commencer', - 'dashboard.indicator.action.stop': 'Fermer', - 'dashboard.indicator.action.edit': 'Modifier', - 'dashboard.indicator.action.delete': 'Supprimer', - 'dashboard.indicator.action.backtest': 'backtest', - 'dashboard.indicator.status.normal': 'normal', - 'dashboard.indicator.status.normalPermanent': 'Normal (valable en permanence)', - 'dashboard.indicator.status.expired': 'Expirรฉ', - 'dashboard.indicator.expiry.permanent': 'Valable en permanence', - 'dashboard.indicator.expiry.noExpiry': "Pas de dรฉlai d'expiration", - 'dashboard.indicator.expiry.expired': 'Expirรฉย :ย {date}', - 'dashboard.indicator.expiry.expiresOn': "Heure d'expirationย :ย {date}", - 'dashboard.indicator.delete.confirmTitle': 'Confirmer la suppression', - 'dashboard.indicator.delete.confirmContent': "รŠtes-vous sรปr de vouloir supprimer l'indicateur \"{name}\"ย ? Cette opรฉration est irrรฉversible.", - 'dashboard.indicator.delete.confirmOk': 'Supprimer', - 'dashboard.indicator.delete.confirmCancel': 'Annuler', - 'dashboard.indicator.delete.success': 'Supprimer avec succรจs', - 'dashboard.indicator.delete.failed': 'ร‰chec de la suppression', - 'dashboard.indicator.save.success': 'Enregistrรฉ avec succรจs', - 'dashboard.indicator.save.failed': "ร‰chec de l'enregistrement", - 'dashboard.indicator.error.loadWatchlistFailed': 'ร‰chec du chargement des stocks facultatifs', - 'dashboard.indicator.error.chartNotReady': "Le composant graphique n'est pas initialisรฉ. Veuillez d'abord sรฉlectionner la cible et attendre que le graphique se charge.", - 'dashboard.indicator.error.chartMethodNotReady': "La mรฉthode du composant graphique n'est pas prรชte, veuillez rรฉessayer plus tard", - 'dashboard.indicator.error.chartExecuteNotReady': "La mรฉthode d'exรฉcution du composant graphique n'est pas prรชte, veuillez rรฉessayer plus tard", - 'dashboard.indicator.error.parseFailed': "Impossible d'analyser le code Python", - 'dashboard.indicator.error.parseFailedCheck': "Impossible d'analyser le code Python, veuillez vรฉrifier le format du code", - 'dashboard.indicator.error.addIndicatorFailed': "ร‰chec de l'ajout de l'indicateur", - 'dashboard.indicator.error.runIndicatorFailed': "L'indicateur de fonctionnement a รฉchouรฉ", - 'dashboard.indicator.error.pleaseLogin': "Veuillez d'abord vous connecter", - 'dashboard.indicator.error.loadDataFailed': 'Le chargement des donnรฉes a รฉchouรฉ', - 'dashboard.indicator.error.loadDataFailedDesc': 'Veuillez vรฉrifier la connexion rรฉseau', - 'dashboard.indicator.error.pythonEngineFailed': "Le moteur Python n'a pas pu se charger et la fonction d'indicateur peut ne pas รชtre disponible.", - 'dashboard.indicator.error.chartInitFailed': "L'initialisation du graphique a รฉchouรฉ", - 'dashboard.indicator.warning.enterCode': "Veuillez d'abord saisir le code de l'indicateur", - 'dashboard.indicator.warning.pyodideLoadFailed': "Le moteur Python n'a pas pu se charger", - 'dashboard.indicator.warning.pyodideLoadFailedDesc': "Cette fonctionnalitรฉ n'est pas disponible dans votre rรฉgion ou environnement rรฉseau actuel", - 'dashboard.indicator.warning.chartNotInitialized': "Le graphique n'est pas initialisรฉ et l'outil de dessin au trait ne peut pas รชtre utilisรฉ.", - 'dashboard.indicator.success.runIndicator': "L'indicateur s'exรฉcute avec succรจs", - 'dashboard.indicator.success.clearDrawings': 'Tous les dessins au trait effacรฉs', - 'dashboard.indicator.sma': 'SMA (combinaison de moyenne mobile)', - 'dashboard.indicator.ema': 'EMA (combinaison de moyennes mobiles exponentielles)', - 'dashboard.indicator.rsi': 'RSI (force relative)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'Bandes de Bollinger', - 'dashboard.indicator.atr': 'ATR (plage rรฉelle moyenne)', - 'dashboard.indicator.cci': 'CCI (indice des canaux de matiรจres premiรจres)', - 'dashboard.indicator.williams': 'Williams %R (indicateur Williams)', - 'dashboard.indicator.mfi': 'IMF (indice de flux monรฉtaire)', - 'dashboard.indicator.adx': 'ADX (indice de tendance moyen)', - 'dashboard.indicator.obv': "OBV (vague d'รฉnergie)", - 'dashboard.indicator.adosc': "ADOSC (oscillateur d'accumulation/rรฉpartition)", - 'dashboard.indicator.ad': "AD (ligne d'accumulation/distribution)", - 'dashboard.indicator.kdj': 'KDJ (indicateur stochastique)', - 'dashboard.indicator.signal.buy': 'ACHETER', - 'dashboard.indicator.signal.sell': 'VENDRE', - 'dashboard.indicator.signal.supertrendBuy': 'Acheter SuperTrend', - 'dashboard.indicator.signal.supertrendSell': 'Vente SuperTrend', - 'dashboard.indicator.chart.kline': 'Ligne K', - 'dashboard.indicator.chart.volume': 'Volume', - 'dashboard.indicator.chart.uptrend': 'Tendance ร  la hausse', - 'dashboard.indicator.chart.downtrend': 'Tendance ร  la baisse', - 'dashboard.indicator.tooltip.time': 'temps', - 'dashboard.indicator.tooltip.open': 'ouvert', - 'dashboard.indicator.tooltip.close': 'recevoir', - 'dashboard.indicator.tooltip.high': 'haut', - 'dashboard.indicator.tooltip.low': 'faible', - 'dashboard.indicator.tooltip.volume': 'Volume', - 'dashboard.indicator.drawing.line': 'segment de ligne', - 'dashboard.indicator.drawing.horizontalLine': 'ligne horizontale', - 'dashboard.indicator.drawing.verticalLine': 'ligne verticale', - 'dashboard.indicator.drawing.ray': 'rayon', - 'dashboard.indicator.drawing.straightLine': 'ligne droite', - 'dashboard.indicator.drawing.parallelLine': 'lignes parallรจles', - 'dashboard.indicator.drawing.priceLine': 'ligne de prix', - 'dashboard.indicator.drawing.priceChannel': 'canal de prix', - 'dashboard.indicator.drawing.fibonacciLine': 'Lignes de Fibonacci', - 'dashboard.indicator.drawing.clearAll': 'Effacer tous les dessins au trait', - 'dashboard.indicator.market.USStock': 'Actions amรฉricaines', - 'dashboard.indicator.market.Crypto': 'crypto-monnaie', - 'dashboard.indicator.market.Forex': 'Forex', - 'dashboard.indicator.market.Futures': 'Contrats ร  terme', - 'dashboard.indicator.create': 'Crรฉer un indicateur', - 'dashboard.indicator.editor.title': 'Crรฉer/modifier des indicateurs', - 'dashboard.indicator.editor.name': "Nom de l'indicateur", - 'dashboard.indicator.editor.nameRequired': "Veuillez saisir le nom de l'indicateur", - 'dashboard.indicator.editor.namePlaceholder': "Veuillez saisir le nom de l'indicateur", - 'dashboard.indicator.editor.description': "Description de l'indicateur", - 'dashboard.indicator.editor.descriptionPlaceholder': "Veuillez saisir une description de l'indicateur (facultatif)", - 'dashboard.indicator.editor.code': 'Code Python', - 'dashboard.indicator.editor.codeRequired': "Veuillez entrer le code de l'indicateur", - 'dashboard.indicator.editor.codePlaceholder': 'Veuillez saisir le code Python', - 'dashboard.indicator.editor.run': 'courir', - 'dashboard.indicator.editor.runHint': "Cliquez sur le bouton Exรฉcuter pour prรฉvisualiser l'effet de l'indicateur sur le graphique K-line", - 'dashboard.indicator.editor.guide': 'Guide de dรฉveloppement', - 'dashboard.indicator.editor.guideTitle': "Guide de dรฉveloppement d'indicateurs Python", - 'dashboard.indicator.editor.save': 'enregistrer', - 'dashboard.indicator.editor.cancel': 'Annuler', - 'dashboard.indicator.editor.unnamed': 'Indicateur sans nom', - 'dashboard.indicator.editor.publishToCommunity': 'Publier sur la communautรฉ', - 'dashboard.indicator.editor.publishToCommunityHint': 'Une fois publiรฉ, les autres utilisateurs peuvent visualiser et utiliser votre indicateur dans la communautรฉ', - 'dashboard.indicator.editor.indicatorType': "Type d'indicateur", - 'dashboard.indicator.editor.indicatorTypeRequired': "Veuillez sรฉlectionner le type d'indicateur", - 'dashboard.indicator.editor.indicatorTypePlaceholder': "Veuillez sรฉlectionner le type d'indicateur", - 'dashboard.indicator.editor.previewImage': 'Aperรงu', - 'dashboard.indicator.editor.uploadImage': 'Tรฉlรฉcharger des photos', - 'dashboard.indicator.editor.previewImageHint': 'Taille recommandรฉeย : 800ย xย 400, pas plus de 2ย Mo', - 'dashboard.indicator.editor.pricing': 'Prix de vente (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'gratuit', - 'dashboard.indicator.editor.pricingType.permanent': 'permanent', - 'dashboard.indicator.editor.pricingType.monthly': 'paiement mensuel', - 'dashboard.indicator.editor.price': 'prix', - 'dashboard.indicator.editor.priceRequired': 'Veuillez entrer le prix', - 'dashboard.indicator.editor.pricePlaceholder': 'Veuillez entrer le prix', - 'dashboard.indicator.editor.pricingHint': "Bien que le prix des indicateurs gratuits soit de 0, la plateforme vous rรฉcompensera (QDT) en fonction de votre utilisation de l'indicateur et de votre taux d'รฉloges.", - 'dashboard.indicator.editor.aiGenerate': 'Gรฉnรฉration intelligente', - 'dashboard.indicator.editor.aiPromptPlaceholder': "Dites-moi vos idรฉes et je gรฉnรฉrerai le code de l'indicateur Python pour vous", - 'dashboard.indicator.editor.aiGenerateBtn': "Code gรฉnรฉrรฉ par l'IA", - 'dashboard.indicator.editor.aiPromptRequired': 'Veuillez entrer vos pensรฉes', - 'dashboard.indicator.editor.aiGenerateSuccess': 'Gรฉnรฉration de code rรฉussie', - 'dashboard.indicator.editor.aiGenerateError': 'ร‰chec de la gรฉnรฉration du code, veuillez rรฉessayer plus tard', - 'dashboard.indicator.backtest.title': 'Backtest des indicateurs', - 'dashboard.indicator.backtest.config': 'Paramรจtres de backtest', - 'dashboard.indicator.backtest.startDate': 'date de dรฉbut', - 'dashboard.indicator.backtest.endDate': 'date de fin', - 'dashboard.indicator.backtest.selectStartDate': 'Sรฉlectionnez la date de dรฉbut', - 'dashboard.indicator.backtest.selectEndDate': 'Sรฉlectionnez la date de fin', - 'dashboard.indicator.backtest.startDateRequired': 'Veuillez sรฉlectionner une date de dรฉbut', - 'dashboard.indicator.backtest.endDateRequired': 'Veuillez sรฉlectionner une date de fin', - 'dashboard.indicator.backtest.initialCapital': 'Capital initial', - 'dashboard.indicator.backtest.initialCapitalRequired': 'Veuillez saisir les fonds initiaux', - 'dashboard.indicator.backtest.commission': 'Frais de traitement', - 'dashboard.indicator.backtest.leverage': 'Ratio de levier', - 'dashboard.indicator.backtest.tradeDirection': 'Orientation commerciale', - 'dashboard.indicator.backtest.longOnly': 'Allez-y longtemps', - 'dashboard.indicator.backtest.shortOnly': 'court', - 'dashboard.indicator.backtest.both': 'Bidirectionnel', - 'dashboard.indicator.backtest.run': 'Commencer le backtest', - 'dashboard.indicator.backtest.rerun': 'Backtester ร  nouveau', - 'dashboard.indicator.backtest.close': 'Fermer', - 'dashboard.indicator.backtest.running': 'Backtest des indicateurs en cours...', - 'dashboard.indicator.backtest.results': 'Rรฉsultats du backtest', - 'dashboard.indicator.backtest.totalReturn': 'rendement total', - 'dashboard.indicator.backtest.annualReturn': 'revenu annualisรฉ', - 'dashboard.indicator.backtest.maxDrawdown': 'prรฉlรจvement maximum', - 'dashboard.indicator.backtest.sharpeRatio': 'Rapport de nettetรฉ', - 'dashboard.indicator.backtest.winRate': 'taux de rรฉussite', - 'dashboard.indicator.backtest.profitFactor': 'ratio profits/pertes', - 'dashboard.indicator.backtest.totalTrades': 'Nombre de transactions', - 'dashboard.indicator.totalReturn': 'rendement total', - 'dashboard.indicator.annualReturn': 'taux de rendement annualisรฉ', - 'dashboard.indicator.maxDrawdown': 'prรฉlรจvement maximum', - 'dashboard.indicator.sharpeRatio': 'Rapport de nettetรฉ', - 'dashboard.indicator.winRate': 'taux de rรฉussite', - 'dashboard.indicator.profitFactor': 'ratio profits/pertes', - 'dashboard.indicator.totalTrades': 'nombre total de transactions', - 'dashboard.indicator.backtest.totalCommission': 'frais de traitement totaux', - 'dashboard.indicator.backtest.equityCurve': 'courbe des taux', - 'dashboard.indicator.backtest.strategy': "Revenu de l'indicateur", - 'dashboard.indicator.backtest.benchmark': 'Rendement de rรฉfรฉrence', - 'dashboard.indicator.backtest.tradeHistory': 'historique des transactions', - 'dashboard.indicator.backtest.tradeTime': 'temps', - 'dashboard.indicator.backtest.tradeType': 'Tapez', - 'dashboard.indicator.backtest.buy': 'acheter', - 'dashboard.indicator.backtest.sell': 'vendre', - 'dashboard.indicator.backtest.liquidation': 'Liquidation', - 'dashboard.indicator.backtest.openLong': 'Ouvert longtemps', - 'dashboard.indicator.backtest.closeLong': 'Pinduo', - 'dashboard.indicator.backtest.closeLongStop': 'Prรจs du long (stop loss)', - 'dashboard.indicator.backtest.closeLongProfit': 'Fermez davantage (prenez des bรฉnรฉfices)', - 'dashboard.indicator.backtest.addLong': 'Ajouter une position longue', - 'dashboard.indicator.backtest.openShort': 'Ouvert court', - 'dashboard.indicator.backtest.closeShort': 'vide', - 'dashboard.indicator.backtest.closeShortStop': 'Fermer (stopper la perte)', - 'dashboard.indicator.backtest.closeShortProfit': 'Fermer (prendre des bรฉnรฉfices)', - 'dashboard.indicator.backtest.addShort': 'Ajouter une position courte', - 'dashboard.indicator.backtest.price': 'prix', - 'dashboard.indicator.backtest.amount': 'Quantitรฉ', - 'dashboard.indicator.backtest.balance': 'Solde du compte', - 'dashboard.indicator.backtest.profit': 'Profits et pertes', - 'dashboard.indicator.backtest.success': 'Backtest terminรฉ', - 'dashboard.indicator.backtest.failed': 'ร‰chec du backtest, veuillez rรฉessayer plus tard', - 'dashboard.indicator.backtest.noIndicatorCode': "Il n'y a pas de code backtestable pour cet indicateur", - 'dashboard.indicator.backtest.noSymbol': "Veuillez d'abord sรฉlectionner la cible de la transaction", - 'dashboard.indicator.backtest.dateRangeExceeded': 'La plage de temps du backtest dรฉpasse la limiteย :ย {timeframe} la pรฉriode peut รชtre backtestรฉe au maximumย {maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'Centre de documentation', - 'dashboard.docs.search.placeholder': 'Rechercher des documents...', - 'dashboard.docs.category.all': 'Tout', - 'dashboard.docs.category.guide': 'Guide de dรฉveloppement', - 'dashboard.docs.category.api': 'Documentation API', - 'dashboard.docs.category.tutorial': 'Tutoriel', - 'dashboard.docs.category.faq': 'FAQ', - 'dashboard.docs.featured.title': 'Documentation recommandรฉe', - 'dashboard.docs.featured.tag': 'Recommandรฉ', - 'dashboard.docs.list.views': 'Parcourir', - 'dashboard.docs.list.author': 'Auteur', - 'dashboard.docs.list.empty': "Aucun document pour l'instant", - 'dashboard.docs.list.backToAll': 'Retour ร  tous les documents', - 'dashboard.docs.list.total': '{count}ย documents au total', - 'dashboard.docs.detail.back': 'Retour ร  la liste des documents', - 'dashboard.docs.detail.updatedAt': 'mis ร  jour sur', - 'dashboard.docs.detail.related': 'Documents associรฉs', - 'dashboard.docs.detail.notFound': "Le document n'existe pas", - 'dashboard.docs.detail.error': "Le document n'existe pas ou a รฉtรฉ supprimรฉ", - 'dashboard.docs.search.result': 'Rรฉsultats de la recherche', - 'dashboard.docs.search.keyword': 'mots-clรฉs', - 'community.filter.indicatorType': "Type d'indicateur", - 'community.filter.all': 'Tout', - 'community.filter.other': 'Autres options', - 'community.filter.pricing': 'Type de prix', - 'community.filter.allPricing': 'Tous les tarifs', - 'community.filter.sortBy': 'Trier par', - 'community.filter.search': 'Rechercher', - 'community.filter.searchPlaceholder': 'Rechercher le nom de la mรฉtrique', - 'community.indicatorType.trend': 'Type de tendance', - 'community.indicatorType.momentum': "type d'รฉlan", - 'community.indicatorType.volatility': 'Volatilitรฉ', - 'community.indicatorType.volume': 'Volume', - 'community.indicatorType.custom': 'Personnaliser', - 'community.pricing.free': 'gratuit', - 'community.pricing.paid': 'Payer', - 'community.sort.downloads': 'Tรฉlรฉchargements', - 'community.sort.rating': 'Note', - 'community.sort.newest': 'Derniรจres versions', - 'community.pagination.total': '{total} indicateurs au total', - 'community.noDescription': 'Pas encore de description', - 'community.detail.type': 'Tapez', - 'community.detail.pricing': 'Tarifs', - 'community.detail.rating': 'Note', - 'community.detail.downloads': 'Tรฉlรฉchargements', - 'community.detail.author': 'Auteur', - 'community.detail.description': 'Prรฉsentation', - 'community.detail.detailContent': 'Description dรฉtaillรฉe', - 'community.detail.backtestStats': 'Statistiques de backtest', - 'community.action.purchase': "indicateur d'achat", - 'community.action.addToMyIndicators': 'Ajouter ร  mes indicateurs', - 'community.action.favorite': 'Collecte', - 'community.action.unfavorite': 'Annuler les favoris', - 'community.action.buyNow': 'Acheter maintenant', - 'community.action.renew': 'Renouvellement', - 'community.purchase.price': 'prix', - 'community.purchase.permanent': 'permanent', - 'community.purchase.monthly': 'mois', - 'community.purchase.confirmBuy': 'Confirmer pour acheter cet indicateur ({price} QDT)ย ?', - 'community.purchase.confirmRenew': 'Confirmer le renouvellement de cet indicateur ({price} QDT/mois)ย ?', - 'community.purchase.confirmFree': 'Confirmer pour ajouter cet indicateur gratuit ?', - 'community.purchase.confirmTitle': "Confirmer l'action", - 'community.purchase.owned': 'Vous avez achetรฉ cet indicateur (valable en permanence)', - 'community.purchase.ownIndicator': "Il s'agit de la mรฉtrique que vous avez publiรฉe", - 'community.purchase.expired': 'Votre abonnement a expirรฉ', - 'community.purchase.expiresOn': "Heure d'expirationย :ย {date}", - 'community.tabs.detail': "Dรฉtails de l'indicateur", - 'community.tabs.backtest': 'Donnรฉes de backtest', - 'community.tabs.ratings': "Avis d'utilisateurs", - 'community.rating.myRating': 'Ma note', - 'community.rating.stars': '{count}ย รฉtoiles', - 'community.rating.commentPlaceholder': 'Partagez votre expรฉrience...', - 'community.rating.submit': 'Soumettre une note', - 'community.rating.modify': 'Modifier', - 'community.rating.saveModify': 'Enregistrer les modifications', - 'community.rating.cancel': 'Annuler', - 'community.rating.selectRating': 'Veuillez sรฉlectionner une note', - 'community.rating.success': 'ร‰valuation rรฉussie', - 'community.rating.modifySuccess': 'Avis modifiรฉ avec succรจs', - 'community.rating.failed': 'ร‰chec de la notation', - 'community.rating.noRatings': 'Pas encore de commentaires', - 'community.backtest.note': 'Les donnรฉes ci-dessus sont des rรฉsultats de backtest historiques et sont fournies ร  titre de rรฉfรฉrence uniquement et ne reprรฉsentent pas les bรฉnรฉfices futurs.', - 'community.backtest.noData': "Aucune donnรฉe de backtest pour l'instant", - 'community.backtest.uploadHint': "L'auteur n'a pas encore tรฉlรฉchargรฉ les donnรฉes de backtest", - 'community.message.loadFailed': 'ร‰chec du chargement de la liste des indicateurs', - 'community.message.purchaseProcessing': "Traitement de la demande d'achat...", - 'community.message.downloadSuccess': 'La mรฉtrique a รฉtรฉ ajoutรฉe ร  ma liste de mรฉtriques', - 'community.message.favoriteSuccess': 'Collecte rรฉussie', - 'community.message.unfavoriteSuccess': 'Annuler la collecte avec succรจs', - 'community.message.operationSuccess': 'Opรฉration rรฉussie', - 'community.message.operationFailed': "L'opรฉration a รฉchouรฉ", - 'community.banner.readOnly': 'Lecture seule', - 'community.banner.loginHint': 'Pour vous connecter ou vous inscrire, veuillez cliquer sur le bouton pour accรฉder ร  une page indรฉpendante afin d\'รฉviter les problรจmes CSRF', - 'community.banner.jumpButton': 'Aller ร  Connexion/Inscription', - 'dashboard.totalEquity': 'capitaux propres totaux', - 'dashboard.totalPnL': 'Total des profits et pertes', - 'dashboard.aiStrategies': "Stratรฉgie d'IA", - 'dashboard.indicatorStrategies': 'Stratรฉgie des indicateurs', - 'dashboard.running': 'Courir', - 'dashboard.pnlHistory': 'profits et pertes historiques', - 'dashboard.strategyPerformance': 'Ratio de profits et pertes de la stratรฉgie', - 'dashboard.recentTrades': 'transactions rรฉcentes', - 'dashboard.currentPositions': 'Poste actuel', - 'dashboard.table.time': 'temps', - 'dashboard.table.strategy': 'Nom de la stratรฉgie', - 'dashboard.table.symbol': 'Cible', - 'dashboard.table.type': 'Tapez', - 'dashboard.table.side': 'direction', - 'dashboard.table.size': 'Intรฉrรชt ouvert', - 'dashboard.table.entryPrice': "cours d'ouverture moyen", - 'dashboard.table.price': 'prix', - 'dashboard.table.amount': 'Quantitรฉ', - 'dashboard.table.profit': 'Profits et pertes', - 'dashboard.pendingOrders': 'Historique d\'exรฉcution des ordres', - 'dashboard.totalOrders': 'Total {total} ordres', - 'dashboard.viewError': 'Voir l\'erreur', - 'dashboard.filled': 'Rempli', - 'dashboard.orderTable.time': 'Heure de crรฉation', - 'dashboard.orderTable.strategy': 'Stratรฉgie', - 'dashboard.orderTable.symbol': 'Paire de trading', - 'dashboard.orderTable.signalType': 'Type de signal', - 'dashboard.orderTable.amount': 'Quantitรฉ', - 'dashboard.orderTable.price': 'Prix de remplissage', - 'dashboard.orderTable.status': 'Statut', - 'dashboard.orderTable.executedAt': 'Heure d\'exรฉcution', - 'dashboard.signalType.openLong': 'Ouvrir Long', - 'dashboard.signalType.openShort': 'Ouvrir Short', - 'dashboard.signalType.closeLong': 'Fermer Long', - 'dashboard.signalType.closeShort': 'Fermer Short', - 'dashboard.signalType.addLong': 'Ajouter Long', - 'dashboard.signalType.addShort': 'Ajouter Short', - 'dashboard.status.pending': 'En attente', - 'dashboard.status.processing': 'En cours', - 'dashboard.status.completed': 'Terminรฉ', - 'dashboard.status.failed': 'ร‰chouรฉ', - 'dashboard.status.cancelled': 'Annulรฉ', - 'dashboard.table.pnl': 'profit ou perte non rรฉalisรฉ', - 'form.basic-form.basic.title': 'forme de base', - 'form.basic-form.basic.description': "Les pages de formulaire sont utilisรฉes pour collecter ou vรฉrifier les informations des utilisateurs. Les formulaires de base sont couramment utilisรฉs dans des scรฉnarios de formulaire comportant peu d'รฉlรฉments de donnรฉes.", - 'form.basic-form.title.label': 'Titre', - 'form.basic-form.title.placeholder': "Donnez un nom ร  l'objectif", - 'form.basic-form.title.required': 'Veuillez entrer un titre', - 'form.basic-form.date.label': 'Date de dรฉbut et de fin', - 'form.basic-form.placeholder.start': 'date de dรฉbut', - 'form.basic-form.placeholder.end': 'date de fin', - 'form.basic-form.date.required': 'Veuillez sรฉlectionner les dates de dรฉbut et de fin', - 'form.basic-form.goal.label': "Description de l'objectif", - 'form.basic-form.goal.placeholder': 'Veuillez saisir vos objectifs de travail par รฉtapes', - 'form.basic-form.goal.required': "Veuillez saisir une description de l'objectif", - 'form.basic-form.standard.label': 'mesurer', - 'form.basic-form.standard.placeholder': 'Veuillez saisir des statistiques', - 'form.basic-form.standard.required': 'Veuillez saisir des statistiques', - 'form.basic-form.client.label': 'Client', - 'form.basic-form.client.required': 'Veuillez dรฉcrire les clients que vous servez', - 'form.basic-form.label.tooltip': 'destinataires de services cibles', - 'form.basic-form.client.placeholder': 'Veuillez dรฉcrire les clients que vous servez, les clients internes directement @nom/numรฉro de poste', - 'form.basic-form.invites.label': 'Inviter des rรฉviseurs', - 'form.basic-form.invites.placeholder': "Veuillez directement @nom/numรฉro d'employรฉ, vous pouvez inviter jusqu'ร  5 personnes", - 'form.basic-form.weight.label': 'poids', - 'form.basic-form.weight.placeholder': 'Veuillez entrer', - 'form.basic-form.public.label': 'public cible', - 'form.basic-form.label.help': 'Les clients et les รฉvaluateurs sont partagรฉs par dรฉfaut', - 'form.basic-form.radio.public': 'publique', - 'form.basic-form.radio.partially-public': 'Partiellement public', - 'form.basic-form.radio.private': 'privรฉ', - 'form.basic-form.publicUsers.placeholder': 'ouvert ร ', - 'form.basic-form.option.A': 'Collรจgue 1', - 'form.basic-form.option.B': 'Collรจgue 2', - 'form.basic-form.option.C': 'Collรจgue trois', - 'form.basic-form.email.required': 'Veuillez entrer votre adresse e-mailย !', - 'form.basic-form.email.wrong-format': "Le format de l'adresse e-mail est incorrectย !", - 'form.basic-form.userName.required': "Veuillez entrer votre nom d'utilisateurย !", - 'form.basic-form.password.required': 'Veuillez entrer votre mot de passeย !', - 'form.basic-form.password.twice': 'Les mots de passe saisis deux fois ne correspondent pasย !', - 'form.basic-form.strength.msg': 'Veuillez saisir au moins 6 caractรจres. Veuillez ne pas utiliser de mots de passe faciles ร  deviner.', - 'form.basic-form.strength.strong': 'Forceย : Forte', - 'form.basic-form.strength.medium': 'Forceย : moyenne', - 'form.basic-form.strength.short': 'Force : trop courte', - 'form.basic-form.confirm-password.required': 'Veuillez confirmer votre mot de passeย !', - 'form.basic-form.phone-number.required': 'Veuillez entrer votre numรฉro de tรฉlรฉphone portableย !', - 'form.basic-form.phone-number.wrong-format': 'Le format du numรฉro de tรฉlรฉphone portable est erronรฉย !', - 'form.basic-form.verification-code.required': 'Veuillez entrer le code de vรฉrificationย !', - 'form.basic-form.form.get-captcha': 'Obtenir le code de vรฉrification', - 'form.basic-form.captcha.second': 'secondes', - 'form.basic-form.form.optional': '(facultatif)', - 'form.basic-form.form.submit': 'Soumettre', - 'form.basic-form.form.save': 'enregistrer', - 'form.basic-form.email.placeholder': 'Courriel', - 'form.basic-form.password.placeholder': "Mot de passe d'au moins 6 caractรจres, sensible ร  la casse", - 'form.basic-form.confirm-password.placeholder': 'Confirmer le mot de passe', - 'form.basic-form.phone-number.placeholder': 'Numรฉro de tรฉlรฉphone portable', - 'form.basic-form.verification-code.placeholder': 'Code de vรฉrification', - 'result.success.title': 'Soumission rรฉussie', - 'result.success.description': "La page de rรฉsultats de soumission est utilisรฉe pour renvoyer les rรฉsultats de traitement d'une sรฉrie de tรขches opรฉrationnelles. S'il ne s'agit que d'une opรฉration simple, utilisez le retour d'invite global du message. Cette zone de texte peut afficher des instructions supplรฉmentaires simples. S'il est nรฉcessaire d'afficher des ยซ documents ยป, la zone grise ci-dessous peut afficher des contenus plus complexes.", - 'result.success.operate-title': 'Nom du projet', - 'result.success.operate-id': 'ID du projet', - 'result.success.principal': 'responsable', - 'result.success.operate-time': 'Temps effectif', - 'result.success.step1-title': 'Crรฉer un projet', - 'result.success.step1-operator': 'Qu Lili', - 'result.success.step2-title': 'Examen prรฉliminaire du ministรจre', - 'result.success.step2-operator': 'Zhou Maomao', - 'result.success.step2-extra': 'Urgent', - 'result.success.step3-title': 'examen financier', - 'result.success.step4-title': 'Terminรฉ', - 'result.success.btn-return': 'Retour ร  la liste', - 'result.success.btn-project': 'Afficher les articles', - 'result.success.btn-print': 'Imprimer', - 'result.fail.error.title': 'ร‰chec de la soumission', - 'result.fail.error.description': 'Veuillez vรฉrifier et modifier les informations suivantes avant de soumettre ร  nouveau.', - 'result.fail.error.hint-title': 'Le contenu que vous avez soumis contient les erreurs suivantesย :', - 'result.fail.error.hint-text1': 'Votre compte a รฉtรฉ gelรฉ', - 'result.fail.error.hint-btn1': 'Dรฉcongeler immรฉdiatement', - 'result.fail.error.hint-text2': "Votre compte n'est pas encore รฉligible pour postuler", - 'result.fail.error.hint-btn2': 'Mettre ร  niveau maintenant', - 'result.fail.error.btn-text': 'Retour ร  la modification', - 'account.settings.menuMap.custom': 'personnalisation', - 'account.settings.menuMap.binding': 'Liaison de compte', - 'account.settings.basic.avatar': 'avatar', - 'account.settings.basic.change-avatar': "Changer d'avatar", - 'account.settings.basic.email': 'Courriel', - 'account.settings.basic.email-message': 'Veuillez entrer votre email!', - 'account.settings.basic.nickname': 'Surnom', - 'account.settings.basic.nickname-message': 'Veuillez entrer votre pseudoย !', - 'account.settings.basic.profile': 'Profil', - 'account.settings.basic.profile-message': 'Veuillez entrer votre profil personnelย !', - 'account.settings.basic.profile-placeholder': 'Profil', - 'account.settings.basic.country': 'Pays/Rรฉgion', - 'account.settings.basic.country-message': 'Veuillez entrer votre pays ou rรฉgionย !', - 'account.settings.basic.geographic': 'Province et ville', - 'account.settings.basic.geographic-message': 'Veuillez entrer votre province et votre villeย !', - 'account.settings.basic.address': 'adresse postale', - 'account.settings.basic.address-message': 'Veuillez entrer votre adresse postaleย !', - 'account.settings.basic.phone': 'Numรฉro de contact', - 'account.settings.basic.phone-message': 'Veuillez entrer votre numรฉro de contactย !', - 'account.settings.basic.update': 'Mettre ร  jour les informations de base', - 'account.settings.basic.update.success': 'Mettre ร  jour les informations de base avec succรจs', - 'account.settings.security.strong': 'Fort', - 'account.settings.security.medium': 'dans', - 'account.settings.security.weak': 'faible', - 'account.settings.security.password': 'Mot de passe du compte', - 'account.settings.security.password-description': 'Force actuelle du mot de passeย :', - 'account.settings.security.phone': 'Tรฉlรฉphone mobile de sรฉcuritรฉ', - 'account.settings.security.phone-description': 'Tรฉlรฉphone mobile dรฉjร  liรฉย :', - 'account.settings.security.question': 'Problรจmes de sรฉcuritรฉ', - 'account.settings.security.question-description': "Aucune question de sรฉcuritรฉ n'est dรฉfinie, ce qui peut protรฉger efficacement la sรฉcuritรฉ du compte.", - 'account.settings.security.email': 'Lier un e-mail', - 'account.settings.security.email-description': 'Adresse e-mail dรฉjร  liรฉeย :', - 'account.settings.security.mfa': 'Appareil MFA', - 'account.settings.security.mfa-description': 'Le pรฉriphรฉrique MFA nโ€™est pas liรฉ. Aprรจs la liaison, vous pouvez confirmer ร  nouveau.', - 'account.settings.security.modify': 'Modifier', - 'account.settings.security.set': 'paramรจtres', - 'account.settings.security.bind': 'reliure', - 'account.settings.binding.taobao': 'Lier Taobao', - 'account.settings.binding.taobao-description': "Le compte Taobao n'est actuellement pas liรฉ", - 'account.settings.binding.alipay': 'Lier Alipay', - 'account.settings.binding.alipay-description': "Le compte Alipay n'est actuellement pas liรฉ", - 'account.settings.binding.dingding': 'Liaison DingTalk', - 'account.settings.binding.dingding-description': "Aucun compte DingTalk n'est actuellement liรฉ", - 'account.settings.binding.bind': 'reliure', - 'account.settings.notification.password': 'Mot de passe du compte', - 'account.settings.notification.password-description': 'Les messages des autres utilisateurs seront notifiรฉs sous forme de messages du site.', - 'account.settings.notification.messages': 'Messages systรจme', - 'account.settings.notification.messages-description': 'Les messages systรจme seront notifiรฉs sous forme de messages de site.', - 'account.settings.notification.todo': 'Tรขches ร  faire', - 'account.settings.notification.todo-description': 'Les tรขches ร  effectuer seront notifiรฉes sous forme de messages sur site', - 'account.settings.settings.open': 'ouvert', - 'account.settings.settings.close': 'fermer', - 'trading-assistant.title': 'Assistante commerciale', - 'trading-assistant.strategyList': 'Liste de stratรฉgies', - 'trading-assistant.createStrategy': 'Crรฉer une politique', - 'trading-assistant.noStrategy': 'Pas encore de stratรฉgie', - 'trading-assistant.selectStrategy': 'Veuillez sรฉlectionner une stratรฉgie ร  gauche pour afficher les dรฉtails', - 'trading-assistant.startStrategy': 'stratรฉgie de lancement', - 'trading-assistant.stopStrategy': "stratรฉgie d'arrรชt", - 'trading-assistant.editStrategy': 'Stratรฉgie รฉditoriale', - 'trading-assistant.deleteStrategy': 'Supprimer la stratรฉgie', - 'trading-assistant.status.running': 'Courir', - 'trading-assistant.status.stopped': 'Arrรชtรฉ', - 'trading-assistant.status.error': 'Erreur', - 'trading-assistant.strategyType.IndicatorStrategy': "Stratรฉgie d'indicateurs techniques", - 'trading-assistant.strategyType.PromptBasedStrategy': 'stratรฉgie de mots indicateurs', - 'trading-assistant.strategyType.GridStrategy': 'stratรฉgie de grille', - 'trading-assistant.tabs.tradingRecords': 'historique des transactions', - 'trading-assistant.tabs.positions': 'Enregistrement de poste', - 'trading-assistant.tabs.equityCurve': 'courbe des actions', - 'trading-assistant.form.step1': 'Sรฉlectionner des indicateurs', - 'trading-assistant.form.step2': "Configuration d'รฉchange", - 'trading-assistant.form.step3': 'Paramรจtres de stratรฉgie', - 'trading-assistant.form.indicator': 'Sรฉlectionner des indicateurs', - 'trading-assistant.form.indicatorHint': 'Vous ne pouvez sรฉlectionner que les indicateurs techniques que vous avez achetรฉs ou crรฉรฉs', - 'trading-assistant.form.qdtCostHints': "L'utilisation de la stratรฉgie consommera du QDT, veuillez vous assurer que le compte dispose d'un solde QDT suffisant", - 'trading-assistant.form.indicatorDescription': "Description de l'indicateur", - 'trading-assistant.form.noDescription': 'Pas encore de description', - 'trading-assistant.form.exchange': 'Sรฉlectionnez un รฉchange', - 'trading-assistant.form.apiKey': 'Clรฉ API', - 'trading-assistant.form.secretKey': 'Clรฉ secrรจte', - 'trading-assistant.form.passphrase': 'Phrase secrรจte', - 'trading-assistant.form.testConnection': 'tester la connexion', - 'trading-assistant.form.strategyName': 'Nom de la stratรฉgie', - 'trading-assistant.form.symbol': 'paire de trading', - 'trading-assistant.form.symbolHint': 'Actuellement, seules les paires de trading de cryptomonnaies sont prises en charge', - 'trading-assistant.form.initialCapital': "Montant de l'investissement", - 'trading-assistant.form.marketType': 'type de marchรฉ', - 'trading-assistant.form.marketTypeFutures': 'contrat', - 'trading-assistant.form.marketTypeSpot': 'Spot', - 'trading-assistant.form.marketTypeHint': "Le contrat prend en charge le trading bidirectionnel et l'effet de levier, tandis que le spot ne prend en charge que les positions longues et l'effet de levier est fixรฉ ร  1x.", - 'trading-assistant.form.leverage': 'Tirer parti de plusieurs', - 'trading-assistant.form.leverageHint': 'Contrat : 1-125 fois, spot : fixe 1 fois', - 'trading-assistant.form.spotLeverageFixed': "L'effet de levier du trading au comptant est fixรฉ ร  1x", - 'trading-assistant.form.spotOnlyLongHint': 'Le trading au comptant ne prend en charge que les positions longues', - 'trading-assistant.form.tradeDirection': 'Orientation commerciale', - 'trading-assistant.form.tradeDirectionLong': 'Seulement longtemps', - 'trading-assistant.form.tradeDirectionShort': 'Seulement court', - 'trading-assistant.form.tradeDirectionBoth': 'transaction bidirectionnelle', - 'trading-assistant.form.timeframe': 'pรฉriode', - 'trading-assistant.form.klinePeriod': 'Pรฉriode K-Line', - 'trading-assistant.form.timeframe1m': '1 minute', - 'trading-assistant.form.timeframe5m': '5 minutes', - 'trading-assistant.form.timeframe15m': '15 minutes', - 'trading-assistant.form.timeframe30m': '30 minutes', - 'trading-assistant.form.timeframe1H': '1 heure', - 'trading-assistant.form.timeframe4H': '4 heures', - 'trading-assistant.form.timeframe1D': '1 jour', - 'trading-assistant.form.selectStrategyType': 'Sรฉlectionner le type de stratรฉgie', - 'trading-assistant.form.indicatorStrategy': 'Stratรฉgie d\'indicateur', - 'trading-assistant.form.indicatorStrategyDesc': 'Stratรฉgie de trading automatisรฉe basรฉe sur des indicateurs techniques', - 'trading-assistant.form.aiStrategy': 'Stratรฉgie IA', - 'trading-assistant.form.aiStrategyDesc': 'Stratรฉgie de trading automatisรฉe basรฉe sur la prise de dรฉcision intelligente IA', - 'trading-assistant.form.enableAiFilter': 'Activer le filtre de dรฉcision intelligente IA', - 'trading-assistant.form.enableAiFilterHint': 'Lorsqu\'il est activรฉ, les signaux d\'indicateur seront filtrรฉs par l\'IA pour amรฉliorer la qualitรฉ des transactions', - 'trading-assistant.form.aiFilterPrompt': 'Invite personnalisรฉe', - 'trading-assistant.form.aiFilterPromptHint': 'Fournir des instructions personnalisรฉes pour le filtrage IA, laisser vide pour utiliser la valeur par dรฉfaut du systรจme', - 'trading-assistant.validation.strategyTypeRequired': 'Veuillez sรฉlectionner un type de stratรฉgie', - 'trading-assistant.form.advancedSettings': 'Paramรจtres avancรฉs', - 'trading-assistant.form.orderMode': 'Mode de commande', - 'trading-assistant.form.orderModeMaker': 'Crรฉateur', - 'trading-assistant.form.orderModeTaker': 'Prix du marchรฉ (Preneur)', - 'trading-assistant.form.orderModeHint': "Le mode d'ordre en attente utilise des ordres limitรฉs et les frais de traitement sont infรฉrieursย ; le mode prix du marchรฉ est exรฉcutรฉ immรฉdiatement et les frais de traitement sont plus รฉlevรฉs.", - 'trading-assistant.form.makerWaitSec': "Temps d'attente pour les commandes en attente (secondes)", - 'trading-assistant.form.makerWaitSecHint': "Le temps d'attente pour la transaction aprรจs avoir passรฉ une commande. Annulez et rรฉessayez aprรจs l'expiration du dรฉlai.", - 'trading-assistant.form.makerRetries': 'Nombre de tentatives pour les commandes en attente', - 'trading-assistant.form.makerRetriesHint': "Le nombre maximum de tentatives lorsqu'un ordre en attente n'est pas exรฉcutรฉ", - 'trading-assistant.form.fallbackToMarket': "L'ordre en attente รฉchoue et le prix du marchรฉ est dรฉgradรฉ.", - 'trading-assistant.form.fallbackToMarketHint': "Lorsque l'ordre en attente d'ouverture/de clรดture n'a pas รฉtรฉ exรฉcutรฉ, s'il doit รชtre rรฉtrogradรฉ en ordre au marchรฉ pour garantir que la transaction soit terminรฉe.", - 'trading-assistant.form.marginMode': 'Mode marge', - 'trading-assistant.form.marginModeCross': 'Entrepรดt complet', - 'trading-assistant.form.marginModeIsolated': 'Position isolรฉe', - 'trading-assistant.form.stopLossPct': "Taux d'arrรชt des pertes (%)", - 'trading-assistant.form.stopLossPctHint': "Dรฉfinissez le pourcentage de stop loss, 0 signifie que le stop loss n'est pas activรฉ", - 'trading-assistant.form.takeProfitPct': 'Ratio de profit (%)', - 'trading-assistant.form.takeProfitPctHint': 'Dรฉfinissez le pourcentage de profit, 0 signifie dรฉsactiver le profit', - 'trading-assistant.form.signalMode': 'Mode signal', - 'trading-assistant.form.signalModeConfirmed': 'Mode de confirmation', - 'trading-assistant.form.signalModeAggressive': 'Mode agressif', - 'trading-assistant.form.signalModeHint': 'Mode de confirmationย : vรฉrifie uniquement les lignes K terminรฉesย ; Mode agressifย : vรฉrifie รฉgalement la formation de lignes K', - 'trading-assistant.form.cancel': 'Annuler', - 'trading-assistant.form.prev': 'ร‰tape prรฉcรฉdente', - 'trading-assistant.form.next': 'ร‰tape suivante', - 'trading-assistant.form.confirmCreate': 'Confirmer la crรฉation', - 'trading-assistant.form.confirmEdit': 'Confirmer les modifications', - 'trading-assistant.messages.createSuccess': 'Stratรฉgie crรฉรฉe avec succรจs', - 'trading-assistant.messages.createFailed': 'ร‰chec de la crรฉation de la stratรฉgie', - 'trading-assistant.messages.updateSuccess': 'Mise ร  jour de la stratรฉgie rรฉussie', - 'trading-assistant.messages.updateFailed': 'ร‰chec de la mise ร  jour de la stratรฉgie', - 'trading-assistant.messages.deleteSuccess': 'Suppression de la stratรฉgie rรฉussie', - 'trading-assistant.messages.deleteFailed': 'ร‰chec de la suppression de la stratรฉgie', - 'trading-assistant.messages.startSuccess': 'La stratรฉgie a dรฉmarrรฉ avec succรจs', - 'trading-assistant.messages.startFailed': 'ร‰chec du dรฉmarrage de la stratรฉgie', - 'trading-assistant.messages.stopSuccess': "La stratรฉgie s'est arrรชtรฉe avec succรจs", - 'trading-assistant.messages.stopFailed': "La stratรฉgie d'arrรชt a รฉchouรฉ", - 'trading-assistant.messages.loadFailed': "ร‰chec de l'obtention de la liste des rรจgles", - 'trading-assistant.messages.runningWarning': 'La stratรฉgie est en marche. Veuillez arrรชter la stratรฉgie avant de la modifier.', - 'trading-assistant.messages.deleteConfirmWithName': 'รŠtes-vous sรปr de vouloir supprimer la stratรฉgie ยซย {name}ย ยปย ? Cette opรฉration est irrรฉversible.', - 'trading-assistant.messages.deleteConfirm': 'รŠtes-vous sรปr de vouloir supprimer cette stratรฉgieย ? Cette opรฉration est irrรฉversible.', - 'trading-assistant.messages.loadTradesFailed': "ร‰chec de l'obtention des enregistrements de transaction", - 'trading-assistant.messages.loadPositionsFailed': "Impossible d'obtenir l'enregistrement de position", - 'trading-assistant.messages.loadEquityFailed': "Impossible d'obtenir la courbe des capitaux propres", - 'trading-assistant.messages.loadIndicatorsFailed': 'ร‰chec du chargement de la liste des indicateurs, veuillez rรฉessayer plus tard', - 'trading-assistant.messages.spotLimitations': 'Le trading au comptant a รฉtรฉ automatiquement rรฉglรฉ sur position longue uniquement, effet de levier 1x', - 'trading-assistant.messages.autoFillApiConfig': "La configuration historique de l'API de l'รฉchange a รฉtรฉ automatiquement renseignรฉe", - 'trading-assistant.placeholders.selectIndicator': 'Veuillez sรฉlectionner un indicateur', - 'trading-assistant.placeholders.selectExchange': 'Veuillez sรฉlectionner un รฉchange', - 'trading-assistant.placeholders.inputApiKey': 'Veuillez saisir la clรฉ API', - 'trading-assistant.placeholders.inputSecretKey': 'Veuillez entrer la clรฉ secrรจte', - 'trading-assistant.placeholders.inputPassphrase': 'Veuillez saisir la phrase secrรจte', - 'trading-assistant.placeholders.inputStrategyName': 'Veuillez saisir un nom de stratรฉgie', - 'trading-assistant.placeholders.selectSymbol': 'Veuillez sรฉlectionner une paire de trading', - 'trading-assistant.placeholders.selectTimeframe': 'Veuillez sรฉlectionner une pรฉriode', - 'trading-assistant.placeholders.selectKlinePeriod': 'Veuillez sรฉlectionner une pรฉriode K-Line', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'Veuillez entrer une invite personnalisรฉe (optionnel)', - 'trading-assistant.validation.indicatorRequired': 'Veuillez sรฉlectionner un indicateur', - 'trading-assistant.validation.exchangeRequired': 'Veuillez sรฉlectionner un รฉchange', - 'trading-assistant.validation.apiKeyRequired': 'Veuillez saisir la clรฉ API', - 'trading-assistant.validation.secretKeyRequired': 'Veuillez entrer la clรฉ secrรจte', - 'trading-assistant.validation.passphraseRequired': 'Veuillez saisir la phrase secrรจte', - 'trading-assistant.validation.exchangeConfigIncomplete': "Veuillez remplir les informations complรจtes de configuration de l'รฉchange", - 'trading-assistant.validation.testConnectionRequired': 'Veuillez d\'abord cliquer sur le bouton "Tester la connexion" et vous assurer que la connexion est rรฉussie', - 'trading-assistant.validation.testConnectionFailed': 'Le test de connexion a รฉchouรฉ, veuillez vรฉrifier la configuration et rรฉessayer', - 'trading-assistant.validation.strategyNameRequired': 'Veuillez saisir un nom de stratรฉgie', - 'trading-assistant.validation.symbolRequired': 'Veuillez sรฉlectionner une paire de trading', - 'trading-assistant.validation.initialCapitalRequired': "Veuillez saisir le montant de l'investissement", - 'trading-assistant.validation.leverageRequired': 'Veuillez saisir le ratio de levier', - 'trading-assistant.table.time': 'temps', - 'trading-assistant.table.type': 'Tapez', - 'trading-assistant.table.price': 'prix', - 'trading-assistant.table.amount': 'Quantitรฉ', - 'trading-assistant.table.value': 'Montant', - 'trading-assistant.table.commission': 'frais de traitement', - 'trading-assistant.table.symbol': 'paire de trading', - 'trading-assistant.table.side': 'direction', - 'trading-assistant.table.size': 'Quantitรฉ de position', - 'trading-assistant.table.entryPrice': "Prix d'ouverture", - 'trading-assistant.table.currentPrice': 'prix actuel', - 'trading-assistant.table.unrealizedPnl': 'profit ou perte non rรฉalisรฉ', - 'trading-assistant.table.pnlPercent': 'Ratio de profits et pertes', - 'trading-assistant.table.buy': 'acheter', - 'trading-assistant.table.sell': 'vendre', - 'trading-assistant.table.long': 'Allez-y longtemps', - 'trading-assistant.table.short': 'court', - 'trading-assistant.table.noPositions': "Aucun poste pour l'instant", - 'trading-assistant.detail.title': 'Dรฉtails de la stratรฉgie', - 'trading-assistant.detail.strategyName': 'Nom de la stratรฉgie', - 'trading-assistant.detail.strategyType': 'Type de stratรฉgie', - 'trading-assistant.detail.status': 'Statut', - 'trading-assistant.detail.tradingMode': 'modรจle commercial', - 'trading-assistant.detail.exchange': 'รฉchange', - 'trading-assistant.detail.initialCapital': 'Capital initial', - 'trading-assistant.detail.totalInvestment': "montant total de l'investissement", - 'trading-assistant.detail.currentEquity': 'Valeur nette actuelle', - 'trading-assistant.detail.totalPnl': 'Total des profits et pertes', - 'trading-assistant.detail.indicatorName': "Nom de l'indicateur", - 'trading-assistant.detail.maxLeverage': 'Effet de levier maximal', - 'trading-assistant.detail.decideInterval': 'intervalle de dรฉcision', - 'trading-assistant.detail.symbols': 'Objet de transaction', - 'trading-assistant.detail.createdAt': 'temps de crรฉation', - 'trading-assistant.detail.updatedAt': 'Heure de mise ร  jour', - 'trading-assistant.detail.llmConfig': "Configuration du modรจle d'IA", - 'trading-assistant.detail.exchangeConfig': "Configuration d'รฉchange", - 'trading-assistant.detail.provider': 'fournisseur', - 'trading-assistant.detail.modelId': 'ID du modรจle', - 'trading-assistant.detail.close': 'Fermer', - 'trading-assistant.detail.loadFailed': "ร‰chec de l'obtention des dรฉtails de la stratรฉgie", - 'trading-assistant.equity.noData': "Aucune donnรฉe sur la valeur nette pour l'instant", - 'trading-assistant.equity.equity': 'valeur nette', - 'trading-assistant.exchange.tradingMode': 'modรจle commercial', - 'trading-assistant.exchange.virtual': 'trading simulรฉ', - 'trading-assistant.exchange.live': 'Transaction rรฉelle', - 'trading-assistant.exchange.selectExchange': 'Sรฉlectionnez un รฉchange', - 'trading-assistant.exchange.walletAddress': 'adresse du portefeuille', - 'trading-assistant.exchange.walletAddressPlaceholder': "Veuillez saisir l'adresse de votre portefeuille (en commenรงant par 0x)", - 'trading-assistant.exchange.privateKey': 'clรฉ privรฉe', - 'trading-assistant.exchange.privateKeyPlaceholder': 'Veuillez saisir la clรฉ privรฉe (64 caractรจres)', - 'trading-assistant.exchange.testConnection': 'tester la connexion', - 'trading-assistant.exchange.connectionSuccess': 'Connexion rรฉussie', - 'trading-assistant.exchange.connectionFailed': 'La connexion a รฉchouรฉ', - 'trading-assistant.exchange.testFailed': 'Le test de connexion a รฉchouรฉ', - 'trading-assistant.exchange.fillComplete': "Veuillez remplir les informations complรจtes de configuration de l'รฉchange", - 'trading-assistant.strategyTypeOptions.ai': "Stratรฉgie basรฉe sur l'IA", - 'trading-assistant.strategyTypeOptions.indicator': "Stratรฉgie d'indicateurs techniques", - 'trading-assistant.strategyTypeOptions.aiDeveloping': "La fonction de stratรฉgie basรฉe sur l'IA est en cours de dรฉveloppement, alors restez ร  l'รฉcoute", - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': "Des fonctionnalitรฉs de stratรฉgie basรฉes sur l'IA sont en cours de dรฉveloppement", - 'trading-assistant.indicatorType.trend': 'Tendance', - 'trading-assistant.indicatorType.momentum': 'รฉlan', - 'trading-assistant.indicatorType.volatility': 'Fluctuations', - 'trading-assistant.indicatorType.volume': 'Volume', - 'trading-assistant.indicatorType.custom': 'Personnaliser', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'Binance', - 'hyperliquid': 'Hyperliquide', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Porte.io', - 'mexc': 'MEXIQUE', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': 'Huobi', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Dรฉribuer', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Timbre de bits', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Gรฉmeaux', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Dรฉbit ascendant', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBanque', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX ร‰tats-Unis', - 'binanceus': 'Binance ร‰tats-Unis', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDโ“ˆ-M', - 'deepcoin': 'Deepcoin' - }, - 'ai-trading-assistant.title': 'Assistant de trading IA', - 'ai-trading-assistant.strategyList': 'Liste de stratรฉgies', - 'ai-trading-assistant.createStrategy': 'Crรฉer une politique', - 'ai-trading-assistant.noStrategy': 'Pas encore de stratรฉgie', - 'ai-trading-assistant.selectStrategy': 'Veuillez sรฉlectionner une stratรฉgie ร  gauche pour afficher les dรฉtails', - 'ai-trading-assistant.startStrategy': 'stratรฉgie de lancement', - 'ai-trading-assistant.stopStrategy': "stratรฉgie d'arrรชt", - 'ai-trading-assistant.editStrategy': 'Stratรฉgie รฉditoriale', - 'ai-trading-assistant.deleteStrategy': 'Supprimer la stratรฉgie', - 'ai-trading-assistant.status.running': 'Courir', - 'ai-trading-assistant.status.stopped': 'Arrรชtรฉ', - 'ai-trading-assistant.status.error': 'Erreur', - 'ai-trading-assistant.tabs.tradingRecords': 'historique des transactions', - 'ai-trading-assistant.tabs.positions': 'Enregistrement de poste', - 'ai-trading-assistant.tabs.aiDecisions': 'Enregistrement de dรฉcision IA', - 'ai-trading-assistant.tabs.equityCurve': 'courbe des actions', - 'ai-trading-assistant.form.createTitle': 'Crรฉer des stratรฉgies de trading IA', - 'ai-trading-assistant.form.editTitle': "Modifier la stratรฉgie de trading de l'IA", - 'ai-trading-assistant.form.strategyName': 'Nom de la stratรฉgie', - 'ai-trading-assistant.form.modelId': "Modรจle d'IA", - 'ai-trading-assistant.form.modelIdHint': 'Utilisez le service systรจme OpenRouter sans configurer la clรฉ API', - 'ai-trading-assistant.form.decideInterval': 'intervalle de dรฉcision', - 'ai-trading-assistant.form.decideInterval5m': '5 minutes', - 'ai-trading-assistant.form.decideInterval10m': '10 minutes', - 'ai-trading-assistant.form.decideInterval30m': '30 minutes', - 'ai-trading-assistant.form.decideInterval1h': '1 heure', - 'ai-trading-assistant.form.decideInterval4h': '4 heures', - 'ai-trading-assistant.form.decideInterval1d': '1 jour', - 'ai-trading-assistant.form.decideInterval1w': '1 semaine', - 'ai-trading-assistant.form.decideIntervalHint': 'Lโ€™intervalle de temps nรฉcessaire ร  lโ€™IA pour prendre des dรฉcisions', - 'ai-trading-assistant.form.runPeriod': "Cycle d'exรฉcution", - 'ai-trading-assistant.form.runPeriodHint': "L'heure de dรฉbut et l'heure de fin de l'exรฉcution de la stratรฉgie", - 'ai-trading-assistant.form.startDate': 'date de dรฉbut', - 'ai-trading-assistant.form.endDate': 'date de fin', - 'ai-trading-assistant.form.qdtCostTitle': 'Instructions de dรฉduction QDT', - 'ai-trading-assistant.form.qdtCostHint': "{cost} QDT sera dรฉduit pour chaque dรฉcision de l'IA. Veuillez vous assurer que votre compte dispose d'un solde QDT suffisant. Lors de l'exรฉcution de la stratรฉgie, des frais seront dรฉduits en temps rรฉel pour chaque dรฉcision.", - 'ai-trading-assistant.form.apiKey': 'Clรฉ API', - 'ai-trading-assistant.form.exchange': 'Sรฉlectionnez un รฉchange', - 'ai-trading-assistant.form.secretKey': 'Clรฉ secrรจte', - 'ai-trading-assistant.form.passphrase': 'Phrase secrรจte', - 'ai-trading-assistant.form.testConnection': 'tester la connexion', - 'ai-trading-assistant.form.symbol': 'paire de trading', - 'ai-trading-assistant.form.symbolHint': 'Sรฉlectionnez la paire de trading ร  trader', - 'ai-trading-assistant.form.initialCapital': 'Montant investi (marge)', - 'ai-trading-assistant.form.leverage': 'Tirer parti de plusieurs', - 'ai-trading-assistant.form.timeframe': 'pรฉriode', - 'ai-trading-assistant.form.timeframe1m': '1 minute', - 'ai-trading-assistant.form.timeframe5m': '5 minutes', - 'ai-trading-assistant.form.timeframe15m': '15 minutes', - 'ai-trading-assistant.form.timeframe30m': '30 minutes', - 'ai-trading-assistant.form.timeframe1H': '1 heure', - 'ai-trading-assistant.form.timeframe4H': '4 heures', - 'ai-trading-assistant.form.timeframe1D': '1 jour', - 'ai-trading-assistant.form.marketType': 'type de marchรฉ', - 'ai-trading-assistant.form.marketTypeFutures': 'contrat', - 'ai-trading-assistant.form.marketTypeSpot': 'Spot', - 'ai-trading-assistant.form.totalPnl': 'Total des profits et pertes', - 'ai-trading-assistant.form.customPrompt': "Mots d'invite personnalisรฉs", - 'ai-trading-assistant.form.customPromptHint': "Facultatif, utilisรฉ pour personnaliser les stratรฉgies de trading de l'IA et la logique de prise de dรฉcision", - 'ai-trading-assistant.form.cancel': 'Annuler', - 'ai-trading-assistant.form.prev': 'ร‰tape prรฉcรฉdente', - 'ai-trading-assistant.form.next': 'ร‰tape suivante', - 'ai-trading-assistant.form.confirmCreate': 'Confirmer la crรฉation', - 'ai-trading-assistant.form.confirmEdit': 'Confirmer les modifications', - 'ai-trading-assistant.messages.createSuccess': 'Stratรฉgie crรฉรฉe avec succรจs', - 'ai-trading-assistant.messages.createFailed': 'ร‰chec de la crรฉation de la stratรฉgie', - 'ai-trading-assistant.messages.updateSuccess': 'Mise ร  jour de la stratรฉgie rรฉussie', - 'ai-trading-assistant.messages.updateFailed': 'ร‰chec de la mise ร  jour de la stratรฉgie', - 'ai-trading-assistant.messages.deleteSuccess': 'Suppression de la stratรฉgie rรฉussie', - 'ai-trading-assistant.messages.deleteFailed': 'ร‰chec de la suppression de la stratรฉgie', - 'ai-trading-assistant.messages.startSuccess': 'La stratรฉgie a dรฉmarrรฉ avec succรจs', - 'ai-trading-assistant.messages.startFailed': 'ร‰chec du dรฉmarrage de la stratรฉgie', - 'ai-trading-assistant.messages.stopSuccess': "La stratรฉgie s'est arrรชtรฉe avec succรจs", - 'ai-trading-assistant.messages.stopFailed': "La stratรฉgie d'arrรชt a รฉchouรฉ", - 'ai-trading-assistant.messages.loadFailed': "ร‰chec de l'obtention de la liste des rรจgles", - 'ai-trading-assistant.messages.loadDecisionsFailed': "ร‰chec de l'obtention du dossier de dรฉcision de l'IA", - 'ai-trading-assistant.messages.deleteConfirm': 'รŠtes-vous sรปr de vouloir supprimer cette stratรฉgieย ? Cette opรฉration est irrรฉversible.', - 'ai-trading-assistant.placeholders.inputStrategyName': 'Veuillez saisir un nom de stratรฉgie', - 'ai-trading-assistant.placeholders.selectModelId': "Veuillez sรฉlectionner un modรจle d'IA", - 'ai-trading-assistant.placeholders.selectDecideInterval': 'Veuillez sรฉlectionner un intervalle de dรฉcision', - 'ai-trading-assistant.placeholders.startTime': 'heure de dรฉbut', - 'ai-trading-assistant.placeholders.endTime': 'heure de fin', - 'ai-trading-assistant.placeholders.inputApiKey': 'Veuillez saisir la clรฉ API', - 'ai-trading-assistant.placeholders.selectExchange': 'Veuillez sรฉlectionner un รฉchange', - 'ai-trading-assistant.placeholders.inputSecretKey': 'Veuillez entrer la clรฉ secrรจte', - 'ai-trading-assistant.placeholders.inputPassphrase': 'Veuillez saisir la phrase secrรจte', - 'ai-trading-assistant.placeholders.selectSymbol': 'Veuillez sรฉlectionner une paire de trading, telle queย : BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'Veuillez sรฉlectionner une pรฉriode', - 'ai-trading-assistant.placeholders.inputCustomPrompt': "Veuillez saisir un mot d'invite personnalisรฉ (facultatif)", - 'ai-trading-assistant.validation.strategyNameRequired': 'Veuillez saisir un nom de stratรฉgie', - 'ai-trading-assistant.validation.modelIdRequired': "Veuillez sรฉlectionner un modรจle d'IA", - 'ai-trading-assistant.validation.runPeriodRequired': "Veuillez sรฉlectionner un cycle d'exรฉcution", - 'ai-trading-assistant.validation.apiKeyRequired': 'Veuillez saisir la clรฉ API', - 'ai-trading-assistant.validation.exchangeRequired': 'Veuillez sรฉlectionner un รฉchange', - 'ai-trading-assistant.validation.secretKeyRequired': 'Veuillez entrer la clรฉ secrรจte', - 'ai-trading-assistant.validation.symbolRequired': 'Veuillez sรฉlectionner une paire de trading', - 'ai-trading-assistant.validation.initialCapitalRequired': "Veuillez saisir le montant de l'investissement", - 'ai-trading-assistant.table.time': 'temps', - 'ai-trading-assistant.table.type': 'Tapez', - 'ai-trading-assistant.table.price': 'prix', - 'ai-trading-assistant.table.amount': 'Quantitรฉ', - 'ai-trading-assistant.table.value': 'Montant', - 'ai-trading-assistant.table.symbol': 'paire de trading', - 'ai-trading-assistant.table.side': 'direction', - 'ai-trading-assistant.table.size': 'Quantitรฉ de position', - 'ai-trading-assistant.table.entryPrice': "Prix d'ouverture", - 'ai-trading-assistant.table.currentPrice': 'prix actuel', - 'ai-trading-assistant.table.unrealizedPnl': 'profit ou perte non rรฉalisรฉ', - 'ai-trading-assistant.table.profit': 'Profits et pertes', - 'ai-trading-assistant.table.openLong': 'Ouvert longtemps', - 'ai-trading-assistant.table.closeLong': 'Pinduo', - 'ai-trading-assistant.table.openShort': 'Ouvert court', - 'ai-trading-assistant.table.closeShort': 'vide', - 'ai-trading-assistant.table.addLong': 'Gadot', - 'ai-trading-assistant.table.addShort': 'ajouter un court', - 'ai-trading-assistant.table.closeShortProfit': 'Prendre des bรฉnรฉfices sur une position courte', - 'ai-trading-assistant.table.closeShortStop': 'Arrรชter la perte', - 'ai-trading-assistant.table.closeLongProfit': 'Arrรชtez-vous longtemps et profitez', - 'ai-trading-assistant.table.closeLongStop': 'Arrรชter la perte', - 'ai-trading-assistant.table.buy': 'acheter', - 'ai-trading-assistant.table.sell': 'vendre', - 'ai-trading-assistant.table.long': 'Allez-y longtemps', - 'ai-trading-assistant.table.short': 'court', - 'ai-trading-assistant.table.hold': 'tenir', - 'ai-trading-assistant.table.reasoning': "Raison de l'analyse", - 'ai-trading-assistant.table.decisions': 'prise de dรฉcision', - 'ai-trading-assistant.table.riskAssessment': 'รฉvaluation des risques', - 'ai-trading-assistant.table.confidence': 'Confiance', - 'ai-trading-assistant.table.totalRecords': '{total} enregistrements au total', - 'ai-trading-assistant.table.noPositions': "Aucun poste pour l'instant", - 'ai-trading-assistant.detail.title': 'Dรฉtails de la stratรฉgie', - 'ai-trading-assistant.equity.noData': "Aucune donnรฉe sur la valeur nette pour l'instant", - 'ai-trading-assistant.equity.equity': 'valeur nette', - 'ai-trading-assistant.exchange.testFailed': 'Le test de connexion a รฉchouรฉ', - 'ai-trading-assistant.exchange.connectionSuccess': 'Connexion rรฉussie', - 'ai-trading-assistant.exchange.connectionFailed': 'La connexion a รฉchouรฉ', - 'ai-trading-assistant.form.advancedSettings': 'Paramรจtres avancรฉs', - 'ai-trading-assistant.form.orderMode': 'Mode de commande', - 'ai-trading-assistant.form.orderModeMaker': 'Crรฉateur', - 'ai-trading-assistant.form.orderModeTaker': 'Prix du marchรฉ (Preneur)', - 'ai-trading-assistant.form.orderModeHint': "Le mode d'ordre en attente utilise des ordres limitรฉs et les frais de traitement sont infรฉrieursย ; le mode prix du marchรฉ est exรฉcutรฉ immรฉdiatement et les frais de traitement sont plus รฉlevรฉs.", - 'ai-trading-assistant.form.makerWaitSec': "Temps d'attente pour les commandes en attente (secondes)", - 'ai-trading-assistant.form.makerWaitSecHint': "Le temps d'attente pour la transaction aprรจs avoir passรฉ une commande. Annulez et rรฉessayez aprรจs l'expiration du dรฉlai.", - 'ai-trading-assistant.form.makerRetries': 'Nombre de tentatives pour les commandes en attente', - 'ai-trading-assistant.form.makerRetriesHint': "Le nombre maximum de tentatives lorsqu'un ordre en attente n'est pas exรฉcutรฉ", - 'ai-trading-assistant.form.fallbackToMarket': "L'ordre en attente รฉchoue et le prix du marchรฉ est dรฉgradรฉ.", - 'ai-trading-assistant.form.fallbackToMarketHint': "Lorsque l'ordre en attente d'ouverture/de clรดture n'a pas รฉtรฉ exรฉcutรฉ, s'il doit รชtre rรฉtrogradรฉ en ordre au marchรฉ pour garantir que la transaction soit terminรฉe.", - 'ai-trading-assistant.form.marginMode': 'Mode marge', - 'ai-trading-assistant.form.marginModeCross': 'Entrepรดt complet', - 'ai-trading-assistant.form.marginModeIsolated': 'Position isolรฉe', - 'ai-analysis.title': 'Moteur de trading quantique', - 'ai-analysis.system.online': 'en ligne', - 'ai-analysis.system.agents': 'agent', - 'ai-analysis.system.active': 'actif', - 'ai-analysis.system.stage': 'scรจne', - 'ai-analysis.panel.roster': 'Composition des agents', - 'ai-analysis.panel.thinking': 'En pensant...', - 'ai-analysis.panel.done': 'Terminรฉ', - 'ai-analysis.panel.standby': 'veille', - 'ai-analysis.input.title': 'Moteur de trading quantique', - 'ai-analysis.input.placeholder': "Sรฉlectionnez l'actif cible (par exemple BTC/USDT)", - 'ai-analysis.input.watchlist': 'Stocks optionnels', - 'ai-analysis.input.start': "Dรฉmarrer l'analyse", - 'ai-analysis.input.recent': 'Tรขches rรฉcentesย :', - 'ai-analysis.vis.stage': 'รฉtape', - 'ai-analysis.vis.processing': 'Traitement', - 'ai-analysis.result.complete': 'Analyse terminรฉe', - 'ai-analysis.result.signal': 'signal final', - 'ai-analysis.result.confidence': 'Confianceย :', - 'ai-analysis.result.new': 'nouvelle analyse', - 'ai-analysis.result.full': 'Voir le rapport complet', - 'ai-analysis.logs.title': 'Journal systรจme', - 'ai-analysis.modal.title': 'rapport confidentiel', - 'ai-analysis.modal.fundamental': 'analyse fondamentale', - 'ai-analysis.modal.technical': 'Analyse technique', - 'ai-analysis.modal.sentiment': 'Analyse รฉmotionnelle', - 'ai-analysis.modal.risk': 'รฉvaluation des risques', - 'ai-analysis.stage.idle': 'veille', - 'ai-analysis.stage.1': 'Premiรจre phaseย : analyse multidimensionnelle', - 'ai-analysis.stage.2': 'Phase deuxย : dรฉbat long-court', - 'ai-analysis.stage.3': 'Phase troisย :ย planification stratรฉgique', - 'ai-analysis.stage.4': 'La quatriรจme รฉtape : la revue du contrรดle des risques', - 'ai-analysis.stage.complete': 'Terminรฉ', - 'ai-analysis.agent.investment_director': 'Directeur des investissements', - 'ai-analysis.agent.role.investment_director': 'Analyse complรจte et conclusion finale', - 'ai-analysis.agent.market': 'analyste de marchรฉ', - 'ai-analysis.agent.role.market': 'Donnรฉes technologiques et de marchรฉ', - 'ai-analysis.agent.fundamental': 'analyste fondamental', - 'ai-analysis.agent.role.fundamental': 'Finances et valorisation', - 'ai-analysis.agent.technical': 'analyste technique', - 'ai-analysis.agent.role.technical': 'Indicateurs et graphiques techniques', - 'ai-analysis.agent.news': 'analyste de nouvelles', - 'ai-analysis.agent.role.news': "Filtre d'actualitรฉs mondiales", - 'ai-analysis.agent.sentiment': 'analyste des sentiments', - 'ai-analysis.agent.role.sentiment': 'Social et รฉmotionnel', - 'ai-analysis.agent.risk': 'analyste des risques', - 'ai-analysis.agent.role.risk': 'Vรฉrification des risques de base', - 'ai-analysis.agent.bull': 'chercheur optimiste', - 'ai-analysis.agent.role.bull': 'Extraction de catalyseurs de croissance', - 'ai-analysis.agent.bear': 'chercheur baissier', - 'ai-analysis.agent.role.bear': 'Recherche de risques et de dรฉfauts', - 'ai-analysis.agent.manager': 'directeur de recherche', - 'ai-analysis.agent.role.manager': 'modรฉrateur du dรฉbat', - 'ai-analysis.agent.trader': 'commerรงant', - 'ai-analysis.agent.role.trader': 'Stratรจge exรฉcutif', - 'ai-analysis.agent.risky': 'analyste activiste', - 'ai-analysis.agent.role.risky': 'stratรฉgie agressive', - 'ai-analysis.agent.neutral': "analyste d'รฉquilibre", - 'ai-analysis.agent.role.neutral': "stratรฉgie d'รฉquilibrage", - 'ai-analysis.agent.safe': 'analyste conservateur', - 'ai-analysis.agent.role.safe': 'stratรฉgie conservatrice', - 'ai-analysis.agent.cro': 'Responsable du contrรดle des risques (CRO)', - 'ai-analysis.agent.role.cro': 'autoritรฉ dรฉcisionnelle finale', - 'ai-analysis.script.market': 'Rรฉcupรฉration des donnรฉes OHLCV des principaux รฉchanges...', - 'ai-analysis.script.fundamental': 'Rรฉcupรฉration des rapports financiers trimestriels...', - 'ai-analysis.script.technical': 'Analyser les indicateurs techniques et les modรจles de graphiques...', - 'ai-analysis.script.news': "Analyse de l'actualitรฉ financiรจre mondiale...", - 'ai-analysis.script.sentiment': 'Analyser les tendances des rรฉseaux sociaux...', - 'ai-analysis.script.risk': 'Calcul de la volatilitรฉ historique...', - 'invite.inviteLink': "Lien d'invitation", - 'invite.copy': 'Copier le lien', - 'invite.copySuccess': 'Copiez avec succรจsย !', - 'invite.copyFailed': 'ร‰chec de la copie, veuillez copier manuellement', - 'invite.noInviteLink': "Lien d'invitation non gรฉnรฉrรฉ", - 'invite.totalInvites': 'Invitations cumulรฉes', - 'invite.totalReward': 'Rรฉcompenses cumulรฉes', - 'invite.rules': "Rรจgles d'invitation", - 'invite.rule1': "Chaque fois que vous invitez avec succรจs un ami ร  s'inscrire, vous recevrez une rรฉcompense", - 'invite.rule2': "Si l'ami invitรฉ termine la premiรจre transaction, vous recevrez des rรฉcompenses supplรฉmentaires", - 'invite.rule3': "Les rรฉcompenses d'invitation seront envoyรฉes directement sur votre compte", - 'invite.inviteList': "Liste d'invitations", - 'invite.tasks': 'centre de mission', - 'invite.inviteeName': 'Invitรฉ', - 'invite.inviteTime': "Heure d'invitation", - 'invite.status': 'Statut', - 'invite.reward': 'rรฉcompense', - 'invite.active': 'actif', - 'invite.inactive': 'Non activรฉ', - 'invite.completed': 'Terminรฉ', - 'invite.claimed': 'Reรงu', - 'invite.pending': 'A complรฉter', - 'invite.goToTask': 'complรฉter', - 'invite.claimReward': 'rรฉclamer des rรฉcompenses', - 'invite.verify': 'Vรฉrification terminรฉe', - 'invite.verifySuccess': 'Vรฉrification rรฉussieย ! Tรขche terminรฉe', - 'invite.verifyNotCompleted': "La tรขche n'est pas encore terminรฉe, veuillez d'abord la terminer", - 'invite.verifyFailed': 'La vรฉrification a รฉchouรฉ, veuillez rรฉessayer plus tard', - 'invite.claimSuccess': 'Vous avez reรงu avec succรจs {reward} QDTย !', - 'invite.claimFailed': 'ร‰chec de la collecte, veuillez rรฉessayer plus tard', - 'invite.totalRecords': '{total} enregistrements au total', - 'invite.task.twitter.title': 'Retweeter sur X (Twitter)', - 'invite.task.twitter.desc': 'Partagez nos tweets officiels sur votre compte X (Twitter)', - 'invite.task.youtube.title': 'Suivez notre chaรฎne YouTube', - 'invite.task.youtube.desc': 'Abonnez-vous et suivez notre chaรฎne YouTube officielle', - 'invite.task.telegram.title': 'Rejoindre le groupe Telegram', - 'invite.task.telegram.desc': 'Rejoignez notre groupe communautaire officiel Telegram', - 'invite.task.discord.title': 'Rejoignez un serveur Discord', - 'invite.task.discord.desc': 'Rejoignez notre serveur communautaire Discord', - 'message': '-', - 'layouts.usermenu.dialog.title': 'informations', - 'layouts.usermenu.dialog.content': 'รŠtes-vous sรปr de vouloir vous dรฉconnecterย ?', - 'layouts.userLayout.title': "Trouver la vรฉritรฉ dans l'incertitude", - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell โ†’ open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': 'Mรฉmoire/Rรฉflexion', - 'settings.group.reflection_worker': 'Worker de vรฉrification de rรฉflexion automatique', - 'settings.field.ENABLE_AGENT_MEMORY': 'Activer la mรฉmoire de lโ€™agent', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Activer la recherche vectorielle (local)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Dimension dโ€™embedding', - 'settings.field.AGENT_MEMORY_TOP_K': 'Nombre Top-K', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'Taille de la fenรชtre de candidats', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Demi-vie de dรฉcroissance temporelle (jours)', - 'settings.field.AGENT_MEMORY_W_SIM': 'Poids de similaritรฉ', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'Poids de rรฉcence', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'Poids des rendements', - 'settings.field.ENABLE_REFLECTION_WORKER': 'Activer la vรฉrification automatique', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Intervalle de vรฉrification (s)', - - // Profile - Notification Settings (Paramรจtres de notification) - 'profile.notifications.title': 'Paramรจtres de notification', - 'profile.notifications.hint': 'Configurez vos mรฉthodes de notification par dรฉfaut, utilisรฉes automatiquement lors de la crรฉation de surveillances et alertes', - 'profile.notifications.defaultChannels': 'Canaux de notification par dรฉfaut', - 'profile.notifications.browser': 'Notification dans l\'app', - 'profile.notifications.email': 'E-mail', - 'profile.notifications.phone': 'SMS', - 'profile.notifications.telegramBotToken': 'Token du Bot Telegram', - 'profile.notifications.telegramBotTokenPlaceholder': 'Entrez votre Token Bot Telegram', - 'profile.notifications.telegramBotTokenHint': 'Crรฉez un bot via @BotFather pour obtenir le Token', - 'profile.notifications.telegramChatId': 'Chat ID Telegram', - 'profile.notifications.telegramPlaceholder': 'Entrez votre Chat ID Telegram (ex: 123456789)', - 'profile.notifications.telegramHint': 'Envoyez /start ร  @userinfobot pour obtenir votre Chat ID', - 'profile.notifications.notifyEmail': 'E-mail de notification', - 'profile.notifications.emailPlaceholder': 'Adresse e-mail pour recevoir les notifications', - 'profile.notifications.emailHint': 'Utilise l\'e-mail du compte par dรฉfaut, vous pouvez en dรฉfinir un autre', - 'profile.notifications.phonePlaceholder': 'Entrez le numรฉro de tรฉlรฉphone (ex: +33612345678)', - 'profile.notifications.phoneHint': 'L\'administrateur doit configurer le service Twilio', - 'profile.notifications.discordWebhook': 'Webhook Discord', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'Crรฉez un Webhook dans les paramรจtres du serveur Discord', - 'profile.notifications.webhookUrl': 'URL Webhook', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': 'URL Webhook personnalisรฉe, notifications envoyรฉes via POST JSON', - 'profile.notifications.webhookToken': 'Token Webhook (Optionnel)', - 'profile.notifications.webhookTokenPlaceholder': 'Bearer Token pour l\'authentification', - 'profile.notifications.webhookTokenHint': 'Envoyรฉ comme Authorization: Bearer Token au Webhook', - 'profile.notifications.testBtn': 'Envoyer une notification test', - 'profile.notifications.saveSuccess': 'Paramรจtres de notification enregistrรฉs', - 'profile.notifications.selectChannel': 'Veuillez sรฉlectionner au moins un canal de notification', - 'profile.notifications.fillTelegramToken': 'Veuillez remplir le Token Bot Telegram', - 'profile.notifications.fillTelegram': 'Veuillez remplir le Chat ID Telegram', - 'profile.notifications.fillEmail': 'Veuillez remplir l\'e-mail de notification', - 'profile.notifications.testSent': 'Notification test envoyรฉe, vรฉrifiez vos canaux de notification' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/ja-JP.js b/quantdinger_vue/src/locales/lang/ja-JP.js deleted file mode 100644 index 7daf1fb..0000000 --- a/quantdinger_vue/src/locales/lang/ja-JP.js +++ /dev/null @@ -1,1827 +0,0 @@ -import antdJaJP from 'ant-design-vue/es/locale-provider/ja_JP' -import momentJA from 'moment/locale/ja' - -const components = { - antLocale: antdJaJP, - momentName: 'ja', - momentLocale: momentJA -} - -const locale = { - 'submit': '้€ไฟกใ™ใ‚‹', - 'save': 'ไฟๅญ˜ใ™ใ‚‹', - 'submit.ok': '้€ไฟกๆˆๅŠŸ', - 'save.ok': 'ๆญฃๅธธใซไฟๅญ˜ใ•ใ‚Œใพใ—ใŸ', - 'menu.welcome': 'ใ‚ˆใ†ใ“ใ', - 'menu.home': 'ใƒ›ใƒผใƒ ใƒšใƒผใ‚ธ', - 'menu.dashboard': 'ใƒ€ใƒƒใ‚ทใƒฅใƒœใƒผใƒ‰', - 'menu.dashboard.indicator': 'ๆŒ‡ๆจ™ๅˆ†ๆž', - 'menu.dashboard.community': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃ', - 'menu.dashboard.analysis': 'AIๅˆ†ๆž', - 'menu.dashboard.tradingAssistant': 'ๅ–ๅผ•ใ‚ขใ‚ทใ‚นใ‚ฟใƒณใƒˆ', - 'menu.dashboard.aiTradingAssistant': 'AIๅ–ๅผ•ใ‚ขใ‚ทใ‚นใ‚ฟใƒณใƒˆ', - 'menu.dashboard.signalRobot': 'ใ‚ทใ‚ฐใƒŠใƒซใƒญใƒœใƒƒใƒˆ', - 'menu.dashboard.monitor': 'ใƒขใƒ‹ใ‚ฟใƒชใƒณใ‚ฐใƒšใƒผใ‚ธ', - 'menu.dashboard.workplace': 'ไฝœๆฅญๅฐ', - 'menu.form': 'ใƒ•ใ‚ฉใƒผใƒ ใƒšใƒผใ‚ธ', - 'menu.form.basic-form': 'ๅŸบๆœฌๅฝข', - 'menu.form.step-form': 'ใ‚นใƒ†ใƒƒใƒ—ใƒใ‚คใ‚นใƒ†ใƒƒใƒ—ใƒ•ใ‚ฉใƒผใƒ ', - 'menu.form.step-form.info': 'ใ‚นใƒ†ใƒƒใƒ—ใƒใ‚คใ‚นใƒ†ใƒƒใƒ—ใƒ•ใ‚ฉใƒผใƒ ๏ผˆ่ปข้€ๆƒ…ๅ ฑใ‚’่จ˜ๅ…ฅ๏ผ‰', - 'menu.form.step-form.confirm': 'ใ‚นใƒ†ใƒƒใƒ—ใƒใ‚คใ‚นใƒ†ใƒƒใƒ—ใƒ•ใ‚ฉใƒผใƒ ๏ผˆๆŒฏ่พผๆƒ…ๅ ฑใฎ็ขบ่ช๏ผ‰', - 'menu.form.step-form.result': 'ใ‚นใƒ†ใƒƒใƒ—ใƒใ‚คใ‚นใƒ†ใƒƒใƒ—ใฎใƒ•ใ‚ฉใƒผใƒ ๏ผˆๅฎŒไบ†๏ผ‰', - 'menu.form.advanced-form': '้ซ˜ๅบฆใชใƒ•ใ‚ฉใƒผใƒ ', - 'menu.list': 'ไธ€่ฆงใƒšใƒผใ‚ธ', - 'menu.list.table-list': 'ใŠๅ•ใ„ๅˆใ‚ใ›ใƒ•ใ‚ฉใƒผใƒ ', - 'menu.list.basic-list': '่ฆๆ ผไธ€่ฆง', - 'menu.list.card-list': 'ใ‚ซใƒผใƒ‰ใƒชใ‚นใƒˆ', - 'menu.list.search-list': 'ๆคœ็ดขใƒชใ‚นใƒˆ', - 'menu.list.search-list.articles': 'ๆคœ็ดขใƒชใ‚นใƒˆ๏ผˆ่จ˜ไบ‹๏ผ‰', - 'menu.list.search-list.projects': 'ๆคœ็ดขใƒชใ‚นใƒˆ๏ผˆใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆ๏ผ‰', - 'menu.list.search-list.applications': 'ๆคœ็ดขใƒชใ‚นใƒˆ๏ผˆใ‚ขใƒ—ใƒช๏ผ‰', - 'menu.profile': '่ฉณ็ดฐใƒšใƒผใ‚ธ', - 'menu.profile.basic': 'ๅŸบๆœฌ่ฉณ็ดฐใƒšใƒผใ‚ธ', - 'menu.profile.advanced': '่ฉณ็ดฐใƒšใƒผใ‚ธ', - 'menu.result': '็ตๆžœใƒšใƒผใ‚ธ', - 'menu.result.success': 'ๆˆๅŠŸใƒšใƒผใ‚ธ', - 'menu.result.fail': 'ๅคฑๆ•—ใƒšใƒผใ‚ธ', - 'menu.exception': 'ไพ‹ๅค–ใƒšใƒผใ‚ธ', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'ใƒˆใƒชใ‚ฌใƒผใ‚จใƒฉใƒผ', - 'menu.account': 'ๅ€‹ไบบใƒšใƒผใ‚ธ', - 'menu.account.center': 'ใƒ‘ใƒผใ‚ฝใƒŠใƒซใ‚ปใƒณใ‚ฟใƒผ', - 'menu.account.settings': 'ๅ€‹ไบบ่จญๅฎš', - 'menu.account.trigger': 'ใƒˆใƒชใ‚ฌใƒผใ‚จใƒฉใƒผ', - 'menu.account.logout': 'ใƒญใ‚ฐใ‚ขใ‚ฆใƒˆ', - 'menu.wallet': '็งใฎ่ฒกๅธƒ', - 'menu.docs': 'ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ‚ปใƒณใ‚ฟใƒผ', - 'menu.docs.detail': 'ๆ–‡ๆ›ธใฎ่ฉณ็ดฐ', - 'menu.header.refreshPage': 'ใƒšใƒผใ‚ธใ‚’ๆ›ดๆ–ฐใ™ใ‚‹', - 'menu.invite.friends': 'ๅ‹้”ใ‚’ๆ‹›ๅพ…ใ™ใ‚‹', - 'app.setting.pagestyle': 'ๅ…จไฝ“็š„ใชใ‚นใ‚ฟใ‚คใƒซ่จญๅฎš', - 'app.setting.pagestyle.light': 'ๆ˜Žใ‚‹ใ„ใƒกใƒ‹ใƒฅใƒผใ‚นใ‚ฟใ‚คใƒซ', - 'app.setting.pagestyle.dark': 'ใƒ€ใƒผใ‚ฏใƒกใƒ‹ใƒฅใƒผใ‚นใ‚ฟใ‚คใƒซ', - 'app.setting.pagestyle.realdark': 'ใƒ€ใƒผใ‚ฏใƒขใƒผใƒ‰', - 'app.setting.themecolor': 'ใƒ†ใƒผใƒžใ‚ซใƒฉใƒผ', - 'app.setting.navigationmode': 'ใƒŠใƒ“ใ‚ฒใƒผใ‚ทใƒงใƒณใƒขใƒผใƒ‰', - 'app.setting.sidemenu.nav': 'ใ‚ตใ‚คใƒ‰ใƒใƒผใฎใƒŠใƒ“ใ‚ฒใƒผใ‚ทใƒงใƒณ', - 'app.setting.topmenu.nav': 'ใƒˆใƒƒใƒ—ใƒใƒผใฎใƒŠใƒ“ใ‚ฒใƒผใ‚ทใƒงใƒณ', - 'app.setting.content-width': 'ใ‚ณใƒณใƒ†ใƒณใƒ„้ ˜ๅŸŸใฎๅน…', - 'app.setting.content-width.tooltip': 'ใ“ใฎ่จญๅฎšใฏใ€[ใƒˆใƒƒใƒ—ใƒใƒผใƒŠใƒ“ใ‚ฒใƒผใ‚ทใƒงใƒณ]ๆ™‚ใฎใฟๆœ‰ๅŠนใงใ™ใ€‚', - 'app.setting.content-width.fixed': 'ไฟฎๆญฃๆธˆใฟ', - 'app.setting.content-width.fluid': 'ใ‚นใƒˆใƒชใƒผใƒŸใƒณใ‚ฐ', - 'app.setting.fixedheader': 'ๅ›บๅฎšใƒ˜ใƒƒใƒ€ใƒผ', - 'app.setting.fixedheader.tooltip': 'ๅ›บๅฎšใƒ˜ใƒƒใƒ€ใƒผๆ™‚ใซ่จญๅฎšๅฏ่ƒฝ', - 'app.setting.autoHideHeader': 'ใ‚นใ‚ฏใƒญใƒผใƒซๆ™‚ใซใƒ˜ใƒƒใƒ€ใƒผใ‚’้ž่กจ็คบใซใ™ใ‚‹', - 'app.setting.fixedsidebar': 'ใ‚ตใ‚คใƒ‰ใƒกใƒ‹ใƒฅใƒผใ‚’ไฟฎๆญฃ', - 'app.setting.sidemenu': 'ใ‚ตใ‚คใƒ‰ใƒกใƒ‹ใƒฅใƒผใฎใƒฌใ‚คใ‚ขใ‚ฆใƒˆ', - 'app.setting.topmenu': 'ใƒˆใƒƒใƒ—ใƒกใƒ‹ใƒฅใƒผใฎใƒฌใ‚คใ‚ขใ‚ฆใƒˆ', - 'app.setting.othersettings': 'ใใฎไป–ใฎ่จญๅฎš', - 'app.setting.weakmode': 'ใ‚ซใƒฉใƒผใ‚ฆใ‚ฃใƒผใ‚ฏใƒใ‚นใƒขใƒผใƒ‰', - 'app.setting.multitab': 'ใƒžใƒซใƒใ‚ฟใƒ–ใƒขใƒผใƒ‰', - 'app.setting.copy': '่จญๅฎšใ‚’ใ‚ณใƒ”ใƒผใ™ใ‚‹', - 'app.setting.loading': 'ใƒ†ใƒผใƒžใ‚’่ชญใฟ่พผใฟไธญ', - 'app.setting.copyinfo': '่จญๅฎšใŒๆญฃๅธธใซใ‚ณใƒ”ใƒผใ•ใ‚Œใพใ—ใŸ src/config/defaultSettings.js', - 'app.setting.copy.success': 'ใ‚ณใƒ”ใƒผๅฎŒไบ†', - 'app.setting.copy.fail': 'ใ‚ณใƒ”ใƒผใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'app.setting.theme.switching': 'ใƒ†ใƒผใƒžๅค‰ๆ›ด๏ผ', - 'app.setting.production.hint': 'ๆง‹ๆˆใƒใƒผใฏ้–‹็™บ็’ฐๅขƒใงใฎใƒ—ใƒฌใƒ“ใƒฅใƒผใซใฎใฟไฝฟ็”จใ•ใ‚Œใ€้‹็”จ็’ฐๅขƒใงใฏ่กจ็คบใ•ใ‚Œใพใ›ใ‚“ใ€‚ ๆง‹ๆˆใƒ•ใ‚กใ‚คใƒซใ‚’ๆ‰‹ๅ‹•ใงใ‚ณใƒ”ใƒผใ—ใฆๅค‰ๆ›ดใ—ใฆใใ ใ•ใ„ใ€‚', - 'app.setting.themecolor.daybreak': 'ใƒ‰ใƒผใƒณใƒ–ใƒซใƒผ๏ผˆใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ๏ผ‰', - 'app.setting.themecolor.dust': 'ๅค•ๆšฎใ‚Œ', - 'app.setting.themecolor.volcano': '็ซๅฑฑ', - 'app.setting.themecolor.sunset': 'ๆ—ฅๆฒก', - 'app.setting.themecolor.cyan': 'ๆ˜Žๆธ…', - 'app.setting.themecolor.green': 'ใ‚ชใƒผใƒญใƒฉใ‚ฐใƒชใƒผใƒณ', - 'app.setting.themecolor.geekblue': 'ใ‚ชใ‚ฟใ‚ฏใƒ–ใƒซใƒผ', - 'app.setting.themecolor.purple': 'ใ‚ธใƒฃใƒณใƒปใ‚ธใƒผ', - 'app.setting.tooltip': 'ใƒšใƒผใ‚ธ่จญๅฎš', - 'user.login.userName': 'ใƒฆใƒผใ‚ถใƒผๅ', - 'user.login.password': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰', - 'user.login.username.placeholder': 'ใ‚ขใ‚ซใ‚ฆใƒณใƒˆ: ็ฎก็†่€…', - 'user.login.password.placeholder': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰: admin ใพใŸใฏ ant.design', - 'user.login.message-invalid-credentials': 'ใƒญใ‚ฐใ‚คใƒณใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใจ็ขบ่ชใ‚ณใƒผใƒ‰ใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„', - 'user.login.message-invalid-verification-code': '่ช่จผใ‚ณใƒผใƒ‰ใ‚จใƒฉใƒผ', - 'user.login.tab-login-credentials': 'ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใƒ‘ใ‚นใƒฏใƒผใƒ‰ใƒญใ‚ฐใ‚คใƒณ', - 'user.login.tab-login-email': 'ใƒกใƒผใƒซใƒญใ‚ฐใ‚คใƒณ', - 'user.login.tab-login-mobile': 'ๆบๅธฏ้›ป่ฉฑ็•ชๅทใƒญใ‚ฐใ‚คใƒณ', - 'user.login.captcha.placeholder': 'ใ‚ฐใƒฉใƒ•ใ‚ฃใƒƒใ‚ฏ่ช่จผใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'user.login.mobile.placeholder': 'ๆบๅธฏ้›ป่ฉฑ็•ชๅท', - 'user.login.mobile.verification-code.placeholder': '่ช่จผใ‚ณใƒผใƒ‰', - 'user.login.email.placeholder': 'ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'user.login.email.verification-code.placeholder': '็ขบ่ชใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'user.login.email.sending': '่ช่จผใ‚ณใƒผใƒ‰ใŒ้€ไฟกใ•ใ‚Œใฆใ„ใพใ™...', - 'user.login.email.send-success-title': 'ใƒ’ใƒณใƒˆ', - 'user.login.email.send-success': '็ขบ่ชใ‚ณใƒผใƒ‰ใฏๆญฃๅธธใซ้€ไฟกใ•ใ‚Œใพใ—ใŸใ€‚ใƒกใƒผใƒซใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„', - 'user.login.sms.send-success': '็ขบ่ชใ‚ณใƒผใƒ‰ใŒๆญฃๅธธใซ้€ไฟกใ•ใ‚Œใพใ—ใŸใ€‚ใƒ†ใ‚ญใ‚นใƒˆ ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚', - 'user.login.remember-me': '่‡ชๅ‹•ใƒญใ‚ฐใ‚คใƒณ', - 'user.login.forgot-password': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ๅฟ˜ใ‚ŒใŸๅ ดๅˆ', - 'user.login.sign-in-with': 'ใใฎไป–ใฎใƒญใ‚ฐใ‚คใƒณๆ–นๆณ•', - 'user.login.signup': 'ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’็™ป้Œฒใ™ใ‚‹', - 'user.login.login': 'ใƒญใ‚ฐใ‚คใƒณ', - 'user.register.register': '็™ป้Œฒใ™ใ‚‹', - 'user.register.email.placeholder': '้›ปๅญใƒกใƒผใƒซ', - 'user.register.password.placeholder': '6ๆ–‡ๅญ—ไปฅไธŠใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚ ๆŽจๆธฌใ•ใ‚Œใ‚„ใ™ใ„ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฏไฝฟ็”จใ—ใชใ„ใงใใ ใ•ใ„ใ€‚', - 'user.register.password.popover-message': '6ๆ–‡ๅญ—ไปฅไธŠใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚ ๆŽจๆธฌใ•ใ‚Œใ‚„ใ™ใ„ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฏไฝฟ็”จใ—ใชใ„ใงใใ ใ•ใ„ใ€‚', - 'user.register.confirm-password.placeholder': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฎ็ขบ่ช', - 'user.register.get-verification-code': '็ขบ่ชใ‚ณใƒผใƒ‰ใ‚’ๅ–ๅพ—ใ™ใ‚‹', - 'user.register.sign-in': 'ๆ—ขๅญ˜ใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ไฝฟ็”จใ—ใฆใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹', - 'user.register-result.msg': 'ใ‚ใชใŸใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆ: {email} ็™ป้ŒฒใŒๆˆๅŠŸใ—ใพใ—ใŸ', - 'user.register-result.activation-email': 'ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ™ใƒผใ‚ทใƒงใƒณ้›ปๅญใƒกใƒผใƒซใฏใƒกใƒผใƒซใƒœใƒƒใ‚ฏใ‚นใซ้€ไฟกใ•ใ‚Œใ€24 ๆ™‚้–“ๆœ‰ๅŠนใงใ™ใ€‚ ใ™ใใซใƒกใƒผใƒซใซใƒญใ‚ฐใ‚คใƒณใ—ใ€ใƒกใƒผใƒซๅ†…ใฎใƒชใƒณใ‚ฏใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆใ‚ขใ‚ซใ‚ฆใƒณใƒˆใ‚’ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใซใ—ใฆใใ ใ•ใ„ใ€‚', - 'user.register-result.back-home': 'ใƒ›ใƒผใƒ ใƒšใƒผใ‚ธใซๆˆปใ‚‹', - 'user.register-result.view-mailbox': 'ใƒกใƒผใƒซใƒœใƒƒใ‚ฏใ‚นใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„', - 'user.email.required': 'ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผ', - 'user.email.wrong-format': 'ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใฎๅฝขๅผใŒ้–“้•ใฃใฆใ„ใพใ™!', - 'user.userName.required': 'ใ‚ขใ‚ซใ‚ฆใƒณใƒˆๅใพใŸใฏใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'user.password.required': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'user.password.twice.msg': '2 ๅ›žๅ…ฅๅŠ›ใ—ใŸใƒ‘ใ‚นใƒฏใƒผใƒ‰ใŒไธ€่‡ดใ—ใพใ›ใ‚“ใ€‚', - 'user.password.strength.msg': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฎๅผทๅบฆใŒๅๅˆ†ใงใฏใ‚ใ‚Šใพใ›ใ‚“', - 'user.password.strength.strong': 'ๅผทใ•: ๅผทใ„', - 'user.password.strength.medium': 'ๅผทใ•: ไธญ', - 'user.password.strength.low': 'ๅผทๅบฆ: ไฝŽใ„', - 'user.password.strength.short': 'ๅผทใ•๏ผš็Ÿญใ™ใŽใ‚‹', - 'user.confirm-password.required': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚', - 'user.phone-number.required': 'ๆญฃใ—ใ„ๆบๅธฏ้›ป่ฉฑ็•ชๅทใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'user.phone-number.wrong-format': 'ๆบๅธฏ้›ป่ฉฑ็•ชๅทใฎๅฝขๅผใŒ้–“้•ใฃใฆใ„ใพใ™ใ€‚', - 'user.verification-code.required': '็ขบ่ชใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'user.captcha.required': 'ใ‚ฐใƒฉใƒ•ใ‚ฃใƒƒใ‚ฏ่ช่จผใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'user.login.infos': 'QuantDingerใฏAIใƒžใƒซใƒใ‚จใƒผใ‚ธใ‚งใƒณใƒˆๆ ชๅˆ†ๆž่ฃœๅŠฉใƒ„ใƒผใƒซใงใ‚ใ‚Šใ€่จผๅˆธๆŠ•่ณ‡ใ‚ณใƒณใ‚ตใƒซใƒ†ใ‚ฃใƒณใ‚ฐ่ณ‡ๆ ผใฏใ”ใ–ใ„ใพใ›ใ‚“ใ€‚ ใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ๅ†…ใฎใ™ในใฆใฎๅˆ†ๆž็ตๆžœใ€ใ‚นใ‚ณใ‚ขใ€ๅ‚่€ƒๆ„่ฆ‹ใฏ้ŽๅŽปใฎใƒ‡ใƒผใ‚ฟใซๅŸบใฅใ„ใฆAIใซใ‚ˆใฃใฆ่‡ชๅ‹•็š„ใซ็”Ÿๆˆใ•ใ‚Œใ€ๅญฆ็ฟ’ใ€็ ”็ฉถใ€ๆŠ€่ก“ไบคๆตใฎใฟใซไฝฟ็”จใ•ใ‚Œใ€ๆŠ•่ณ‡ใ‚ขใƒ‰ใƒใ‚คใ‚นใ‚„ๆ„ๆ€ๆฑบๅฎšใฎๅŸบ็คŽใ‚’ๆง‹ๆˆใ™ใ‚‹ใ‚‚ใฎใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ๆ ชๅผๆŠ•่ณ‡ใซใฏๅธ‚ๅ ดใƒชใ‚นใ‚ฏใ€ๆตๅ‹•ๆ€งใƒชใ‚นใ‚ฏใ€ๆ”ฟ็ญ–ใƒชใ‚นใ‚ฏ็ญ‰ใฎๆง˜ใ€…ใชใƒชใ‚นใ‚ฏใŒไผดใ„ใ€ๅ…ƒๆœฌใ‚’ๅ‰ฒใ‚Š่พผใ‚€ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚ ใƒฆใƒผใ‚ถใƒผใฏ่‡ช่บซใฎใƒชใ‚นใ‚ฏ่จฑๅฎนๅบฆใซๅŸบใฅใ„ใฆ็‹ฌ็ซ‹ใ—ใŸๆฑบๅฎšใ‚’่กŒใ†ๅฟ…่ฆใŒใ‚ใ‚Šใ€ๆœฌใƒ„ใƒผใƒซใฎไฝฟ็”จใ‹ใ‚‰็”Ÿใ˜ใ‚‹ๆŠ•่ณ‡่กŒๅ‹•ใŠใ‚ˆใณ็ตๆžœใฏใƒฆใƒผใ‚ถใƒผใŒ่ฒ ๆ‹…ใ™ใ‚‹ใ‚‚ใฎใจใ—ใพใ™ใ€‚ ๅธ‚ๅ ดใซใฏใƒชใ‚นใ‚ฏใŒใ‚ใ‚Šใ€ๆŠ•่ณ‡ใฏๆ…Ž้‡ใซใชใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚', - 'user.login.tab-login-web3': 'Web3ใƒญใ‚ฐใ‚คใƒณ', - 'user.login.web3.tip': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚’ไฝฟ็”จใ—ใŸ็ฝฒๅใƒญใ‚ฐใ‚คใƒณ', - 'user.login.web3.connect': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใซๆŽฅ็ถšใ—ใฆใƒญใ‚ฐใ‚คใƒณใ™ใ‚‹', - 'user.login.web3.no-wallet': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใŒๆคœๅ‡บใ•ใ‚Œใชใ„', - 'user.login.web3.no-address': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚ขใƒ‰ใƒฌใ‚นใŒๅ–ๅพ—ใงใใพใ›ใ‚“ใงใ—ใŸ', - 'user.login.web3.nonce-failed': 'ไนฑๆ•ฐใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'user.login.web3.verify-failed': '็ฝฒๅๆคœ่จผใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'user.login.web3.success': 'ใƒญใ‚ฐใ‚คใƒณๆˆๅŠŸ', - 'user.login.web3.failed': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใธใฎใƒญใ‚ฐใ‚คใƒณใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'nav.no_wallet': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใŒๆคœๅ‡บใ•ใ‚Œใชใ„', - 'nav.copy': 'ใ‚ณใƒ”ใƒผ', - 'nav.copy_success': 'ๆญฃๅธธใซใ‚ณใƒ”ใƒผใ•ใ‚Œใพใ—ใŸ', - 'user.login.oauth.google': 'Googleใงใ‚ตใ‚คใƒณใ‚คใƒณ', - 'user.login.oauth.github': 'GitHub ใงใ‚ตใ‚คใƒณใ‚คใƒณใ™ใ‚‹', - 'user.login.oauth.loading': '่ช่จผใƒšใƒผใ‚ธใซใƒชใƒ€ใ‚คใƒฌใ‚ฏใƒˆใ—ใฆใ„ใพใ™...', - 'user.login.oauth.failed': 'OAuthใƒญใ‚ฐใ‚คใƒณใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'user.login.oauth.get-url-failed': '่ช่จผใƒชใƒณใ‚ฏใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'user.login.subtitle': 'ไธ–็•Œๅธ‚ๅ ดใซๅฏพใ™ใ‚‹ๅฎš้‡็š„ใชๆดžๅฏŸใ‚’ๆŽจ้€ฒ', - 'user.login.legal.title': 'ๆณ•็š„ๅ…่ฒฌไบ‹้ …', - 'user.login.legal.view': 'ๆณ•็š„ๅ…่ฒฌไบ‹้ …ใ‚’่กจ็คบ', - 'user.login.legal.collapse': 'ๆณ•็š„ๅ…่ฒฌไบ‹้ …ใ‚’ๆŠ˜ใ‚ŠใŸใŸใ‚€', - 'user.login.legal.agree': 'ๆณ•็š„ๅ…่ฒฌไบ‹้ …ใ‚’่ชญใฟใ€ๅŒๆ„ใ—ใพใ™', - 'user.login.legal.required': 'ใพใšๆณ•็š„ๅ…่ฒฌไบ‹้ …ใ‚’่ชญใ‚“ใง็ขบ่ชใ—ใฆใใ ใ•ใ„', - 'user.login.legal.content': 'QuantDingerใฏAIใƒžใƒซใƒใ‚จใƒผใ‚ธใ‚งใƒณใƒˆๆ ชๅˆ†ๆž่ฃœๅŠฉใƒ„ใƒผใƒซใงใ‚ใ‚Šใ€่จผๅˆธๆŠ•่ณ‡ใ‚ณใƒณใ‚ตใƒซใƒ†ใ‚ฃใƒณใ‚ฐ่ณ‡ๆ ผใฏใ”ใ–ใ„ใพใ›ใ‚“ใ€‚ ใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ๅ†…ใฎใ™ในใฆใฎๅˆ†ๆž็ตๆžœใ€่ฉ•ไพกใ€ๅ‚่€ƒๆ„่ฆ‹ใฏ้ŽๅŽปใฎใƒ‡ใƒผใ‚ฟใซๅŸบใฅใ„ใฆAIใซใ‚ˆใฃใฆ่‡ชๅ‹•็š„ใซ็”Ÿๆˆใ•ใ‚Œใ€ๅญฆ็ฟ’ใ€็ ”็ฉถใ€ๆŠ€่ก“ไบคๆตใฎใฟใซไฝฟ็”จใ•ใ‚Œใ€ๆŠ•่ณ‡ใ‚ขใƒ‰ใƒใ‚คใ‚นใ‚„ๆ„ๆ€ๆฑบๅฎšใฎๅŸบ็คŽใ‚’ๆง‹ๆˆใ™ใ‚‹ใ‚‚ใฎใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ ๆ ชๅผๆŠ•่ณ‡ใซใฏๅธ‚ๅ ดใƒชใ‚นใ‚ฏใ€ๆตๅ‹•ๆ€งใƒชใ‚นใ‚ฏใ€ๆ”ฟ็ญ–ใƒชใ‚นใ‚ฏ็ญ‰ใฎๆง˜ใ€…ใชใƒชใ‚นใ‚ฏใŒไผดใ„ใ€ๅ…ƒๆœฌใ‚’ๅ‰ฒใ‚Š่พผใ‚€ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚ ใƒฆใƒผใ‚ถใƒผใฏ่‡ช่บซใฎใƒชใ‚นใ‚ฏ่จฑๅฎนๅบฆใซๅŸบใฅใ„ใฆ็‹ฌ็ซ‹ใ—ใŸๆฑบๅฎšใ‚’่กŒใ†ๅฟ…่ฆใŒใ‚ใ‚Šใ€ๆœฌใƒ„ใƒผใƒซใฎไฝฟ็”จใ‹ใ‚‰็”Ÿใ˜ใ‚‹ๆŠ•่ณ‡่กŒๅ‹•ใŠใ‚ˆใณ็ตๆžœใฏใƒฆใƒผใ‚ถใƒผใŒ่ฒ ๆ‹…ใ™ใ‚‹ใ‚‚ใฎใจใ—ใพใ™ใ€‚ ๅธ‚ๅ ดใซใฏใƒชใ‚นใ‚ฏใŒใ‚ใ‚Šใ€ๆŠ•่ณ‡ใฏๆ…Ž้‡ใซใชใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚', - 'user.login.privacy.title': 'ใƒฆใƒผใ‚ถใƒผใƒ—ใƒฉใ‚คใƒใ‚ทใƒผใƒใƒชใ‚ทใƒผ', - 'user.login.privacy.view': 'ใƒฆใƒผใ‚ถใƒผใฎใƒ—ใƒฉใ‚คใƒใ‚ทใƒผ ใƒใƒชใ‚ทใƒผใ‚’่กจ็คบใ™ใ‚‹', - 'user.login.privacy.collapse': 'ใƒฆใƒผใ‚ถใƒผใฎใƒ—ใƒฉใ‚คใƒใ‚ทใƒผ่ฆ็ด„ใ‚’้–‰ใ˜ใ‚‹', - 'user.login.privacy.content': '็งใŸใกใฏใ‚ใชใŸใฎใƒ—ใƒฉใ‚คใƒใ‚ทใƒผใจใƒ‡ใƒผใ‚ฟไฟ่ญทใ‚’ๅคงๅˆ‡ใซใ—ใฆใ„ใพใ™ใ€‚ 1) ๅŽ้›†็ฏ„ๅ›ฒ๏ผšๆฉŸ่ƒฝใฎๅฎŸ็พใซๅฟ…่ฆใชๆƒ…ๅ ฑ๏ผˆใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ€ๆบๅธฏ้›ป่ฉฑ็•ชๅทใ€ๅธ‚ๅค–ๅฑ€็•ชใ€Web3ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚ขใƒ‰ใƒฌใ‚นใชใฉ๏ผ‰ใจๅฟ…่ฆใชใƒญใ‚ฐใ€็ซฏๆœซๆƒ…ๅ ฑใฎใฟใ‚’ๅŽ้›†ใ—ใพใ™ใ€‚ 2) ๅˆฉ็”จ็›ฎ็š„๏ผšใ‚ขใ‚ซใ‚ฆใƒณใƒˆใธใฎใƒญใ‚ฐใ‚คใƒณใŠใ‚ˆใณใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ็ขบ่ชใ€ใ‚ตใƒผใƒ“ใ‚นๆฉŸ่ƒฝใฎๆไพ›ใ€ใƒˆใƒฉใƒ–ใƒซใ‚ทใƒฅใƒผใƒ†ใ‚ฃใƒณใ‚ฐใŠใ‚ˆใณใ‚ณใƒณใƒ—ใƒฉใ‚คใ‚ขใƒณใ‚น่ฆไปถใฎใŸใ‚ใ€‚ 3) ไฟ็ฎกใจใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ: ใƒ‡ใƒผใ‚ฟใฏๆš—ๅทๅŒ–ใ•ใ‚Œใฆไฟ็ฎกใ•ใ‚Œใ€ไธๆญฃใชใ‚ขใ‚ฏใ‚ปใ‚นใ€้–‹็คบใ€ๆๅคฑใ‚’้˜ฒใใŸใ‚ใซๅฟ…่ฆใช่จฑๅฏใจใ‚ขใ‚ฏใ‚ปใ‚นๅˆถๅพกๆ‰‹ๆฎตใŒ่ฌ›ใ˜ใ‚‰ใ‚Œใพใ™ใ€‚ 4) ็ฌฌไธ‰่€…ใจใฎๅ…ฑๆœ‰: ๆณ•ไปคใง็พฉๅ‹™ไป˜ใ‘ใ‚‰ใ‚Œใฆใ„ใ‚‹ๅ ดๅˆใ€ใพใŸใฏใ‚ตใƒผใƒ“ใ‚นใฎๅฎŸ่กŒใซๅฟ…่ฆใชๅ ดๅˆใ‚’้™คใใ€ใŠๅฎขๆง˜ใฎๅ€‹ไบบๆƒ…ๅ ฑใฏ็ฌฌไธ‰่€…ใจๅ…ฑๆœ‰ใ•ใ‚Œใ‚‹ใ“ใจใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใ‚ตใƒผใƒ‰ใƒ‘ใƒผใƒ†ใ‚ฃใฎใ‚ตใƒผใƒ“ใ‚น (ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ€SMS ใ‚ตใƒผใƒ“ใ‚นใƒ—ใƒญใƒใ‚คใƒ€ใƒผใชใฉ) ใŒ้–ขไธŽใ™ใ‚‹ๅ ดๅˆใ€ๆฉŸ่ƒฝใฎๅฎŸ่ฃ…ใซๅฟ…่ฆใชๆœ€ๅฐ้™ใฎ็ฏ„ๅ›ฒใงใฎใฟๅ‡ฆ็†ใ•ใ‚Œใพใ™ใ€‚ 5) Cookie/ใƒญใƒผใ‚ซใƒซ ใ‚นใƒˆใƒฌใƒผใ‚ธ: ใƒญใ‚ฐใ‚คใƒณ ใ‚นใƒ†ใƒผใ‚ฟใ‚นใจๅฟ…่ฆใชใ‚ปใƒƒใ‚ทใƒงใƒณ็ถญๆŒ (ใƒˆใƒผใ‚ฏใƒณใ€PHPSESSID ใชใฉ) ใซไฝฟ็”จใ•ใ‚Œใ€ใƒ–ใƒฉใ‚ฆใ‚ถใƒผใงใ‚ฏใƒชใ‚ขใพใŸใฏๅˆถ้™ใงใใพใ™ใ€‚ 6) ๅ€‹ไบบใฎๆจฉๅˆฉ๏ผšๆณ•ไปคใซๅŸบใฅใใ€็…งไผšใ€่จ‚ๆญฃใ€ๅ‰Š้™คใ€ๅŒๆ„ใฎๆ’คๅ›ž็ญ‰ใ‚’่กŒใ†ๆจฉๅˆฉใ‚’่กŒไฝฟใ™ใ‚‹ใ“ใจใŒใงใใพใ™ใ€‚ 7) ๅค‰ๆ›ดใจ้€š็Ÿฅ: ใ“ใ‚Œใ‚‰ใฎๆกไปถใŒๆ›ดๆ–ฐใ•ใ‚Œใ‚‹ใจใ€ใƒšใƒผใ‚ธไธŠใง็›ฎ็ซ‹ใคใ‚ˆใ†ใซ่กจ็คบใ•ใ‚Œใพใ™ใ€‚ ใ“ใฎใ‚ตใƒผใƒ“ใ‚นใ‚’็ถ™็ถšใ—ใฆไฝฟ็”จใ™ใ‚‹ใ“ใจใซใ‚ˆใ‚Šใ€ๆ›ดๆ–ฐใ•ใ‚ŒใŸๅ†…ๅฎนใ‚’่ชญใฟใ€ๅŒๆ„ใ—ใŸใ‚‚ใฎใจใฟใชใ•ใ‚Œใพใ™ใ€‚ ๆœฌ่ฆ็ด„ใพใŸใฏใใฎๆ›ดๆ–ฐใซๅŒๆ„ใงใใชใ„ๅ ดๅˆใฏใ€ใ‚ตใƒผใƒ“ใ‚นใฎไฝฟ็”จใ‚’ไธญๆญขใ—ใ€ๅฝ“็คพใพใงใ”้€ฃ็ตกใใ ใ•ใ„ใ€‚', - 'account.basicInfo': 'ๅŸบๆœฌๆƒ…ๅ ฑ', - 'account.id': 'ใƒฆใƒผใ‚ถใƒผID', - 'account.username': 'ใƒฆใƒผใ‚ถใƒผๅ', - 'account.nickname': 'ใƒ‹ใƒƒใ‚ฏใƒใƒผใƒ ', - 'account.email': '้›ปๅญใƒกใƒผใƒซ', - 'account.mobile': 'ๆบๅธฏ้›ป่ฉฑ็•ชๅท', - 'account.web3address': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚ขใƒ‰ใƒฌใ‚น', - 'account.pid': '็ดนไป‹่€…ID', - 'account.level': 'ใƒฆใƒผใ‚ถใƒผใƒฌใƒ™ใƒซ', - 'account.money': 'ใƒใƒฉใƒณใ‚น', - 'account.qdtBalance': 'QDTใƒใƒฉใƒณใ‚น', - 'account.score': 'ใƒใ‚คใƒณใƒˆ', - 'account.createtime': '็™ป้Œฒๆ™‚้–“', - 'account.inviteLink': 'ๆ‹›ๅพ…ใƒชใƒณใ‚ฏ', - 'account.recharge': 'ใƒชใƒใƒฃใƒผใ‚ธ', - 'account.rechargeTip': 'WeChat ใพใŸใฏ Alipay ใ‚’ไฝฟ็”จใ—ใฆใ€ไปฅไธ‹ใฎ QR ใ‚ณใƒผใƒ‰ใ‚’ใ‚นใ‚ญใƒฃใƒณใ—ใฆใƒใƒฃใƒผใ‚ธใ—ใฆใใ ใ•ใ„ใ€‚', - 'account.qrCodePlaceholder': 'QR ใ‚ณใƒผใƒ‰ ใƒ—ใƒฌใƒผใ‚นใƒ›ใƒซใƒ€ใƒผ (ใ‚จใƒŸใƒฅใƒฌใƒผใ‚ทใƒงใƒณ)', - 'account.rechargeAmount': 'ใƒใƒฃใƒผใ‚ธ้‡‘้ก', - 'account.enterAmount': 'ใƒใƒฃใƒผใ‚ธ้‡‘้กใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'account.rechargeHint': 'ๆœ€ไฝŽๅ…ฅ้‡‘้ก: 1 QDT', - 'account.confirmRecharge': 'ใƒชใƒใƒฃใƒผใ‚ธใ‚’็ขบ่ชใ™ใ‚‹', - 'account.enterValidAmount': 'ๆœ‰ๅŠนใชใƒชใƒใƒฃใƒผใ‚ธ้‡‘้กใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'account.rechargeSuccess': 'ใƒชใƒใƒฃใƒผใ‚ธๆˆๅŠŸ๏ผ {้‡‘้ก} QDT ใ‚’ๅ…ฅ้‡‘ใ—ใพใ—ใŸ', - 'account.settings.menuMap.basic': 'ๅŸบๆœฌ่จญๅฎš', - 'account.settings.menuMap.security': 'ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃ่จญๅฎš', - 'account.settings.menuMap.notification': 'ๆ–ฐ็€ใƒกใƒƒใ‚ปใƒผใ‚ธ้€š็Ÿฅ', - 'account.settings.menuMap.moneyLog': 'ใƒ•ใ‚กใƒณใƒ‰ใฎ่ฉณ็ดฐ', - 'account.moneyLog.empty': 'ใƒ•ใ‚กใƒณใƒ‰ใฎ่ฉณ็ดฐใฏใพใ ใ‚ใ‚Šใพใ›ใ‚“', - 'account.moneyLog.total': 'ๅˆ่จˆ {total} ใƒฌใ‚ณใƒผใƒ‰', - 'account.moneyLog.type.purchase': '่ณผๅ…ฅใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'account.moneyLog.type.recharge': 'ใƒชใƒใƒฃใƒผใ‚ธ', - 'account.moneyLog.type.refund': 'ๆ‰•ใ„ๆˆปใ—', - 'account.moneyLog.type.reward': 'ๅ ฑ้…ฌ', - 'account.moneyLog.type.income': 'ๆŒ‡ๆจ™ๅŽๅ…ฅ', - 'account.moneyLog.type.commission': 'ใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ๆ‰‹ๆ•ฐๆ–™', - 'wallet.balance': 'QDTใƒใƒฉใƒณใ‚น', - 'wallet.recharge': 'ใƒชใƒใƒฃใƒผใ‚ธ', - 'wallet.withdraw': '็พ้‡‘ใ‚’ๅผ•ใๅ‡บใ™', - 'wallet.filter': 'ใƒ•ใ‚ฃใƒซใ‚ฟใƒผ', - 'wallet.reset': 'ใƒชใ‚ปใƒƒใƒˆ', - 'wallet.totalRecharge': '็ดฏ็ฉใƒชใƒใƒฃใƒผใ‚ธ', - 'wallet.totalWithdraw': '็ดฏ็ฉๅผ•ใๅ‡บใ—้ก', - 'wallet.totalIncome': '็ดฏ่จˆๅŽๅ…ฅ', - 'wallet.records': 'ๅ–ๅผ•่จ˜้Œฒใจ่ณ‡้‡‘ใฎ่ฉณ็ดฐ', - 'wallet.tradingRecords': 'ๅ–ๅผ•ๅฑฅๆญด', - 'wallet.moneyLog': 'ใƒ•ใ‚กใƒณใƒ‰ใฎ่ฉณ็ดฐ', - 'wallet.rechargeTip': 'WeChat ใพใŸใฏ Alipay ใ‚’ไฝฟ็”จใ—ใฆใ€ไปฅไธ‹ใฎ QR ใ‚ณใƒผใƒ‰ใ‚’ใ‚นใ‚ญใƒฃใƒณใ—ใฆใƒใƒฃใƒผใ‚ธใ—ใฆใใ ใ•ใ„ใ€‚', - 'wallet.qrCodePlaceholder': 'QR ใ‚ณใƒผใƒ‰ ใƒ—ใƒฌใƒผใ‚นใƒ›ใƒซใƒ€ใƒผ (ใ‚จใƒŸใƒฅใƒฌใƒผใ‚ทใƒงใƒณ)', - 'wallet.rechargeAmount': 'ใƒใƒฃใƒผใ‚ธ้‡‘้ก', - 'wallet.enterAmount': 'ใƒใƒฃใƒผใ‚ธ้‡‘้กใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'wallet.rechargeHint': 'ๆœ€ไฝŽๅ…ฅ้‡‘้ก: 1 QDT', - 'wallet.confirmRecharge': 'ใƒชใƒใƒฃใƒผใ‚ธใ‚’็ขบ่ชใ™ใ‚‹', - 'wallet.enterValidAmount': 'ๆœ‰ๅŠนใชใƒชใƒใƒฃใƒผใ‚ธ้‡‘้กใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'wallet.rechargeSuccess': 'ใƒชใƒใƒฃใƒผใ‚ธๆˆๅŠŸ๏ผ {้‡‘้ก} QDT ใ‚’ๅ…ฅ้‡‘ใ—ใพใ—ใŸ', - 'wallet.rechargeFailed': 'ๅ†ๅ……้›ปใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'wallet.withdrawTip': 'ๅ‡บ้‡‘้‡‘้กใจๅ‡บ้‡‘ใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'wallet.withdrawAmount': 'ๅ‡บ้‡‘้ก', - 'wallet.enterWithdrawAmount': 'ๅ‡บ้‡‘้กใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'wallet.withdrawHint': 'ๆœ€ไฝŽๅ‡บ้‡‘้ก: 1 QDT', - 'wallet.withdrawAddress': 'ๅ‡บ้‡‘ใ‚ขใƒ‰ใƒฌใ‚น (ใ‚ชใƒ—ใ‚ทใƒงใƒณ)', - 'wallet.enterWithdrawAddress': 'ๅ‡บ้‡‘ใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'wallet.confirmWithdraw': 'ๅ‡บ้‡‘ใฎ็ขบ่ช', - 'wallet.enterValidWithdrawAmount': 'ๆœ‰ๅŠนใชๅ‡บ้‡‘้กใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'wallet.insufficientBalance': 'ๆฎ‹้ซ˜ไธ่ถณ', - 'wallet.withdrawSuccess': 'ๅผ•ใๅ‡บใ—ๆˆๅŠŸ๏ผ {้‡‘้ก} QDT ใ‚’ๅผ•ใๅ‡บใ—ใพใ—ใŸ', - 'wallet.withdrawFailed': 'ๅ‡บ้‡‘ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'wallet.noTradingRecords': 'ใพใ ๅ–ๅผ•่จ˜้ŒฒใŒใ‚ใ‚Šใพใ›ใ‚“', - 'wallet.noMoneyLog': 'ใƒ•ใ‚กใƒณใƒ‰ใฎ่ฉณ็ดฐใฏใพใ ใ‚ใ‚Šใพใ›ใ‚“', - 'wallet.loadTradingRecordsFailed': 'ใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณใƒฌใ‚ณใƒผใƒ‰ใฎใƒญใƒผใƒ‰ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'wallet.loadMoneyLogFailed': 'ใƒ•ใ‚กใƒณใƒ‰ใฎ่ฉณ็ดฐใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ', - 'wallet.moneyLogTotal': 'ๅˆ่จˆ {total} ใƒฌใ‚ณใƒผใƒ‰', - 'wallet.moneyLogTypeTitle': 'ใ‚ฟใ‚คใƒ—', - 'wallet.moneyLogType.all': 'ๅ…จ็จฎ้กž', - 'wallet.table.time': 'ๆ™‚้–“', - 'wallet.table.type': 'ใ‚ฟใ‚คใƒ—', - 'wallet.table.price': 'ไพกๆ ผ', - 'wallet.table.amount': 'ๆ•ฐ้‡', - 'wallet.table.money': '้‡‘้ก', - 'wallet.table.balance': 'ใƒใƒฉใƒณใ‚น', - 'wallet.table.memo': 'ๅ‚™่€ƒ', - 'wallet.table.value': 'ๅ€ค', - 'wallet.table.profit': 'ๆ็›Š', - 'wallet.table.commission': 'ๆ‰‹ๆ•ฐๆ–™', - 'wallet.table.total': 'ๅˆ่จˆ {total} ใƒฌใ‚ณใƒผใƒ‰', - 'wallet.tradeType.buy': '่ฒทใ†', - 'wallet.tradeType.sell': 'ๅฃฒใ‚‹', - 'wallet.tradeType.liquidation': 'ๅผทๅˆถๆธ…็ฎ—', - 'wallet.tradeType.openLong': '้•ทใ้–‹ใ', - 'wallet.tradeType.addLong': 'ใ‚ฌใƒ‰ใƒƒใƒˆ', - 'wallet.tradeType.closeLong': 'ใƒ”ใƒณใƒ‰ใ‚ฅใ‚ช', - 'wallet.tradeType.closeLongStop': 'ใ‚นใƒˆใƒƒใƒ—ใƒญใ‚นใจใƒญใƒณใ‚ฐ', - 'wallet.tradeType.closeLongProfit': 'ๅˆฉ็›Šใ‚’ๅพ—ใฆใ•ใ‚‰ใซๅนณๆบ–ๅŒ–ใ™ใ‚‹', - 'wallet.tradeType.openShort': 'ใ‚ชใƒผใƒ—ใƒณใ‚ทใƒงใƒผใƒˆ', - 'wallet.tradeType.addShort': '็Ÿญใ่ฟฝๅŠ ใ™ใ‚‹', - 'wallet.tradeType.closeShort': '็ฉบใฎ', - 'wallet.tradeType.closeShortStop': 'ใ‚นใƒˆใƒƒใƒ—ใƒญใ‚น', - 'wallet.tradeType.closeShortProfit': 'ๅˆฉ็›Šใ‚’็ขบๅฎšใ—ใฆ็ฉบๅฃฒใ‚Šใ‚’็ต‚ไบ†ใ™ใ‚‹', - 'wallet.moneyLogType.purchase': '่ณผๅ…ฅใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'wallet.moneyLogType.recharge': 'ใƒชใƒใƒฃใƒผใ‚ธ', - 'wallet.moneyLogType.withdraw': '็พ้‡‘ใ‚’ๅผ•ใๅ‡บใ™', - 'wallet.moneyLogType.refund': 'ๆ‰•ใ„ๆˆปใ—', - 'wallet.moneyLogType.reward': 'ๅ ฑ้…ฌ', - 'wallet.moneyLogType.income': 'ๅŽๅ…ฅ', - 'wallet.moneyLogType.commission': 'ๆ‰‹ๆ•ฐๆ–™', - 'wallet.web3Address.required': 'ๆœ€ๅˆใซ Web3 ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใฎใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'wallet.web3Address.requiredDescription': 'ใƒชใƒใƒฃใƒผใ‚ธใ™ใ‚‹ๅ‰ใซใ€ใƒชใƒใƒฃใƒผใ‚ธใ‚’ๅ—ใ‘ๅ–ใ‚‹ใŸใ‚ใซ Web3 ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆ ใ‚ขใƒ‰ใƒฌใ‚นใ‚’ใƒใ‚คใƒณใƒ‰ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™ใ€‚', - 'wallet.web3Address.placeholder': 'Web3 ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใฎใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ (0x ใงๅง‹ใพใ‚‹)', - 'wallet.web3Address.save': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚ขใƒ‰ใƒฌใ‚นใ‚’ไฟๅญ˜ใ™ใ‚‹', - 'wallet.web3Address.saveSuccess': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚ขใƒ‰ใƒฌใ‚นใŒๆญฃๅธธใซไฟๅญ˜ใ•ใ‚Œใพใ—ใŸ', - 'wallet.web3Address.saveFailed': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚ขใƒ‰ใƒฌใ‚นใฎไฟๅญ˜ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'wallet.web3Address.invalidFormat': 'ๆœ‰ๅŠนใช Web3 ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆ ใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ (ใ‚คใƒผใ‚ตใƒชใ‚ขใƒ ๅฝขๅผ: 0x ใงๅง‹ใพใ‚‹ 42 ๆ–‡ๅญ—ใ€ใพใŸใฏ TRC20 ๅฝขๅผ: T ใงๅง‹ใพใ‚‹ 34 ๆ–‡ๅญ—)', - 'wallet.selectCoin': '้€š่ฒจใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'wallet.selectChain': '้ธๆŠžใƒใ‚งใƒผใƒณ', - 'wallet.chain.eth': 'ใ‚คใƒผใ‚ตใƒชใ‚ขใƒ (ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'ๅผ•ใๆ›ใˆใŸใ„QDTใฎ้‡๏ผˆใ‚ชใƒ—ใ‚ทใƒงใƒณ๏ผ‰', - 'wallet.targetQdtAmount.placeholder': 'ๅผ•ใๆ›ใˆใŸใ„ QDT ใฎๆ•ฐ้‡ใ€็พๅœจใฎ QDT ไพกๆ ผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'ใƒชใƒใƒฃใƒผใ‚ธใŒๅฟ…่ฆ: {amount} USDT', - 'wallet.rechargeAddress': 'ใƒชใƒใƒฃใƒผใ‚ธใ‚ขใƒ‰ใƒฌใ‚น', - 'wallet.copyAddress': 'ใ‚ณใƒ”ใƒผ', - 'wallet.copySuccess': 'ใ‚ณใƒ”ใƒผๆˆๅŠŸ๏ผ', - 'wallet.copyFailed': 'ใ‚ณใƒ”ใƒผใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ๆ‰‹ๅ‹•ใงใ‚ณใƒ”ใƒผใ—ใฆใใ ใ•ใ„', - 'wallet.rechargeAddressHint': 'ใ“ใฎใ‚ขใƒ‰ใƒฌใ‚นใซ {coin} ใ‚’ๅ…ฅ้‡‘ใ™ใ‚‹ใซใฏใ€ๅฟ…ใš {chain} ใ‚’ไฝฟ็”จใ—ใฆใใ ใ•ใ„ใ€‚', - 'wallet.qdtPrice.loading': '่ชญใฟ่พผใฟไธญ...', - 'wallet.rechargeTip.new': '้€š่ฒจใจใƒใ‚งใƒผใƒณใ‚’้ธๆŠžใ—ใ€ไธ‹ใฎ QR ใ‚ณใƒผใƒ‰ใ‚’ใ‚นใ‚ญใƒฃใƒณใ—ใฆใƒชใƒใƒฃใƒผใ‚ธใ—ใฆใใ ใ•ใ„', - 'wallet.exchangeRate': '1 QDT โ‰ˆ {ใƒฌใƒผใƒˆ} USDT', - 'wallet.withdrawableAmount': 'ๅˆฉ็”จๅฏ่ƒฝใช็พ้‡‘ใฎ้‡', - 'wallet.totalBalance': 'ๅˆ่จˆๆฎ‹้ซ˜', - 'wallet.insufficientWithdrawable': 'ๅผ•ใๅ‡บใ™ใ“ใจใŒใงใใ‚‹็พ้‡‘ใฎ้‡ใŒไธ่ถณใ—ใฆใ„ใพใ™ใ€‚็พๅœจๅ‡บ้‡‘ใงใใ‚‹้‡‘้กใฏๆฌกใฎใจใŠใ‚Šใงใ™: {amount} QDT', - 'wallet.withdrawAddressRequired': 'ๅ‡บ้‡‘ใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'wallet.withdrawAddressHint': 'ใ‚ขใƒ‰ใƒฌใ‚นใŒๆญฃใ—ใ„ใ“ใจใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚้€€ไผšๅพŒใฏๅ–ใ‚Šๆถˆใ™ใ“ใจใฏใงใใพใ›ใ‚“ใ€‚', - 'wallet.withdrawSubmitSuccess': 'ๅ‡บ้‡‘็”ณ่ซ‹ใŒๆญฃๅธธใซ้€ไฟกใ•ใ‚Œใพใ—ใŸใ€‚ๅฏฉๆŸปใ‚’ใŠๅพ…ใกใใ ใ•ใ„', - 'menu.footer.contactUs': 'ใŠๅ•ใ„ๅˆใ‚ใ›', - 'menu.footer.getSupport': 'ใ‚ตใƒใƒผใƒˆใ‚’ๅ—ใ‘ใ‚‹', - 'menu.footer.socialAccounts': 'ใ‚ฝใƒผใ‚ทใƒฃใƒซใ‚ขใ‚ซใ‚ฆใƒณใƒˆ', - 'menu.footer.userAgreement': 'ใƒฆใƒผใ‚ถใƒผๅŒๆ„ๆ›ธ', - 'menu.footer.privacyPolicy': 'ใƒ—ใƒฉใ‚คใƒใ‚ทใƒผใƒใƒชใ‚ทใƒผ', - 'menu.footer.support': 'ใ‚ตใƒใƒผใƒˆ', - 'menu.footer.featureRequest': 'ๆฉŸ่ƒฝใƒชใ‚ฏใ‚จใ‚นใƒˆ', - 'menu.footer.email': '้›ปๅญใƒกใƒผใƒซ', - 'menu.footer.liveChat': '24ๆ™‚้–“ๅนดไธญ็„กไผ‘ใฎใƒฉใ‚คใƒ–ใƒใƒฃใƒƒใƒˆ', - 'dashboard.analysis.title': 'ๅคšๆฌกๅ…ƒๅˆ†ๆž', - 'dashboard.analysis.subtitle': 'AIใ‚’ๆดป็”จใ—ใŸ็ทๅˆ่ฒกๅ‹™ๅˆ†ๆžใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ', - 'dashboard.analysis.selectSymbol': 'ๅŸบ็คŽใจใชใ‚‹ใ‚ณใƒผใƒ‰ใ‚’้ธๆŠžใพใŸใฏๅ…ฅๅŠ›ใ—ใพใ™', - 'dashboard.analysis.selectModel': 'ใƒขใƒ‡ใƒซใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.startAnalysis': 'ๅˆ†ๆžใ‚’้–‹ๅง‹ใ™ใ‚‹', - 'dashboard.analysis.history': 'ๆญดๅฒ', - 'dashboard.analysis.tab.overview': '็ทๅˆ็š„ใชๅˆ†ๆž', - 'dashboard.analysis.tab.fundamental': 'ๅŸบๆœฌ', - 'dashboard.analysis.tab.technical': 'ใƒ†ใ‚ฏใƒŽใƒญใ‚ธใƒผ', - 'dashboard.analysis.tab.news': 'ใƒ‹ใƒฅใƒผใ‚น', - 'dashboard.analysis.tab.sentiment': 'ๆ„Ÿๆƒ…', - 'dashboard.analysis.tab.risk': 'ใƒชใ‚นใ‚ฏ', - 'dashboard.analysis.tab.debate': '้•ท็Ÿญใฎ่ญฐ่ซ–', - 'dashboard.analysis.tab.decision': 'ๆœ€็ต‚ๆฑบๅฎš', - 'dashboard.analysis.empty.selectSymbol': 'ๅˆ†ๆžใ‚’้–‹ๅง‹ใ™ใ‚‹ใ‚ฟใƒผใ‚ฒใƒƒใƒˆใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.empty.selectSymbolDesc': '็‹ฌ่‡ชใซ้ธๆŠžใ—ใŸ้Š˜ๆŸ„ใƒชใ‚นใƒˆใ‹ใ‚‰้ธๆŠžใ™ใ‚‹ใ‹ใ€ๅŸบ็คŽใจใชใ‚‹ใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆๅคšๆฌกๅ…ƒ AI ๅˆ†ๆžใƒฌใƒใƒผใƒˆใ‚’ๅ–ๅพ—ใ—ใพใ™', - 'dashboard.analysis.empty.startAnalysis': 'ใ€Œๅˆ†ๆž้–‹ๅง‹ใ€ใƒœใ‚ฟใƒณใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ™ใ‚‹ใจใ€ๅคšๆฌกๅ…ƒๅˆ†ๆžใŒๅฎŸ่กŒใ•ใ‚Œใพใ™ใ€‚', - 'dashboard.analysis.empty.startAnalysisDesc': 'ใƒ•ใ‚กใƒณใƒ€ใƒกใƒณใ‚ฟใƒซใ‚บใ€ใƒ†ใ‚ฏใƒŽใƒญใ‚ธใƒผใ€ใƒ‹ใƒฅใƒผใ‚นใ€ใ‚ปใƒณใƒใƒกใƒณใƒˆใ€ใƒชใ‚นใ‚ฏใชใฉใฎๅคšๆฌกๅ…ƒใ‹ใ‚‰็ทๅˆ็š„ใชๅˆ†ๆžใ‚’ๆไพ›ใ—ใพใ™ใ€‚', - 'dashboard.analysis.empty.noData': '็พๅœจใ€{type} ใฎๅˆ†ๆžใƒ‡ใƒผใ‚ฟใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ๆœ€ๅˆใซๅŒ…ๆ‹ฌ็š„ใชๅˆ†ๆžใ‚’่กŒใฃใฆใใ ใ•ใ„ใ€‚', - 'dashboard.analysis.empty.noWatchlist': '็พๅœจใ€่‡ชไธป้ธๅฎš้Š˜ๆŸ„ใฏใ‚ใ‚Šใพใ›ใ‚“', - 'dashboard.analysis.empty.noHistory': 'ใพใ ๅฑฅๆญดใŒใ‚ใ‚Šใพใ›ใ‚“', - 'dashboard.analysis.empty.watchlistHint': '็พๅœจใ€็‹ฌ่‡ชใซ้ธๆŠžใ—ใŸ้Š˜ๆŸ„ใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ใพใšใ”็ขบ่ชใใ ใ•ใ„ใ€‚', - 'dashboard.analysis.empty.noDebateData': '่ญฐ่ซ–ใฎใƒ‡ใƒผใ‚ฟใฏใพใ ใ‚ใ‚Šใพใ›ใ‚“', - 'dashboard.analysis.empty.noDecisionData': 'ๆฑบๅฎšใƒ‡ใƒผใ‚ฟใฏใพใ ใ‚ใ‚Šใพใ›ใ‚“', - 'dashboard.analysis.empty.selectAgent': 'ๅˆ†ๆž็ตๆžœใ‚’่กจ็คบใ™ใ‚‹ใซใฏใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.loading.analyzing': 'ๅˆ†ๆžไธญใงใ™ใ€ใŠๅพ…ใกใใ ใ•ใ„...', - 'dashboard.analysis.loading.fundamental': 'ๅŸบๆœฌใƒ‡ใƒผใ‚ฟใ‚’ๅˆ†ๆžไธญ...', - 'dashboard.analysis.loading.technical': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™ใ‚’ๅˆ†ๆžไธญ...', - 'dashboard.analysis.loading.news': 'ใƒ‹ใƒฅใƒผใ‚นใƒ‡ใƒผใ‚ฟใ‚’ๅˆ†ๆžไธญ...', - 'dashboard.analysis.loading.sentiment': 'ๅธ‚ๅ ดใ‚ปใƒณใƒใƒกใƒณใƒˆใ‚’ๅˆ†ๆžไธญ...', - 'dashboard.analysis.loading.risk': 'ใƒชใ‚นใ‚ฏใ‚’่ฉ•ไพกไธญ...', - 'dashboard.analysis.loading.debate': '้•ท็Ÿญใฎ่ญฐ่ซ–ใฏ็ถšใ„ใฆใ„ใพใ™...', - 'dashboard.analysis.loading.decision': 'ๆœ€็ต‚ๆฑบๅฎšใ‚’็”Ÿๆˆไธญ...', - 'dashboard.analysis.score.overall': '็ทๅˆ่ฉ•ไพก', - 'dashboard.analysis.score.recommendation': 'ๆŠ•่ณ‡ใ‚ขใƒ‰ใƒใ‚คใ‚น', - 'dashboard.analysis.score.confidence': '่‡ชไฟก', - 'dashboard.analysis.dimension.fundamental': 'ๅŸบๆœฌ', - 'dashboard.analysis.dimension.technical': 'ใƒ†ใ‚ฏใƒŽใƒญใ‚ธใƒผ', - 'dashboard.analysis.dimension.news': 'ใƒ‹ใƒฅใƒผใ‚น', - 'dashboard.analysis.dimension.sentiment': 'ๆ„Ÿๆƒ…', - 'dashboard.analysis.dimension.risk': 'ใƒชใ‚นใ‚ฏ', - 'dashboard.analysis.card.dimensionScores': 'ๅ„ๆฌกๅ…ƒใฎ่ฉ•ไพก', - 'dashboard.analysis.card.overviewReport': '็ทๅˆๅˆ†ๆžใƒฌใƒใƒผใƒˆ', - 'dashboard.analysis.card.financialMetrics': '่ฒกๅ‹™ๆŒ‡ๆจ™', - 'dashboard.analysis.card.fundamentalReport': 'ใƒ•ใ‚กใƒณใƒ€ใƒกใƒณใ‚ฟใƒซใ‚บๅˆ†ๆžใƒฌใƒใƒผใƒˆ', - 'dashboard.analysis.card.technicalIndicators': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™', - 'dashboard.analysis.card.technicalReport': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๅˆ†ๆžใƒฌใƒใƒผใƒˆ', - 'dashboard.analysis.card.newsList': '้–ข้€ฃใƒ‹ใƒฅใƒผใ‚น', - 'dashboard.analysis.card.newsReport': 'ใƒ‹ใƒฅใƒผใ‚นๅˆ†ๆžใƒฌใƒใƒผใƒˆ', - 'dashboard.analysis.card.sentimentIndicators': 'ๆ„Ÿๆƒ…ๆŒ‡ๆจ™', - 'dashboard.analysis.card.sentimentReport': 'ใ‚ปใƒณใƒใƒกใƒณใƒˆๅˆ†ๆžใƒฌใƒใƒผใƒˆ', - 'dashboard.analysis.card.riskMetrics': 'ใƒชใ‚นใ‚ฏๆŒ‡ๆจ™', - 'dashboard.analysis.card.riskReport': 'ใƒชใ‚นใ‚ฏ่ฉ•ไพกใƒฌใƒใƒผใƒˆ', - 'dashboard.analysis.card.bullView': 'ๅผทๆฐ—ใฎ่ฆ‹ๆ–น๏ผˆๅผทๆฐ—๏ผ‰', - 'dashboard.analysis.card.bearView': 'ๅผฑๆฐ—ใฎ่ฆ‹ๆ–น๏ผˆใƒ™ใ‚ข๏ผ‰', - 'dashboard.analysis.card.researchConclusion': '็ ”็ฉถ่€…ใฎ็ต่ซ–', - 'dashboard.analysis.card.traderPlan': 'ใƒˆใƒฌใƒผใƒ€ใƒผใƒ—ใƒฉใƒณ', - 'dashboard.analysis.card.riskDebate': 'ใƒชใ‚นใ‚ฏๅง”ๅ“กไผšใฎ่ญฐ่ซ–', - 'dashboard.analysis.card.finalDecision': 'ๆœ€็ต‚ๆฑบๅฎš', - 'dashboard.analysis.card.tradePlanDetail': 'ๅ–ๅผ•ใƒ—ใƒฉใƒณใฎ่ฉณ็ดฐ', - 'dashboard.analysis.tradingPlan.entry_price': 'ๅ…ฅๅ ดๆ–™', - 'dashboard.analysis.tradingPlan.position_size': 'ใƒใ‚ธใ‚ทใƒงใƒณใ‚ตใ‚คใ‚บ', - 'dashboard.analysis.tradingPlan.stop_loss': 'ใ‚นใƒˆใƒƒใƒ—ใƒญใ‚น', - 'dashboard.analysis.tradingPlan.take_profit': 'ๅˆฉ็›Š็ขบๅฎš', - 'dashboard.analysis.label.confidence': '่‡ชไฟก', - 'dashboard.analysis.label.keyPoints': 'ใ‚ณใ‚ขใƒใ‚คใƒณใƒˆ', - 'dashboard.analysis.label.riskWarning': 'ใƒชใ‚นใ‚ฏ่ญฆๅ‘Š', - 'dashboard.analysis.risk.risky': 'ๅฑ้™บใช', - 'dashboard.analysis.risk.neutral': 'ไธญ็ซ‹็š„ใช่ฆ–็‚น๏ผˆใƒ‹ใƒฅใƒผใƒˆใƒฉใƒซ๏ผ‰', - 'dashboard.analysis.risk.safe': 'ไฟๅฎˆ็š„ใช่ฆ‹่งฃ๏ผˆๅฎ‰ๅ…จ๏ผ‰', - 'dashboard.analysis.risk.conclusion': '็ต่ซ–', - 'dashboard.analysis.feature.fundamental': 'ใƒ•ใ‚กใƒณใƒ€ใƒกใƒณใ‚ฟใƒซใ‚บๅˆ†ๆž', - 'dashboard.analysis.feature.technical': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๅˆ†ๆž', - 'dashboard.analysis.feature.news': 'ใƒ‹ใƒฅใƒผใ‚นๅˆ†ๆž', - 'dashboard.analysis.feature.sentiment': 'ๆ„Ÿๆƒ…ๅˆ†ๆž', - 'dashboard.analysis.feature.risk': 'ใƒชใ‚นใ‚ฏ่ฉ•ไพก', - 'dashboard.analysis.watchlist.title': '็งใฎ้Š˜ๆŸ„้ธๆŠž', - 'dashboard.analysis.watchlist.add': '่ฟฝๅŠ ใ™ใ‚‹', - 'dashboard.analysis.watchlist.addStock': 'ๅœจๅบซใ‚’่ฟฝๅŠ ใ™ใ‚‹', - 'dashboard.analysis.modal.addStock.title': 'ใ‚ชใƒ—ใ‚ทใƒงใƒณใฎใ‚นใƒˆใƒƒใ‚ฏใ‚’่ฟฝๅŠ ใ™ใ‚‹', - 'dashboard.analysis.modal.addStock.confirm': 'OK', - 'dashboard.analysis.modal.addStock.cancel': 'ใ‚ญใƒฃใƒณใ‚ปใƒซ', - 'dashboard.analysis.modal.addStock.market': 'ๅธ‚ๅ ดใ‚ฟใ‚คใƒ—', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'ใƒžใƒผใ‚ฑใƒƒใƒˆใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.modal.addStock.marketRequired': 'ใƒžใƒผใ‚ฑใƒƒใƒˆใ‚ฟใ‚คใƒ—ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.modal.addStock.symbol': '่จผๅˆธใ‚ณใƒผใƒ‰', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'ไพ‹: AAPLใ€TSLAใ€GOOGLใ€000001ใ€BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': '่จผๅˆธใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'ๆคœ็ดขๅฏพ่ฑกใฎใ‚ณใƒผใƒ‰ใพใŸใฏๅๅ‰', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'ๅŸบ็คŽใจใชใ‚‹ใ‚ณใƒผใƒ‰ใ‚’ๆคœ็ดขใพใŸใฏๅ…ฅๅŠ›ใ—ใพใ™ (ไพ‹: AAPLใ€BTC/USDTใ€EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'ใƒ‡ใƒผใ‚ฟใƒ™ใƒผใ‚นๅ†…ใฎใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใฎๆคœ็ดขใ€ใพใŸใฏใ‚ณใƒผใƒ‰ใฎ็›ดๆŽฅๅ…ฅๅŠ›ใ‚’ใ‚ตใƒใƒผใƒˆ (ใ‚ทใ‚นใƒ†ใƒ ใŒ่‡ชๅ‹•็š„ใซๅๅ‰ใ‚’ๅ–ๅพ—ใ—ใพใ™)', - 'dashboard.analysis.modal.addStock.search': 'ๆคœ็ดข', - 'dashboard.analysis.modal.addStock.searchResults': 'ๆคœ็ดข็ตๆžœ', - 'dashboard.analysis.modal.addStock.hotSymbols': 'ไบบๆฐ—ใฎใ‚ฟใƒผใ‚ฒใƒƒใƒˆ', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'ไบบๆฐ—ใฎใ‚ใ‚‹ใ‚ฟใƒผใ‚ฒใƒƒใƒˆใฏใพใ ใ‚ใ‚Šใพใ›ใ‚“', - 'dashboard.analysis.modal.addStock.selectedSymbol': '้ธๆŠžๆธˆใฟ', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'ๆœ€ๅˆใซใ‚ฟใƒผใ‚ฒใƒƒใƒˆใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'ใ‚ฟใƒผใ‚ฒใƒƒใƒˆใ‚’้ธๆŠžใ™ใ‚‹ใ‹ใ€ๆœ€ๅˆใซใ‚ฟใƒผใ‚ฒใƒƒใƒˆ ใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'ใ‚ฟใƒผใ‚ฒใƒƒใƒˆใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'ๆœ€ๅˆใซใƒžใƒผใ‚ฑใƒƒใƒˆใ‚ฟใ‚คใƒ—ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.modal.addStock.searchFailed': 'ๆคœ็ดขใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ๅพŒใงใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„', - 'dashboard.analysis.modal.addStock.noSearchResults': 'ไธ€่‡ดใ™ใ‚‹ใ‚ฟใƒผใ‚ฒใƒƒใƒˆใŒ่ฆ‹ใคใ‹ใ‚Šใพใ›ใ‚“', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'ใ‚ทใ‚นใƒ†ใƒ ใŒ่‡ชๅ‹•็š„ใซๅๅ‰ใ‚’ๅ–ๅพ—ใ—ใพใ™', - 'dashboard.analysis.modal.addStock.addDirectly': '็›ดๆŽฅ่ฟฝๅŠ ', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'ๅๅ‰ใฏ่ฟฝๅŠ ๆ™‚ใซ่‡ชๅ‹•็š„ใซๅ–ๅพ—ใ•ใ‚Œใพใ™', - 'dashboard.analysis.market.USStock': '็ฑณๅ›ฝๆ ช', - 'dashboard.analysis.market.Crypto': 'ๆš—ๅท้€š่ฒจ', - 'dashboard.analysis.market.Forex': 'ๅค–ๅ›ฝ็‚บๆ›ฟ', - 'dashboard.analysis.market.Futures': 'ๅ…ˆ็‰ฉ', - 'dashboard.analysis.modal.history.title': '้ŽๅŽปใฎๅˆ†ๆž่จ˜้Œฒ', - 'dashboard.analysis.modal.history.viewResult': '็ตๆžœใ‚’่ฆ‹ใ‚‹', - 'dashboard.analysis.modal.history.completeTime': 'ๅฎŒไบ†ๆ™‚้–“', - 'dashboard.analysis.modal.history.error': 'ใ‚จใƒฉใƒผ', - 'dashboard.analysis.status.pending': 'ไฟ็•™ไธญ', - 'dashboard.analysis.status.processing': 'ๅ‡ฆ็†ไธญ', - 'dashboard.analysis.status.completed': 'ๅฎŒไบ†', - 'dashboard.analysis.status.failed': 'ๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.analysis.message.selectSymbol': 'ๆœ€ๅˆใซใ‚ฟใƒผใ‚ฒใƒƒใƒˆใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.analysis.message.taskCreated': 'ๅˆ†ๆžใ‚ฟใ‚นใ‚ฏใŒไฝœๆˆใ•ใ‚Œใ€ใƒใƒƒใ‚ฏใ‚ฐใƒฉใ‚ฆใƒณใƒ‰ใงๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ™...', - 'dashboard.analysis.message.analysisComplete': 'ๅˆ†ๆžๅฎŒไบ†', - 'dashboard.analysis.message.analysisCompleteCache': 'ๅˆ†ๆžๅฎŒไบ†๏ผˆใ‚ญใƒฃใƒƒใ‚ทใƒฅใ•ใ‚ŒใŸใƒ‡ใƒผใ‚ฟใ‚’ไฝฟ็”จ๏ผ‰', - 'dashboard.analysis.message.analysisFailed': 'ๅˆ†ๆžใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ๅพŒใงใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚', - 'dashboard.analysis.message.addStockSuccess': 'ๆญฃๅธธใซ่ฟฝๅŠ ใ•ใ‚Œใพใ—ใŸ', - 'dashboard.analysis.message.addStockFailed': '่ฟฝๅŠ ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.analysis.message.removeStockSuccess': 'ๆญฃๅธธใซๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ', - 'dashboard.analysis.message.removeStockFailed': 'ๅ‰Š้™คใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.analysis.message.resumingAnalysis': 'ๅˆ†ๆžใ‚ฟใ‚นใ‚ฏใ‚’ๅ†้–‹ใ—ใฆใ„ใพใ™...', - 'dashboard.analysis.message.deleteSuccess': 'ๆญฃๅธธใซๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ', - 'dashboard.analysis.message.deleteFailed': 'ๅ‰Š้™คใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.analysis.modal.history.delete': 'ๅ‰Š้™ค', - 'dashboard.analysis.modal.history.deleteConfirm': 'ใ“ใฎๅˆ†ๆž่จ˜้Œฒใ‚’ๅ‰Š้™คใ—ใฆใ‚‚ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹๏ผŸ', - 'dashboard.analysis.test': 'ใ‚ทใƒงใƒƒใƒ—็•ชๅท {no}ใ€ๅ…ฌๅบ„่ทฏ', - 'dashboard.analysis.introduce': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ่ชฌๆ˜Ž', - 'dashboard.analysis.total-sales': '็ทๅฃฒไธŠ้ซ˜', - 'dashboard.analysis.day-sales': 'ๅนณๅ‡ๆ—ฅ่ฒฉ๏ฟฅ', - 'dashboard.analysis.visits': '่จชๅ•', - 'dashboard.analysis.visits-trend': 'ใƒˆใƒฉใƒ•ใ‚ฃใƒƒใ‚ฏใฎๅ‚พๅ‘', - 'dashboard.analysis.visits-ranking': 'ๆฅๅบ—ใƒฉใƒณใ‚ญใƒณใ‚ฐ', - 'dashboard.analysis.day-visits': 'ๆฏŽๆ—ฅใฎ่จชๅ•', - 'dashboard.analysis.week': 'ๆฏŽ้€ฑๅ‰ๅนดๆฏ”', - 'dashboard.analysis.day': 'ๅ‰ๅนดๆฏ”', - 'dashboard.analysis.payments': 'ๆ”ฏๆ‰•ใ„ๅ›žๆ•ฐ', - 'dashboard.analysis.conversion-rate': 'ใ‚ณใƒณใƒใƒผใ‚ธใƒงใƒณ็އ', - 'dashboard.analysis.operational-effect': '้‹ๅ–ถๆดปๅ‹•ใธใฎๅฝฑ้Ÿฟ', - 'dashboard.analysis.sales-trend': '่ฒฉๅฃฒๅ‹•ๅ‘', - 'dashboard.analysis.sales-ranking': 'ๅบ—่ˆ—ๅฃฒไธŠใƒฉใƒณใ‚ญใƒณใ‚ฐ', - 'dashboard.analysis.all-year': 'ไธ€ๅนดไธญ', - 'dashboard.analysis.all-month': 'ไปŠๆœˆ', - 'dashboard.analysis.all-week': 'ไปŠ้€ฑ', - 'dashboard.analysis.all-day': 'ไปŠๆ—ฅ', - 'dashboard.analysis.search-users': 'ๆคœ็ดขใƒฆใƒผใ‚ถใƒผๆ•ฐ', - 'dashboard.analysis.per-capita-search': 'ไธ€ไบบๅฝ“ใŸใ‚Šใฎๆคœ็ดขๆ•ฐ', - 'dashboard.analysis.online-top-search': 'ใ‚ชใƒณใƒฉใ‚คใƒณใงไบบๆฐ—ใฎๆคœ็ดข', - 'dashboard.analysis.the-proportion-of-sales': 'ๅฃฒไธŠใ‚ซใƒ†ใ‚ดใƒชใƒผๆฏ”็އ', - 'dashboard.analysis.dropdown-option-one': 'ไฝœๆˆฆ๏ผ‘', - 'dashboard.analysis.dropdown-option-two': 'ๆ“ไฝœ 2', - 'dashboard.analysis.channel.all': 'ใ™ในใฆใฎใƒใƒฃใƒณใƒใƒซ', - 'dashboard.analysis.channel.online': 'ใ‚ชใƒณใƒฉใ‚คใƒณ', - 'dashboard.analysis.channel.stores': 'ๅบ—', - 'dashboard.analysis.sales': '่ฒฉๅฃฒ', - 'dashboard.analysis.traffic': 'ไน—ๅฎขใฎๆตใ‚Œ', - 'dashboard.analysis.table.rank': 'ใƒฉใƒณใ‚ญใƒณใ‚ฐ', - 'dashboard.analysis.table.search-keyword': 'ๆคœ็ดขใ‚ญใƒผใƒฏใƒผใƒ‰', - 'dashboard.analysis.table.users': 'ใƒฆใƒผใ‚ถใƒผๆ•ฐ', - 'dashboard.analysis.table.weekly-range': 'ๆฏŽ้€ฑใฎๅข—ๅŠ ', - 'dashboard.indicator.selectSymbol': 'ๅŸบ็คŽใจใชใ‚‹ใ‚ณใƒผใƒ‰ใ‚’้ธๆŠžใพใŸใฏๅ…ฅๅŠ›ใ—ใพใ™', - 'dashboard.indicator.emptyWatchlistHint': '็พๅœจใ€็‹ฌ่‡ชใซ้ธๆŠžใ—ใŸ้Š˜ๆŸ„ใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚ๆœ€ๅˆใซ่ฟฝๅŠ ใ—ใฆใใ ใ•ใ„ใ€‚', - 'dashboard.indicator.hint.selectSymbol': 'ๅˆ†ๆžใ‚’้–‹ๅง‹ใ™ใ‚‹ใซใฏใ‚ฟใƒผใ‚ฒใƒƒใƒˆใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.hint.selectSymbolDesc': 'K ใƒฉใ‚คใƒณ ใƒใƒฃใƒผใƒˆใจใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™ใ‚’่กจ็คบใ™ใ‚‹ใซใฏใ€ไธŠใฎๆคœ็ดขใƒœใƒƒใ‚ฏใ‚นใซ้Š˜ๆŸ„ใ‚ณใƒผใƒ‰ใ‚’้ธๆŠžใพใŸใฏๅ…ฅๅŠ›ใ—ใพใ™ใ€‚', - 'dashboard.indicator.retry': 'ใ‚‚ใ†ไธ€ๅบฆ่ฉฆใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.panel.title': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™', - 'dashboard.indicator.panel.realtimeOn': 'ใƒชใ‚ขใƒซใ‚ฟใ‚คใƒ ๆ›ดๆ–ฐใ‚’ใ‚ชใƒ•ใซใ™ใ‚‹', - 'dashboard.indicator.panel.realtimeOff': 'ใƒชใ‚ขใƒซใ‚ฟใ‚คใƒ ๆ›ดๆ–ฐใ‚’ๆœ‰ๅŠนใซใ™ใ‚‹', - 'dashboard.indicator.panel.themeLight': 'ใƒ€ใƒผใ‚ฏใƒ†ใƒผใƒžใซๅˆ‡ใ‚Šๆ›ฟใˆใ‚‹', - 'dashboard.indicator.panel.themeDark': 'ใƒฉใ‚คใƒˆใƒ†ใƒผใƒžใซๅˆ‡ใ‚Šๆ›ฟใˆใ‚‹', - 'dashboard.indicator.section.enabled': 'ๆœ‰ๅŠน', - 'dashboard.indicator.section.added': '็งใŒ่ฟฝๅŠ ใ—ใŸใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'dashboard.indicator.section.custom': '่‡ชๅˆ†ใงไฝœๆˆใ—ใŸใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'dashboard.indicator.section.bought': '่ณผๅ…ฅใ—ใŸใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'dashboard.indicator.section.myCreated': '็งใŒไฝœๆˆใ—ใŸใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'dashboard.indicator.empty': 'ใพใ ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใŒใ‚ใ‚Šใพใ›ใ‚“ใ€‚ๆœ€ๅˆใซใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚’่ฟฝๅŠ ใพใŸใฏไฝœๆˆใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.buy': '่ณผๅ…ฅใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'dashboard.indicator.action.start': 'ๅง‹ใ‚ใ‚‹', - 'dashboard.indicator.action.stop': '้–‰ใ˜ใ‚‹', - 'dashboard.indicator.action.edit': '็ทจ้›†', - 'dashboard.indicator.action.delete': 'ๅ‰Š้™ค', - 'dashboard.indicator.action.backtest': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆ', - 'dashboard.indicator.status.normal': 'ๆ™ฎ้€šใฎ', - 'dashboard.indicator.status.normalPermanent': '้€šๅธธ๏ผˆๆฐธ็ถš็š„ใซๆœ‰ๅŠน๏ผ‰', - 'dashboard.indicator.status.expired': 'ๆœŸ้™ๅˆ‡ใ‚Œ', - 'dashboard.indicator.expiry.permanent': 'ๆฐธไน…ใซๆœ‰ๅŠน', - 'dashboard.indicator.expiry.noExpiry': 'ๆœ‰ๅŠนๆœŸ้™ใชใ—', - 'dashboard.indicator.expiry.expired': 'ๆœŸ้™ๅˆ‡ใ‚Œ: {ๆ—ฅไป˜}', - 'dashboard.indicator.expiry.expiresOn': 'ๆœ‰ๅŠนๆœŸ้™: {ๆ—ฅไป˜}', - 'dashboard.indicator.delete.confirmTitle': 'ๅ‰Š้™คใฎ็ขบ่ช', - 'dashboard.indicator.delete.confirmContent': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ€Œ{name}ใ€ใ‚’ๅ‰Š้™คใ—ใฆใ‚‚ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹?ใ“ใฎๆ“ไฝœใฏๅ…ƒใซๆˆปใ™ใ“ใจใŒใงใใพใ›ใ‚“ใ€‚', - 'dashboard.indicator.delete.confirmOk': 'ๅ‰Š้™ค', - 'dashboard.indicator.delete.confirmCancel': 'ใ‚ญใƒฃใƒณใ‚ปใƒซ', - 'dashboard.indicator.delete.success': 'ๆญฃๅธธใซๅ‰Š้™คใ•ใ‚Œใพใ—ใŸ', - 'dashboard.indicator.delete.failed': 'ๅ‰Š้™คใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.indicator.save.success': 'ๆญฃๅธธใซไฟๅญ˜ใ•ใ‚Œใพใ—ใŸ', - 'dashboard.indicator.save.failed': 'ไฟๅญ˜ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.indicator.error.loadWatchlistFailed': 'ใ‚ชใƒ—ใ‚ทใƒงใƒณใฎใ‚นใƒˆใƒƒใ‚ฏใ‚’ใƒญใƒผใƒ‰ใงใใพใ›ใ‚“ใงใ—ใŸ', - 'dashboard.indicator.error.chartNotReady': 'ใƒใƒฃใƒผใƒˆใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฏๅˆๆœŸๅŒ–ใ•ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚ๆœ€ๅˆใซใ‚ฟใƒผใ‚ฒใƒƒใƒˆใ‚’้ธๆŠžใ—ใ€ใƒใƒฃใƒผใƒˆใŒใƒญใƒผใƒ‰ใ•ใ‚Œใ‚‹ใพใงๅพ…ใฃใฆใใ ใ•ใ„ใ€‚', - 'dashboard.indicator.error.chartMethodNotReady': 'ใ‚ฐใƒฉใƒ• ใ‚ณใƒณใƒใƒผใƒใƒณใƒˆ ใƒกใ‚ฝใƒƒใƒ‰ใฎๆบ–ๅ‚™ใŒใงใใฆใ„ใพใ›ใ‚“ใ€‚ๅพŒใงใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚', - 'dashboard.indicator.error.chartExecuteNotReady': 'ใƒใƒฃใƒผใƒˆใ‚ณใƒณใƒใƒผใƒใƒณใƒˆใฎๅฎŸ่กŒใƒกใ‚ฝใƒƒใƒ‰ใฎๆบ–ๅ‚™ใŒใงใใฆใ„ใพใ›ใ‚“ใ€‚ๅพŒใงใ‚‚ใ†ไธ€ๅบฆ่ฉฆใ—ใฆใใ ใ•ใ„ใ€‚', - 'dashboard.indicator.error.parseFailed': 'Pythonใ‚ณใƒผใƒ‰ใ‚’่งฃๆžใงใใพใ›ใ‚“', - 'dashboard.indicator.error.parseFailedCheck': 'Python ใ‚ณใƒผใƒ‰ใ‚’่งฃๆžใงใใพใ›ใ‚“ใ€‚ใ‚ณใƒผใƒ‰ๅฝขๅผใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚', - 'dashboard.indicator.error.addIndicatorFailed': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ่ฟฝๅŠ ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.indicator.error.runIndicatorFailed': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎๅฎŸ่กŒใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.indicator.error.pleaseLogin': 'ใพใšใƒญใ‚ฐใ‚คใƒณใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.error.loadDataFailed': 'ใƒ‡ใƒผใ‚ฟใฎใƒญใƒผใƒ‰ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.indicator.error.loadDataFailedDesc': 'ใƒใƒƒใƒˆใƒฏใƒผใ‚ฏๆŽฅ็ถšใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.error.pythonEngineFailed': 'Python ใ‚จใƒณใ‚ธใƒณใฎใƒญใƒผใƒ‰ใซๅคฑๆ•—ใ—ใŸใŸใ‚ใ€ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผๆฉŸ่ƒฝใŒไฝฟ็”จใงใใชใ„ๅฏ่ƒฝๆ€งใŒใ‚ใ‚Šใพใ™ใ€‚', - 'dashboard.indicator.error.chartInitFailed': 'ใƒใƒฃใƒผใƒˆใฎๅˆๆœŸๅŒ–ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.indicator.warning.enterCode': 'ๆœ€ๅˆใซใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python ใ‚จใƒณใ‚ธใƒณใฎใƒญใƒผใƒ‰ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'ใ“ใฎๆฉŸ่ƒฝใฏใ€็พๅœจใฎๅœฐๅŸŸใพใŸใฏใƒใƒƒใƒˆใƒฏใƒผใ‚ฏ็’ฐๅขƒใงใฏๅˆฉ็”จใงใใพใ›ใ‚“', - 'dashboard.indicator.warning.chartNotInitialized': 'ใ‚ฐใƒฉใƒ•ใŒๅˆๆœŸๅŒ–ใ•ใ‚Œใฆใ„ใชใ„ใŸใ‚ใ€็ทšๆ็”ปใƒ„ใƒผใƒซใŒไฝฟ็”จใงใใพใ›ใ‚“ใ€‚', - 'dashboard.indicator.success.runIndicator': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฏๆญฃๅธธใซๅฎŸ่กŒใ•ใ‚Œใพใ™', - 'dashboard.indicator.success.clearDrawings': '็ทš็”ปใ‚’ใ™ในใฆใ‚ฏใƒชใ‚ขใ—ใพใ—ใŸ', - 'dashboard.indicator.sma': 'SMA๏ผˆ็งปๅ‹•ๅนณๅ‡็ตๅˆ๏ผ‰', - 'dashboard.indicator.ema': 'EMA (ๆŒ‡ๆ•ฐ็งปๅ‹•ๅนณๅ‡็ตๅˆ)', - 'dashboard.indicator.rsi': 'RSI (็›ธๅฏพๅผทๅบฆ)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'ใƒœใƒชใƒณใ‚ธใƒฃใƒผใƒใƒณใƒ‰', - 'dashboard.indicator.atr': 'ATR (ๅนณๅ‡ใƒˆใ‚ฅใƒซใƒผใƒฌใƒณใ‚ธ)', - 'dashboard.indicator.cci': 'CCI (ๅ•†ๅ“ใƒใƒฃใƒใƒซๆŒ‡ๆ•ฐ)', - 'dashboard.indicator.williams': 'ใ‚ฆใ‚ฃใƒชใ‚ขใƒ ใ‚บ %R (ใ‚ฆใ‚ฃใƒชใ‚ขใƒ ใ‚บๆŒ‡ๆจ™)', - 'dashboard.indicator.mfi': 'MFI๏ผˆใƒžใƒใƒผใƒ•ใƒญใƒผใ‚คใƒณใƒ‡ใƒƒใ‚ฏใ‚น๏ผ‰', - 'dashboard.indicator.adx': 'ADX๏ผˆๅนณๅ‡ใƒˆใƒฌใƒณใƒ‰ๆŒ‡ๆ•ฐ๏ผ‰', - 'dashboard.indicator.obv': 'OBV๏ผˆใ‚จใƒใƒซใ‚ฎใƒผๆณข๏ผ‰', - 'dashboard.indicator.adosc': 'ADOSC (ใ‚ขใ‚ญใƒฅใƒ ใƒฌใƒผใƒˆ/ใƒ‡ใ‚ฃใ‚นใƒ‘ใƒƒใƒใ‚ชใ‚ทใƒฌใƒผใ‚ฟใƒผ)', - 'dashboard.indicator.ad': 'AD๏ผˆ่“„้›ปใƒป้…้›ป็ทš๏ผ‰', - 'dashboard.indicator.kdj': 'KDJ (็ขบ็އ็š„ๆŒ‡ๆจ™)', - 'dashboard.indicator.signal.buy': '่ฒทใ†', - 'dashboard.indicator.signal.sell': 'ๅฃฒใ‚‹', - 'dashboard.indicator.signal.supertrendBuy': 'ใ‚นใƒผใƒ‘ใƒผใƒˆใƒฌใƒณใƒ‰่ณผๅ…ฅ', - 'dashboard.indicator.signal.supertrendSell': 'ใ‚นใƒผใƒ‘ใƒผใƒˆใƒฌใƒณใƒ‰ใ‚ปใƒซ', - 'dashboard.indicator.chart.kline': 'Kใƒฉใ‚คใƒณ', - 'dashboard.indicator.chart.volume': 'ใƒœใƒชใƒฅใƒผใƒ ', - 'dashboard.indicator.chart.uptrend': 'ไธŠๆ˜‡ๅ‚พๅ‘', - 'dashboard.indicator.chart.downtrend': 'ไธ‹้™ๅ‚พๅ‘', - 'dashboard.indicator.tooltip.time': 'ๆ™‚้–“', - 'dashboard.indicator.tooltip.open': '้–‹ใ', - 'dashboard.indicator.tooltip.close': 'ๅ—ใ‘ๅ–ใ‚‹', - 'dashboard.indicator.tooltip.high': '้ซ˜ใ„', - 'dashboard.indicator.tooltip.low': 'ไฝŽใ„', - 'dashboard.indicator.tooltip.volume': 'ใƒœใƒชใƒฅใƒผใƒ ', - 'dashboard.indicator.drawing.line': '็ทšๅˆ†', - 'dashboard.indicator.drawing.horizontalLine': 'ๆฐดๅนณ็ทš', - 'dashboard.indicator.drawing.verticalLine': '็ธฆ็ทš', - 'dashboard.indicator.drawing.ray': 'ๅ…‰็ทš', - 'dashboard.indicator.drawing.straightLine': '็›ด็ทš', - 'dashboard.indicator.drawing.parallelLine': 'ๅนณ่กŒ็ทš', - 'dashboard.indicator.drawing.priceLine': 'ไพกๆ ผใƒฉใ‚คใƒณ', - 'dashboard.indicator.drawing.priceChannel': 'ไพกๆ ผใƒใƒฃใƒใƒซ', - 'dashboard.indicator.drawing.fibonacciLine': 'ใƒ•ใ‚ฃใƒœใƒŠใƒƒใƒใƒฉใ‚คใƒณ', - 'dashboard.indicator.drawing.clearAll': '็ทš็”ปใ‚’ใ™ในใฆใ‚ฏใƒชใ‚ขใ™ใ‚‹', - 'dashboard.indicator.market.USStock': '็ฑณๅ›ฝๆ ช', - 'dashboard.indicator.market.Crypto': 'ๆš—ๅท้€š่ฒจ', - 'dashboard.indicator.market.Forex': 'ๅค–ๅ›ฝ็‚บๆ›ฟ', - 'dashboard.indicator.market.Futures': 'ๅ…ˆ็‰ฉ', - 'dashboard.indicator.create': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎไฝœๆˆ', - 'dashboard.indicator.editor.title': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎไฝœๆˆ/็ทจ้›†', - 'dashboard.indicator.editor.name': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผๅ', - 'dashboard.indicator.editor.nameRequired': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผๅใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.namePlaceholder': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผๅใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.description': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ่ชฌๆ˜Ž', - 'dashboard.indicator.editor.descriptionPlaceholder': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ่ชฌๆ˜Žใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ (ใ‚ชใƒ—ใ‚ทใƒงใƒณ)', - 'dashboard.indicator.editor.code': 'Pythonใ‚ณใƒผใƒ‰', - 'dashboard.indicator.editor.codeRequired': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.codePlaceholder': 'Python ใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.run': '่ตฐใ‚‹', - 'dashboard.indicator.editor.runHint': 'ๅฎŸ่กŒใƒœใ‚ฟใƒณใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆใ€K ใƒฉใ‚คใƒณ ใƒใƒฃใƒผใƒˆไธŠใฎใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎๅŠนๆžœใ‚’ใƒ—ใƒฌใƒ“ใƒฅใƒผใ—ใพใ™ใ€‚', - 'dashboard.indicator.editor.guide': '้–‹็™บใ‚ฌใ‚คใƒ‰', - 'dashboard.indicator.editor.guideTitle': 'Python ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ้–‹็™บใ‚ฌใ‚คใƒ‰', - 'dashboard.indicator.editor.save': 'ไฟๅญ˜ใ™ใ‚‹', - 'dashboard.indicator.editor.cancel': 'ใ‚ญใƒฃใƒณใ‚ปใƒซ', - 'dashboard.indicator.editor.unnamed': 'ๅๅ‰ใฎใชใ„ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'dashboard.indicator.editor.publishToCommunity': 'ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใซๆŠ•็จฟใ™ใ‚‹', - 'dashboard.indicator.editor.publishToCommunityHint': 'ๅ…ฌ้–‹ใ•ใ‚Œใ‚‹ใจใ€ไป–ใฎใƒฆใƒผใ‚ถใƒผใŒใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใงใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚’่กจ็คบใ—ใฆไฝฟ็”จใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™', - 'dashboard.indicator.editor.indicatorType': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ็จฎ้กž', - 'dashboard.indicator.editor.indicatorTypeRequired': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎใ‚ฟใ‚คใƒ—ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎใ‚ฟใ‚คใƒ—ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.previewImage': 'ใƒ—ใƒฌใƒ“ใƒฅใƒผ', - 'dashboard.indicator.editor.uploadImage': 'ๅ†™็œŸใ‚’ใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ™ใ‚‹', - 'dashboard.indicator.editor.previewImageHint': 'ๆŽจๅฅจใ‚ตใ‚คใ‚บ: 800x400ใ€2MB ไปฅไธ‹', - 'dashboard.indicator.editor.pricing': '่ฒฉๅฃฒไพกๆ ผ๏ผˆQDT๏ผ‰', - 'dashboard.indicator.editor.pricingType.free': '็„กๆ–™', - 'dashboard.indicator.editor.pricingType.permanent': 'ๆฐธไน…็š„ใช', - 'dashboard.indicator.editor.pricingType.monthly': 'ๆœˆใ€…ใฎๆ”ฏๆ‰•ใ„', - 'dashboard.indicator.editor.price': 'ไพกๆ ผ', - 'dashboard.indicator.editor.priceRequired': 'ไพกๆ ผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.pricePlaceholder': 'ไพกๆ ผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.pricingHint': '็„กๆ–™ใฎใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎไพกๆ ผใฏ 0 ใงใ™ใŒใ€ใƒ—ใƒฉใƒƒใƒˆใƒ•ใ‚ฉใƒผใƒ ใฏใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎไฝฟ็”จ้‡ใจ่ณž่ณ›็އใซๅŸบใฅใ„ใฆๅ ฑ้…ฌ (QDT) ใ‚’ไธŽใˆใพใ™ใ€‚', - 'dashboard.indicator.editor.aiGenerate': 'ใ‚คใƒณใƒ†ใƒชใ‚ธใ‚งใƒณใƒˆใชไธ–ไปฃ', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'ใ‚ใชใŸใฎใ‚ขใ‚คใƒ‡ใ‚ขใ‚’ๆ•™ใˆใฆใใ ใ•ใ„ใ€‚Python ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ ใ‚ณใƒผใƒ‰ใ‚’็”Ÿๆˆใ—ใพใ™ใ€‚', - 'dashboard.indicator.editor.aiGenerateBtn': 'AIใŒ็”Ÿๆˆใ—ใŸใ‚ณใƒผใƒ‰', - 'dashboard.indicator.editor.aiPromptRequired': 'ใ‚ใชใŸใฎ่€ƒใˆใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.editor.aiGenerateSuccess': 'ใ‚ณใƒผใƒ‰็”ŸๆˆใŒๆˆๅŠŸใ—ใพใ—ใŸ', - 'dashboard.indicator.editor.aiGenerateError': 'ใ‚ณใƒผใƒ‰็”Ÿๆˆใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ๅพŒใงใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚', - 'dashboard.indicator.editor.verifyCode': 'ใ‚ณใƒผใƒ‰ๆคœ่จผ', - 'dashboard.indicator.editor.verifyCodeSuccess': 'ๆคœ่จผๅˆๆ ผ', - 'dashboard.indicator.editor.verifyCodeFailed': 'ๆคœ่จผๅคฑๆ•—', - 'dashboard.indicator.editor.verifyCodeEmpty': 'ใ‚ณใƒผใƒ‰ใฏ็ฉบใซใงใใพใ›ใ‚“', - 'dashboard.indicator.backtest.title': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆ', - 'dashboard.indicator.backtest.config': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใƒ‘ใƒฉใƒกใƒผใ‚ฟ', - 'dashboard.indicator.backtest.startDate': '้–‹ๅง‹ๆ—ฅ', - 'dashboard.indicator.backtest.endDate': '็ต‚ไบ†ๆ—ฅ', - 'dashboard.indicator.backtest.selectStartDate': '้–‹ๅง‹ๆ—ฅใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.backtest.selectEndDate': '็ต‚ไบ†ๆ—ฅใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.backtest.startDateRequired': '้–‹ๅง‹ๆ—ฅใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.backtest.endDateRequired': '็ต‚ไบ†ๆ—ฅใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.backtest.initialCapital': 'ๅˆๆœŸ่ณ‡ๆœฌ', - 'dashboard.indicator.backtest.initialCapitalRequired': 'ๅˆๆœŸ่ณ‡้‡‘ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.backtest.commission': 'ๆ‰‹ๆ•ฐๆ–™', - 'dashboard.indicator.backtest.leverage': 'ใƒฌใƒใƒฌใƒƒใ‚ธๆฏ”็އ', - 'dashboard.indicator.backtest.tradeDirection': 'ๅ–ๅผ•ใฎๆ–นๅ‘ๆ€ง', - 'dashboard.indicator.backtest.longOnly': '้•ทใ็ถšใ‘ใฆใใ ใ•ใ„', - 'dashboard.indicator.backtest.shortOnly': '็Ÿญใ„', - 'dashboard.indicator.backtest.both': 'ๅŒๆ–นๅ‘', - 'dashboard.indicator.backtest.run': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใ‚’้–‹ๅง‹ใ™ใ‚‹', - 'dashboard.indicator.backtest.rerun': 'ใ‚‚ใ†ไธ€ๅบฆใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆ', - 'dashboard.indicator.backtest.close': '้–‰ใ˜ใ‚‹', - 'dashboard.indicator.backtest.running': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใŒ้€ฒ่กŒไธญใงใ™...', - 'dashboard.indicator.backtest.results': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆ็ตๆžœ', - 'dashboard.indicator.backtest.totalReturn': 'ใƒˆใƒผใ‚ฟใƒซใƒชใ‚ฟใƒผใƒณ', - 'dashboard.indicator.backtest.annualReturn': 'ๅนดๅŽ', - 'dashboard.indicator.backtest.maxDrawdown': 'ๆœ€ๅคงใƒ‰ใƒญใƒผใƒ€ใ‚ฆใƒณ', - 'dashboard.indicator.backtest.sharpeRatio': 'ใ‚ทใƒฃใƒผใƒ—ใƒฌใ‚ทใ‚ช', - 'dashboard.indicator.backtest.winRate': 'ๅ‹็އ', - 'dashboard.indicator.backtest.profitFactor': 'ๆ็›Š็އ', - 'dashboard.indicator.backtest.totalTrades': 'ใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณๆ•ฐ', - 'dashboard.indicator.totalReturn': 'ใƒˆใƒผใ‚ฟใƒซใƒชใ‚ฟใƒผใƒณ', - 'dashboard.indicator.annualReturn': 'ๅนดๆ›็ฎ—ๅŽ็›Š็އ', - 'dashboard.indicator.maxDrawdown': 'ๆœ€ๅคงใƒ‰ใƒญใƒผใƒ€ใ‚ฆใƒณ', - 'dashboard.indicator.sharpeRatio': 'ใ‚ทใƒฃใƒผใƒ—ใƒฌใ‚ทใ‚ช', - 'dashboard.indicator.winRate': 'ๅ‹็އ', - 'dashboard.indicator.profitFactor': 'ๆ็›Š็އ', - 'dashboard.indicator.totalTrades': '็ทใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณๆ•ฐ', - 'dashboard.indicator.backtest.totalCommission': 'ๅˆ่จˆๆ‰‹ๆ•ฐๆ–™', - 'dashboard.indicator.backtest.equityCurve': 'ใ‚คใƒผใƒซใƒ‰ใ‚ซใƒผใƒ–', - 'dashboard.indicator.backtest.strategy': 'ๆŒ‡ๆจ™ๅŽๅ…ฅ', - 'dashboard.indicator.backtest.benchmark': 'ใƒ™ใƒณใƒใƒžใƒผใ‚ฏใƒชใ‚ฟใƒผใƒณ', - 'dashboard.indicator.backtest.tradeHistory': 'ๅ–ๅผ•ๅฑฅๆญด', - 'dashboard.indicator.backtest.tradeTime': 'ๆ™‚้–“', - 'dashboard.indicator.backtest.tradeType': 'ใ‚ฟใ‚คใƒ—', - 'dashboard.indicator.backtest.buy': '่ฒทใ†', - 'dashboard.indicator.backtest.sell': 'ๅฃฒใ‚‹', - 'dashboard.indicator.backtest.liquidation': 'ๆธ…็ฎ—', - 'dashboard.indicator.backtest.openLong': '้•ทใ้–‹ใ', - 'dashboard.indicator.backtest.closeLong': 'ใƒ”ใƒณใƒ‰ใ‚ฅใ‚ช', - 'dashboard.indicator.backtest.closeLongStop': 'ใƒญใƒณใ‚ฐใซ่ฟ‘ใ„๏ผˆใ‚นใƒˆใƒƒใƒ—ใƒญใ‚น๏ผ‰', - 'dashboard.indicator.backtest.closeLongProfit': 'ใ•ใ‚‰ใซ้–‰ใ˜ใ‚‹๏ผˆๅˆฉ็›Š็ขบๅฎš๏ผ‰', - 'dashboard.indicator.backtest.addLong': 'ใƒญใƒณใ‚ฐใƒใ‚ธใ‚ทใƒงใƒณใ‚’่ฟฝๅŠ ', - 'dashboard.indicator.backtest.openShort': 'ใ‚ชใƒผใƒ—ใƒณใ‚ทใƒงใƒผใƒˆ', - 'dashboard.indicator.backtest.closeShort': '็ฉบใฎ', - 'dashboard.indicator.backtest.closeShortStop': 'ใ‚ฏใƒญใƒผใ‚บ๏ผˆใ‚นใƒˆใƒƒใƒ—ใƒญใ‚น๏ผ‰', - 'dashboard.indicator.backtest.closeShortProfit': 'ใ‚ฏใƒญใƒผใ‚บ๏ผˆๅˆฉ็›Š็ขบๅฎš๏ผ‰', - 'dashboard.indicator.backtest.addShort': 'ใ‚ทใƒงใƒผใƒˆใƒใ‚ธใ‚ทใƒงใƒณใ‚’่ฟฝๅŠ ', - 'dashboard.indicator.backtest.price': 'ไพกๆ ผ', - 'dashboard.indicator.backtest.amount': 'ๆ•ฐ้‡', - 'dashboard.indicator.backtest.balance': 'ๅฃๅบงๆฎ‹้ซ˜', - 'dashboard.indicator.backtest.profit': 'ๆ็›Š', - 'dashboard.indicator.backtest.success': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆๅฎŒไบ†', - 'dashboard.indicator.backtest.failed': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ๅพŒใงใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„', - 'dashboard.indicator.backtest.noIndicatorCode': 'ใ“ใฎใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใซใฏใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆๅฏ่ƒฝใชใ‚ณใƒผใƒ‰ใฏใ‚ใ‚Šใพใ›ใ‚“', - 'dashboard.indicator.backtest.noSymbol': 'ๆœ€ๅˆใซๅ–ๅผ•ๅฏพ่ฑกใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'dashboard.indicator.backtest.dateRangeExceeded': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใฎๆ™‚้–“็ฏ„ๅ›ฒใŒๅˆถ้™ใ‚’่ถ…ใˆใฆใ„ใพใ™: {timeframe} ๆœŸ้–“ใฏๆœ€ๅคงใงใ‚‚ {maxRange} ใพใงใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใงใใพใ™', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ‚ปใƒณใ‚ฟใƒผ', - 'dashboard.docs.search.placeholder': 'ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ‚’ๆคœ็ดข...', - 'dashboard.docs.category.all': 'ใ™ในใฆ', - 'dashboard.docs.category.guide': '้–‹็™บใ‚ฌใ‚คใƒ‰', - 'dashboard.docs.category.api': 'APIใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ', - 'dashboard.docs.category.tutorial': 'ใƒใƒฅใƒผใƒˆใƒชใ‚ขใƒซ', - 'dashboard.docs.category.faq': 'ใ‚ˆใใ‚ใ‚‹่ณชๅ•', - 'dashboard.docs.featured.title': 'ๆŽจๅฅจใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ', - 'dashboard.docs.featured.tag': 'ใŠใ™ใ™ใ‚', - 'dashboard.docs.list.views': '้–ฒ่ฆงใ™ใ‚‹', - 'dashboard.docs.list.author': '่‘—่€…', - 'dashboard.docs.list.empty': 'ใพใ ๆ–‡ๆ›ธใŒใ‚ใ‚Šใพใ›ใ‚“', - 'dashboard.docs.list.backToAll': 'ใ™ในใฆใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใซๆˆปใ‚‹', - 'dashboard.docs.list.total': 'ๅˆ่จˆ {count} ๅ€‹ใฎใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆ', - 'dashboard.docs.detail.back': 'ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใƒชใ‚นใƒˆใซๆˆปใ‚‹', - 'dashboard.docs.detail.updatedAt': 'ใซๆ›ดๆ–ฐใ•ใ‚Œใพใ—ใŸ', - 'dashboard.docs.detail.related': '้–ข้€ฃ่ณ‡ๆ–™', - 'dashboard.docs.detail.notFound': 'ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใŒๅญ˜ๅœจใ—ใพใ›ใ‚“', - 'dashboard.docs.detail.error': 'ใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใŒๅญ˜ๅœจใ—ใชใ„ใ‹ๅ‰Š้™คใ•ใ‚Œใฆใ„ใพใ™', - 'dashboard.docs.search.result': 'ๆคœ็ดข็ตๆžœ', - 'dashboard.docs.search.keyword': 'ใ‚ญใƒผใƒฏใƒผใƒ‰', - 'community.filter.indicatorType': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ็จฎ้กž', - 'community.filter.all': 'ใ™ในใฆ', - 'community.filter.other': 'ใใฎไป–ใฎใ‚ชใƒ—ใ‚ทใƒงใƒณ', - 'community.filter.pricing': 'ไพกๆ ผใ‚ฟใ‚คใƒ—', - 'community.filter.allPricing': 'ใ™ในใฆใฎไพกๆ ผ่จญๅฎš', - 'community.filter.sortBy': 'ไธฆในๆ›ฟใˆ้ †', - 'community.filter.search': 'ๆคœ็ดข', - 'community.filter.searchPlaceholder': 'ๆคœ็ดขใƒกใƒˆใƒชใ‚ฏใ‚นๅ', - 'community.indicatorType.trend': 'ใƒˆใƒฌใƒณใƒ‰ใ‚ฟใ‚คใƒ—', - 'community.indicatorType.momentum': 'ๅ‹ขใ„ใ‚ฟใ‚คใƒ—', - 'community.indicatorType.volatility': 'ใƒœใƒฉใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃ', - 'community.indicatorType.volume': 'ใƒœใƒชใƒฅใƒผใƒ ', - 'community.indicatorType.custom': 'ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บ', - 'community.pricing.free': '็„กๆ–™', - 'community.pricing.paid': 'ๆ”ฏๆ‰•ใ†', - 'community.sort.downloads': 'ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰', - 'community.sort.rating': '่ฉ•ไพก', - 'community.sort.newest': 'ๆœ€ๆ–ฐใƒชใƒชใƒผใ‚น', - 'community.pagination.total': 'ๅˆ่จˆ {total} ๅ€‹ใฎใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'community.noDescription': 'ใพใ ่ชฌๆ˜ŽใŒใ‚ใ‚Šใพใ›ใ‚“', - 'community.detail.type': 'ใ‚ฟใ‚คใƒ—', - 'community.detail.pricing': 'ไพกๆ ผ่จญๅฎš', - 'community.detail.rating': '่ฉ•ไพก', - 'community.detail.downloads': 'ใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰', - 'community.detail.author': '่‘—่€…', - 'community.detail.description': 'ใฏใ˜ใ‚ใซ', - 'community.detail.detailContent': '่ฉณ็ดฐใช่ชฌๆ˜Ž', - 'community.detail.backtestStats': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆ็ตฑ่จˆ', - 'community.action.purchase': '่ณผๅ…ฅใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ', - 'community.action.addToMyIndicators': '็งใฎใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใซ่ฟฝๅŠ ', - 'community.action.favorite': 'ใ‚ณใƒฌใ‚ฏใ‚ทใƒงใƒณ', - 'community.action.unfavorite': 'ใŠๆฐ—ใซๅ…ฅใ‚Šใ‚’ใ‚ญใƒฃใƒณใ‚ปใƒซใ™ใ‚‹', - 'community.action.buyNow': 'ไปŠใ™ใ่ณผๅ…ฅ', - 'community.action.renew': 'ใƒชใƒ‹ใƒฅใƒผใ‚ขใƒซ', - 'community.purchase.price': 'ไพกๆ ผ', - 'community.purchase.permanent': 'ๆฐธไน…็š„ใช', - 'community.purchase.monthly': 'ๆœˆ', - 'community.purchase.confirmBuy': 'ใ“ใฎใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ ({price} QDT) ใ‚’่ณผๅ…ฅใ™ใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใพใ™ใ‹?', - 'community.purchase.confirmRenew': 'ใ“ใฎใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ ({price} QDT/ๆœˆ) ใ‚’ๆ›ดๆ–ฐใ™ใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใพใ™ใ‹?', - 'community.purchase.confirmFree': 'ใ“ใฎ็„กๆ–™ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใพใ™ใ‹?', - 'community.purchase.confirmTitle': 'ใ‚ขใ‚ฏใ‚ทใƒงใƒณใฎ็ขบ่ช', - 'community.purchase.owned': 'ใ“ใฎใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚’่ณผๅ…ฅใ—ใพใ—ใŸ (ๆฐธไน…ใซๆœ‰ๅŠนใงใ™)', - 'community.purchase.ownIndicator': 'ใ“ใ‚Œใฏใ‚ใชใŸใŒๅ…ฌ้–‹ใ—ใŸๆŒ‡ๆจ™ใงใ™', - 'community.purchase.expired': 'ใ‚ตใƒ–ใ‚นใ‚ฏใƒชใƒ—ใ‚ทใƒงใƒณใฎๆœ‰ๅŠนๆœŸ้™ใŒๅˆ‡ใ‚Œใพใ—ใŸ', - 'community.purchase.expiresOn': 'ๆœ‰ๅŠนๆœŸ้™: {ๆ—ฅไป˜}', - 'community.tabs.detail': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ่ฉณ็ดฐ', - 'community.tabs.backtest': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใƒ‡ใƒผใ‚ฟ', - 'community.tabs.ratings': 'ใƒฆใƒผใ‚ถใƒผใƒฌใƒ“ใƒฅใƒผ', - 'community.rating.myRating': '็งใฎ่ฉ•ไพก', - 'community.rating.stars': '{count} ๅ€‹ใฎๆ˜Ÿ', - 'community.rating.commentPlaceholder': 'ใ‚ใชใŸใฎ็ตŒ้จ“ใ‚’ๅ…ฑๆœ‰ใ—ใฆใใ ใ•ใ„...', - 'community.rating.submit': '่ฉ•ไพกใ‚’้€ไฟกใ™ใ‚‹', - 'community.rating.modify': 'ๅค‰ๆ›ด', - 'community.rating.saveModify': 'ๅค‰ๆ›ดใ‚’ไฟๅญ˜ใ™ใ‚‹', - 'community.rating.cancel': 'ใ‚ญใƒฃใƒณใ‚ปใƒซ', - 'community.rating.selectRating': '่ฉ•ไพกใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'community.rating.success': '่ฉ•ไพกใŒๆˆๅŠŸใ—ใพใ—ใŸ', - 'community.rating.modifySuccess': 'ใƒฌใƒ“ใƒฅใƒผใŒๆญฃๅธธใซๅค‰ๆ›ดใ•ใ‚Œใพใ—ใŸ', - 'community.rating.failed': '่ฉ•ไพกใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'community.rating.noRatings': 'ใพใ ใ‚ณใƒกใƒณใƒˆใฏใ‚ใ‚Šใพใ›ใ‚“', - 'community.backtest.note': 'ไธŠ่จ˜ใฎใƒ‡ใƒผใ‚ฟใฏ้ŽๅŽปใฎใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆ็ตๆžœใงใ‚ใ‚Šใ€ๅ‚่€ƒใฎใฟใ‚’็›ฎ็š„ใจใ—ใฆใŠใ‚Šใ€ๅฐ†ๆฅใฎๅŽ็›Šใ‚’็คบใ™ใ‚‚ใฎใงใฏใ‚ใ‚Šใพใ›ใ‚“ใ€‚', - 'community.backtest.noData': 'ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใƒ‡ใƒผใ‚ฟใฏใพใ ใ‚ใ‚Šใพใ›ใ‚“', - 'community.backtest.uploadHint': 'ไฝœ่€…ใฏใพใ ใƒใƒƒใ‚ฏใƒ†ใ‚นใƒˆใƒ‡ใƒผใ‚ฟใ‚’ใ‚ขใƒƒใƒ—ใƒญใƒผใƒ‰ใ—ใฆใ„ใพใ›ใ‚“', - 'community.message.loadFailed': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใƒชใ‚นใƒˆใฎใƒญใƒผใƒ‰ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'community.message.purchaseProcessing': '่ณผๅ…ฅใƒชใ‚ฏใ‚จใ‚นใƒˆใ‚’ๅ‡ฆ็†ใ—ใฆใ„ใพใ™...', - 'community.message.downloadSuccess': 'ใƒกใƒˆใƒชใƒƒใ‚ฏใŒใƒกใƒˆใƒชใƒƒใ‚ฏ ใƒชใ‚นใƒˆใซ่ฟฝๅŠ ใ•ใ‚Œใพใ—ใŸ', - 'community.message.favoriteSuccess': 'ๅŽ้›†ใซๆˆๅŠŸใ—ใพใ—ใŸ', - 'community.message.unfavoriteSuccess': 'ๅŽ้›†ใ‚’ๆญฃๅธธใซใ‚ญใƒฃใƒณใ‚ปใƒซใ—ใพใ—ใŸ', - 'community.message.operationSuccess': 'ๆ“ไฝœใฏๆˆๅŠŸใ—ใพใ—ใŸ', - 'community.message.operationFailed': 'ๆ“ไฝœใŒๅคฑๆ•—ใ—ใพใ—ใŸ', - 'community.banner.readOnly': '้–ฒ่ฆงใฎใฟ', - 'community.banner.loginHint': 'ใƒญใ‚ฐใ‚คใƒณใพใŸใฏ็™ป้ŒฒใŒๅฟ…่ฆใชๅ ดๅˆใฏใ€ใƒœใ‚ฟใƒณใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ—ใฆ็‹ฌ็ซ‹ใ—ใŸใƒšใƒผใ‚ธใซ็งปๅ‹•ใ—ใ€CSRFใฎๅ•้กŒใ‚’ๅ›ž้ฟใ—ใฆใใ ใ•ใ„', - 'community.banner.jumpButton': 'ใƒญใ‚ฐใ‚คใƒณ/็™ป้Œฒใธ', - 'dashboard.totalEquity': '็ท่ณ‡ๆœฌ', - 'dashboard.totalPnL': 'ๆ็›Š้€š็ฎ—', - 'dashboard.aiStrategies': 'AIๆˆฆ็•ฅ', - 'dashboard.indicatorStrategies': 'ๆŒ‡ๆจ™ๆˆฆ็•ฅ', - 'dashboard.running': 'ใƒฉใƒณใƒ‹ใƒณใ‚ฐ', - 'dashboard.pnlHistory': '้ŽๅŽปใฎๆ็›Š', - 'dashboard.strategyPerformance': 'ๆˆฆ็•ฅๆ็›Š็އ', - 'dashboard.recentTrades': 'ๆœ€่ฟ‘ใฎๅ–ๅผ•', - 'dashboard.currentPositions': '็พๅœจไฝ็ฝฎ', - 'dashboard.table.time': 'ๆ™‚้–“', - 'dashboard.table.strategy': 'ใƒใƒชใ‚ทใƒผๅ', - 'dashboard.table.symbol': 'ใ‚ฟใƒผใ‚ฒใƒƒใƒˆ', - 'dashboard.table.type': 'ใ‚ฟใ‚คใƒ—', - 'dashboard.table.side': 'ๆ–นๅ‘', - 'dashboard.table.size': 'ๅปบ็މ', - 'dashboard.table.entryPrice': 'ๅนณๅ‡ๅง‹ๅ€ค', - 'dashboard.table.price': 'ไพกๆ ผ', - 'dashboard.table.amount': 'ๆ•ฐ้‡', - 'dashboard.table.profit': 'ๆ็›Š', - 'dashboard.pendingOrders': 'ๆณจๆ–‡ๅฎŸ่กŒ่จ˜้Œฒ', - 'dashboard.totalOrders': 'ๅˆ่จˆ {total} ไปถ', - 'dashboard.viewError': 'ใ‚จใƒฉใƒผใ‚’่กจ็คบ', - 'dashboard.filled': '็ด„ๅฎšๆธˆใฟ', - 'dashboard.orderTable.time': 'ไฝœๆˆๆ™‚้–“', - 'dashboard.orderTable.strategy': 'ๆˆฆ็•ฅ', - 'dashboard.orderTable.symbol': 'ๅ–ๅผ•ใƒšใ‚ข', - 'dashboard.orderTable.signalType': 'ใ‚ทใ‚ฐใƒŠใƒซใ‚ฟใ‚คใƒ—', - 'dashboard.orderTable.amount': 'ๆ•ฐ้‡', - 'dashboard.orderTable.price': '็ด„ๅฎšไพกๆ ผ', - 'dashboard.orderTable.status': 'ใ‚นใƒ†ใƒผใ‚ฟใ‚น', - 'dashboard.orderTable.executedAt': 'ๅฎŸ่กŒๆ™‚้–“', - 'dashboard.signalType.openLong': 'ใƒญใƒณใ‚ฐ้–‹ๅง‹', - 'dashboard.signalType.openShort': 'ใ‚ทใƒงใƒผใƒˆ้–‹ๅง‹', - 'dashboard.signalType.closeLong': 'ใƒญใƒณใ‚ฐๆฑบๆธˆ', - 'dashboard.signalType.closeShort': 'ใ‚ทใƒงใƒผใƒˆๆฑบๆธˆ', - 'dashboard.signalType.addLong': 'ใƒญใƒณใ‚ฐ่ฟฝๅŠ ', - 'dashboard.signalType.addShort': 'ใ‚ทใƒงใƒผใƒˆ่ฟฝๅŠ ', - 'dashboard.status.pending': 'ไฟ็•™ไธญ', - 'dashboard.status.processing': 'ๅ‡ฆ็†ไธญ', - 'dashboard.status.completed': 'ๅฎŒไบ†', - 'dashboard.status.failed': 'ๅคฑๆ•—', - 'dashboard.status.cancelled': 'ใ‚ญใƒฃใƒณใ‚ปใƒซๆธˆใฟ', - 'dashboard.table.pnl': 'ๆœชๅฎŸ็พๆ็›Š', - 'form.basic-form.basic.title': 'ๅŸบๆœฌๅฝข', - 'form.basic-form.basic.description': 'ใƒ•ใ‚ฉใƒผใƒ  ใƒšใƒผใ‚ธใฏใ€ใƒฆใƒผใ‚ถใƒผใ‹ใ‚‰ใฎๆƒ…ๅ ฑใ‚’ๅŽ้›†ใพใŸใฏ็ขบ่ชใ™ใ‚‹ใŸใ‚ใซไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚ ๅŸบๆœฌใƒ•ใ‚ฉใƒผใƒ ใฏใ€ใƒ‡ใƒผใ‚ฟ้ …็›ฎใŒๅฐ‘ใชใ„ใƒ•ใ‚ฉใƒผใƒ  ใ‚ทใƒŠใƒชใ‚ชใงใ‚ˆใไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚', - 'form.basic-form.title.label': 'ใ‚ฟใ‚คใƒˆใƒซ', - 'form.basic-form.title.placeholder': '็›ฎๆจ™ใซๅๅ‰ใ‚’ไป˜ใ‘ใพใ™', - 'form.basic-form.title.required': 'ใ‚ฟใ‚คใƒˆใƒซใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'form.basic-form.date.label': '้–‹ๅง‹ๆ—ฅใจ็ต‚ไบ†ๆ—ฅ', - 'form.basic-form.placeholder.start': '้–‹ๅง‹ๆ—ฅ', - 'form.basic-form.placeholder.end': '็ต‚ไบ†ๆ—ฅ', - 'form.basic-form.date.required': '้–‹ๅง‹ๆ—ฅใจ็ต‚ไบ†ๆ—ฅใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'form.basic-form.goal.label': '็›ฎๆจ™ใฎ่ชฌๆ˜Ž', - 'form.basic-form.goal.placeholder': 'ๆฎต้šŽ็š„ใชไฝœๆฅญ็›ฎๆจ™ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'form.basic-form.goal.required': '็›ฎๆจ™ใฎ่ชฌๆ˜Žใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'form.basic-form.standard.label': 'ๆธฌใ‚‹', - 'form.basic-form.standard.placeholder': 'ๆŒ‡ๆจ™ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'form.basic-form.standard.required': 'ๆŒ‡ๆจ™ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'form.basic-form.client.label': 'ใŠๅฎขๆง˜', - 'form.basic-form.client.required': 'ใ‚ใชใŸใŒใ‚ตใƒผใƒ“ใ‚นใ‚’ๆไพ›ใ—ใฆใ„ใ‚‹ใ‚ฏใƒฉใ‚คใ‚ขใƒณใƒˆใซใคใ„ใฆ่ชฌๆ˜Žใ—ใฆใใ ใ•ใ„', - 'form.basic-form.label.tooltip': 'ๅฏพ่ฑกใ‚ตใƒผใƒ“ใ‚นๅ—ไฟก่€…', - 'form.basic-form.client.placeholder': 'ใ‚ใชใŸใŒใ‚ตใƒผใƒ“ใ‚นใ‚’ๆไพ›ใ—ใฆใ„ใ‚‹้กงๅฎขใ€ๅ†…้ƒจ้กงๅฎขใซใคใ„ใฆ็›ดๆŽฅ่ชฌๆ˜Žใ—ใฆใใ ใ•ใ„ @ๅๅ‰/ๅฝน่ท็•ชๅท', - 'form.basic-form.invites.label': 'ๆŸป่ชญ่€…ใ‚’ๆ‹›ๅพ…ใ™ใ‚‹', - 'form.basic-form.invites.placeholder': '@ๅๅ‰/ๅพ“ๆฅญๅ“ก็•ชๅทใ‚’็›ดๆŽฅ้€ไฟกใ—ใฆใใ ใ•ใ„ใ€‚ๆœ€ๅคง 5 ไบบใพใงๆ‹›ๅพ…ใงใใพใ™', - 'form.basic-form.weight.label': '้‡้‡', - 'form.basic-form.weight.placeholder': 'ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'form.basic-form.public.label': 'ใ‚ฟใƒผใ‚ฒใƒƒใƒˆใƒ‘ใƒ–ใƒชใƒƒใ‚ฏ', - 'form.basic-form.label.help': '้กงๅฎขใจใƒฌใƒ“ใƒฅใƒผๆ‹…ๅฝ“่€…ใฏใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใงๅ…ฑๆœ‰ใ•ใ‚Œใพใ™', - 'form.basic-form.radio.public': 'ๅ…ฌๅ…ฑใฎ', - 'form.basic-form.radio.partially-public': '้ƒจๅˆ†็š„ใซๅ…ฌ้–‹', - 'form.basic-form.radio.private': 'ใƒ—ใƒฉใ‚คใƒ™ใƒผใƒˆ', - 'form.basic-form.publicUsers.placeholder': 'ใซใ‚ชใƒผใƒ—ใƒณ', - 'form.basic-form.option.A': 'ๅŒๅƒš1', - 'form.basic-form.option.B': 'ๅŒๅƒš2', - 'form.basic-form.option.C': 'ๅŒๅƒš3ไบบ', - 'form.basic-form.email.required': 'ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผ', - 'form.basic-form.email.wrong-format': 'ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใฎๅฝขๅผใŒ้–“้•ใฃใฆใ„ใพใ™!', - 'form.basic-form.userName.required': 'ใƒฆใƒผใ‚ถใƒผๅใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„!', - 'form.basic-form.password.required': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'form.basic-form.password.twice': '2 ๅ›žๅ…ฅๅŠ›ใ—ใŸใƒ‘ใ‚นใƒฏใƒผใƒ‰ใŒไธ€่‡ดใ—ใพใ›ใ‚“ใ€‚', - 'form.basic-form.strength.msg': '6ๆ–‡ๅญ—ไปฅไธŠใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚ ๆŽจๆธฌใ•ใ‚Œใ‚„ใ™ใ„ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฏไฝฟ็”จใ—ใชใ„ใงใใ ใ•ใ„ใ€‚', - 'form.basic-form.strength.strong': 'ๅผทใ•: ๅผทใ„', - 'form.basic-form.strength.medium': 'ๅผทใ•: ไธญ', - 'form.basic-form.strength.short': 'ๅผทใ•๏ผš็Ÿญใ™ใŽใ‚‹', - 'form.basic-form.confirm-password.required': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚', - 'form.basic-form.phone-number.required': 'ๆบๅธฏ้›ป่ฉฑ็•ชๅทใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผ', - 'form.basic-form.phone-number.wrong-format': 'ๆบๅธฏ้›ป่ฉฑ็•ชๅทใฎๅฝขๅผใŒ้–“้•ใฃใฆใ„ใพใ™ใ€‚', - 'form.basic-form.verification-code.required': '็ขบ่ชใ‚ณใƒผใƒ‰ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'form.basic-form.form.get-captcha': '็ขบ่ชใ‚ณใƒผใƒ‰ใ‚’ๅ–ๅพ—ใ™ใ‚‹', - 'form.basic-form.captcha.second': '็ง’', - 'form.basic-form.form.optional': '(ใ‚ชใƒ—ใ‚ทใƒงใƒณ)', - 'form.basic-form.form.submit': '้€ไฟกใ™ใ‚‹', - 'form.basic-form.form.save': 'ไฟๅญ˜ใ™ใ‚‹', - 'form.basic-form.email.placeholder': '้›ปๅญใƒกใƒผใƒซ', - 'form.basic-form.password.placeholder': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฏ 6 ๆ–‡ๅญ—ไปฅไธŠใ€ๅคงๆ–‡ๅญ—ใจๅฐๆ–‡ๅญ—ใฏๅŒบๅˆฅใ•ใ‚Œใพใ™', - 'form.basic-form.confirm-password.placeholder': 'ใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฎ็ขบ่ช', - 'form.basic-form.phone-number.placeholder': 'ๆบๅธฏ้›ป่ฉฑ็•ชๅท', - 'form.basic-form.verification-code.placeholder': '่ช่จผใ‚ณใƒผใƒ‰', - 'result.success.title': '้€ไฟกๆˆๅŠŸ', - 'result.success.description': 'ๆŠ•ๅ…ฅ็ตๆžœใƒšใƒผใ‚ธใฏใ€ไธ€้€ฃใฎ้‹็”จใ‚ฟใ‚นใ‚ฏใฎๅ‡ฆ็†็ตๆžœใ‚’ใƒ•ใ‚ฃใƒผใƒ‰ใƒใƒƒใ‚ฏใ™ใ‚‹ใŸใ‚ใซไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚ๅ˜็ด”ใชๆ“ไฝœใฎใฟใฎๅ ดๅˆใฏใ€ใƒกใƒƒใ‚ปใƒผใ‚ธ ใ‚ฐใƒญใƒผใƒใƒซ ใƒ—ใƒญใƒณใƒ—ใƒˆ ใƒ•ใ‚ฃใƒผใƒ‰ใƒใƒƒใ‚ฏใ‚’ไฝฟ็”จใ—ใพใ™ใ€‚ใ“ใฎใƒ†ใ‚ญใ‚นใƒˆใ‚จใƒชใ‚ขใซใฏ็ฐกๅ˜ใช่ฃœ่ถณ่ชฌๆ˜Žใ‚’่กจ็คบใงใใพใ™ใ€‚ ใ€Œใƒ‰ใ‚ญใƒฅใƒกใƒณใƒˆใ€ใ‚’่กจ็คบใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ๅ ดๅˆใฏใ€ไธ‹ใฎ็ฐ่‰ฒใฎ้ ˜ๅŸŸใซใ•ใ‚‰ใซ่ค‡้›‘ใชใ‚ณใƒณใƒ†ใƒณใƒ„ใ‚’่กจ็คบใงใใพใ™ใ€‚', - 'result.success.operate-title': 'ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆๅ', - 'result.success.operate-id': 'ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆID', - 'result.success.principal': 'ๆ‹…ๅฝ“่€…', - 'result.success.operate-time': 'ๅŠนๆžœๆ™‚้–“', - 'result.success.step1-title': 'ใƒ—ใƒญใ‚ธใ‚งใ‚ฏใƒˆใฎไฝœๆˆ', - 'result.success.step1-operator': 'ใ‚ฏใƒปใƒชใƒช', - 'result.success.step2-title': '้ƒจ้–€ใฎไบ‹ๅ‰ๅฏฉๆŸป', - 'result.success.step2-operator': 'ๅ‘จ็Œซ็Œซ', - 'result.success.step2-extra': '็ทŠๆ€ฅ', - 'result.success.step3-title': '่ฒกๅ‹™ใƒฌใƒ“ใƒฅใƒผ', - 'result.success.step4-title': 'ๅฎŒไบ†', - 'result.success.btn-return': 'ใƒชใ‚นใƒˆใซๆˆปใ‚‹', - 'result.success.btn-project': 'ใ‚ขใ‚คใƒ†ใƒ ใ‚’่ฆ‹ใ‚‹', - 'result.success.btn-print': 'ๅฐๅˆทใ™ใ‚‹', - 'result.fail.error.title': '้€ไฟกใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'result.fail.error.description': 'ๅ†้€ไฟกใ™ใ‚‹ๅ‰ใซใ€ๆฌกใฎๆƒ…ๅ ฑใ‚’็ขบ่ชใ—ใฆๅค‰ๆ›ดใ—ใฆใใ ใ•ใ„ใ€‚', - 'result.fail.error.hint-title': '้€ไฟกใ—ใŸใ‚ณใƒณใƒ†ใƒณใƒ„ใซใฏๆฌกใฎใ‚จใƒฉใƒผใŒๅซใพใ‚Œใฆใ„ใพใ™ใ€‚', - 'result.fail.error.hint-text1': 'ใ‚ใชใŸใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฏๅ‡็ตใ•ใ‚Œใพใ—ใŸ', - 'result.fail.error.hint-btn1': 'ใ™ใใซ่งฃๅ‡ใ—ใฆใใ ใ•ใ„', - 'result.fail.error.hint-text2': 'ใ‚ใชใŸใฎใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฏใพใ ็”ณ่ซ‹ใ™ใ‚‹่ณ‡ๆ ผใŒใ‚ใ‚Šใพใ›ใ‚“', - 'result.fail.error.hint-btn2': 'ไปŠใ™ใใ‚ขใƒƒใƒ—ใ‚ฐใƒฌใƒผใƒ‰ใ—ใฆใใ ใ•ใ„', - 'result.fail.error.btn-text': 'ไฟฎๆญฃใซๆˆปใ‚‹', - 'account.settings.menuMap.custom': 'ใƒ‘ใƒผใ‚ฝใƒŠใƒฉใ‚คใ‚ผใƒผใ‚ทใƒงใƒณ', - 'account.settings.menuMap.binding': 'ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใƒใ‚คใƒณใƒ‡ใ‚ฃใƒณใ‚ฐ', - 'account.settings.basic.avatar': 'ใ‚ขใƒใ‚ฟใƒผ', - 'account.settings.basic.change-avatar': 'ใ‚ขใƒใ‚ฟใƒผใฎๅค‰ๆ›ด', - 'account.settings.basic.email': '้›ปๅญใƒกใƒผใƒซ', - 'account.settings.basic.email-message': 'ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'account.settings.basic.nickname': 'ใƒ‹ใƒƒใ‚ฏใƒใƒผใƒ ', - 'account.settings.basic.nickname-message': 'ใƒ‹ใƒƒใ‚ฏใƒใƒผใƒ ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผ', - 'account.settings.basic.profile': 'ใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซ', - 'account.settings.basic.profile-message': 'ใ‚ใชใŸใฎๅ€‹ไบบใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผ', - 'account.settings.basic.profile-placeholder': 'ใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซ', - 'account.settings.basic.country': 'ๅ›ฝ/ๅœฐๅŸŸ', - 'account.settings.basic.country-message': 'ใ‚ใชใŸใฎๅ›ฝใพใŸใฏๅœฐๅŸŸใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'account.settings.basic.geographic': '็œŒใจๅธ‚', - 'account.settings.basic.geographic-message': 'ใ‚ใชใŸใฎ้ƒฝ้“ๅบœ็œŒใจๅธ‚ๅŒบ็”บๆ‘ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'account.settings.basic.address': 'ไฝๆ‰€', - 'account.settings.basic.address-message': 'ไฝๆ‰€ใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'account.settings.basic.phone': '้€ฃ็ตกๅ…ˆ็•ชๅท', - 'account.settings.basic.phone-message': '้€ฃ็ตกๅ…ˆ็•ชๅทใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ใ€‚', - 'account.settings.basic.update': 'ๅŸบๆœฌๆƒ…ๅ ฑใ‚’ๆ›ดๆ–ฐ', - 'account.settings.basic.update.success': 'ๅŸบๆœฌๆƒ…ๅ ฑใŒๆญฃๅธธใซๆ›ดๆ–ฐใ•ใ‚Œใพใ—ใŸ', - 'account.settings.security.strong': 'ๅผทใ„', - 'account.settings.security.medium': 'ใง', - 'account.settings.security.weak': 'ๅผฑใ„', - 'account.settings.security.password': 'ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎใƒ‘ใ‚นใƒฏใƒผใƒ‰', - 'account.settings.security.password-description': '็พๅœจใฎใƒ‘ใ‚นใƒฏใƒผใƒ‰ใฎๅผทๅบฆ:', - 'account.settings.security.phone': 'ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃๆบๅธฏ้›ป่ฉฑ', - 'account.settings.security.phone-description': 'ใ™ใงใซใƒใ‚คใƒณใƒ‰ใ•ใ‚Œใฆใ„ใ‚‹ๆบๅธฏ้›ป่ฉฑ:', - 'account.settings.security.question': 'ใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใฎๅ•้กŒ', - 'account.settings.security.question-description': '็ง˜ๅฏ†ใฎ่ณชๅ•ใฏ่จญๅฎšใ•ใ‚Œใฆใ„ใชใ„ใŸใ‚ใ€ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎใ‚ปใ‚ญใƒฅใƒชใƒ†ใ‚ฃใ‚’ๅŠนๆžœ็š„ใซไฟ่ญทใงใใพใ™ใ€‚', - 'account.settings.security.email': '้›ปๅญใƒกใƒผใƒซใ‚’ใƒใ‚คใƒณใƒ‰ใ™ใ‚‹', - 'account.settings.security.email-description': 'ใ™ใงใซใƒใ‚คใƒณใƒ‰ใ•ใ‚Œใฆใ„ใ‚‹้›ปๅญใƒกใƒผใƒซ ใ‚ขใƒ‰ใƒฌใ‚น:', - 'account.settings.security.mfa': 'MFAใƒ‡ใƒใ‚คใ‚น', - 'account.settings.security.mfa-description': 'MFA ใƒ‡ใƒใ‚คใ‚นใฏใƒใ‚คใƒณใƒ‰ใ•ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚ใƒใ‚คใƒณใƒ‰ๅพŒใ€ๅ†ๅบฆ็ขบ่ชใงใใพใ™ใ€‚', - 'account.settings.security.modify': 'ๅค‰ๆ›ด', - 'account.settings.security.set': '่จญๅฎš', - 'account.settings.security.bind': 'ใƒใ‚คใƒณใƒ‡ใ‚ฃใƒณใ‚ฐ', - 'account.settings.binding.taobao': 'ใ‚ฟใ‚ชใƒใ‚ชใ‚’ใƒใ‚คใƒณใƒ‰ใ™ใ‚‹', - 'account.settings.binding.taobao-description': 'ใ‚ฟใ‚ชใƒใ‚ชใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฏ็พๅœจใƒใ‚คใƒณใƒ‰ใ•ใ‚Œใฆใ„ใพใ›ใ‚“', - 'account.settings.binding.alipay': 'Alipayใ‚’ใƒใ‚คใƒณใƒ‰ใ™ใ‚‹', - 'account.settings.binding.alipay-description': 'Alipay ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฏ็พๅœจใƒใ‚คใƒณใƒ‰ใ•ใ‚Œใฆใ„ใพใ›ใ‚“', - 'account.settings.binding.dingding': 'ใƒใ‚คใƒณใƒ‡ใ‚ฃใƒณใ‚ฐใƒ‡ใ‚ฃใƒณใƒˆใƒผใ‚ฏ', - 'account.settings.binding.dingding-description': '็พๅœจใƒใ‚คใƒณใƒ‰ใ•ใ‚Œใฆใ„ใ‚‹ DingTalk ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฏใ‚ใ‚Šใพใ›ใ‚“', - 'account.settings.binding.bind': 'ใƒใ‚คใƒณใƒ‡ใ‚ฃใƒณใ‚ฐ', - 'account.settings.notification.password': 'ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใฎใƒ‘ใ‚นใƒฏใƒผใƒ‰', - 'account.settings.notification.password-description': 'ไป–ใฎใƒฆใƒผใ‚ถใƒผใ‹ใ‚‰ใฎใƒกใƒƒใ‚ปใƒผใ‚ธใฏใ€ใ‚ตใ‚คใƒˆใƒกใƒƒใ‚ปใƒผใ‚ธใฎๅฝขๅผใง้€š็Ÿฅใ•ใ‚Œใพใ™ใ€‚', - 'account.settings.notification.messages': 'ใ‚ทใ‚นใƒ†ใƒ ใƒกใƒƒใ‚ปใƒผใ‚ธ', - 'account.settings.notification.messages-description': 'ใ‚ทใ‚นใƒ†ใƒ  ใƒกใƒƒใ‚ปใƒผใ‚ธใฏใ‚ตใ‚คใƒˆ ใƒกใƒƒใ‚ปใƒผใ‚ธใฎๅฝขๅผใง้€š็Ÿฅใ•ใ‚Œใพใ™ใ€‚', - 'account.settings.notification.todo': 'ToDoใ‚ฟใ‚นใ‚ฏ', - 'account.settings.notification.todo-description': 'To Do ใ‚ฟใ‚นใ‚ฏใฏใ‚ตใ‚คใƒˆๅ†…ใƒกใƒƒใ‚ปใƒผใ‚ธใฎๅฝขๅผใง้€š็Ÿฅใ•ใ‚Œใพใ™', - 'account.settings.settings.open': '้–‹ใ', - 'account.settings.settings.close': '้–‰ใ˜ใ‚‹', - 'trading-assistant.title': 'ๅ–ๅผ•ใ‚ขใ‚ทใ‚นใ‚ฟใƒณใƒˆ', - 'trading-assistant.strategyList': 'ๆˆฆ็•ฅไธ€่ฆง', - 'trading-assistant.createStrategy': 'ใƒใƒชใ‚ทใƒผใฎไฝœๆˆ', - 'trading-assistant.noStrategy': 'ใพใ ๆˆฆ็•ฅใฏใ‚ใ‚Šใพใ›ใ‚“', - 'trading-assistant.selectStrategy': '่ฉณ็ดฐใ‚’่กจ็คบใ™ใ‚‹ใซใฏใ€ๅทฆๅดใ‹ใ‚‰ๆˆฆ็•ฅใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.startStrategy': 'ๆˆฆ็•ฅใ‚’็ซ‹ใกไธŠใ’ใ‚‹', - 'trading-assistant.stopStrategy': 'ๆˆฆ็•ฅใ‚’ๅœๆญขใ™ใ‚‹', - 'trading-assistant.editStrategy': '็ทจ้›†ๆˆฆ็•ฅ', - 'trading-assistant.deleteStrategy': 'ใƒใƒชใ‚ทใƒผใฎๅ‰Š้™ค', - 'trading-assistant.status.running': 'ใƒฉใƒณใƒ‹ใƒณใ‚ฐ', - 'trading-assistant.status.stopped': 'ๅœๆญขใ—ใพใ—ใŸ', - 'trading-assistant.status.error': 'ใ‚จใƒฉใƒผ', - 'trading-assistant.strategyType.IndicatorStrategy': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™ๆˆฆ็•ฅ', - 'trading-assistant.strategyType.PromptBasedStrategy': 'ๅˆ่จ€่‘‰ๆˆฆ็•ฅ', - 'trading-assistant.strategyType.GridStrategy': 'ใ‚ฐใƒชใƒƒใƒ‰ๆˆฆ็•ฅ', - 'trading-assistant.tabs.tradingRecords': 'ๅ–ๅผ•ๅฑฅๆญด', - 'trading-assistant.tabs.positions': 'ไฝ็ฝฎ่จ˜้Œฒ', - 'trading-assistant.tabs.equityCurve': '่ณ‡ๆœฌๆ›ฒ็ทš', - 'trading-assistant.form.step1': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ้ธๆŠž', - 'trading-assistant.form.step2': 'Exchangeใฎๆง‹ๆˆ', - 'trading-assistant.form.step3': 'ๆˆฆ็•ฅใƒ‘ใƒฉใƒกใƒผใ‚ฟ', - 'trading-assistant.form.indicator': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ้ธๆŠž', - 'trading-assistant.form.indicatorHint': '่ณผๅ…ฅใพใŸใฏไฝœๆˆใ—ใŸใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™ใฎใฟใ‚’้ธๆŠžใงใใพใ™', - 'trading-assistant.form.qdtCostHints': 'ๆˆฆ็•ฅใ‚’ไฝฟ็”จใ™ใ‚‹ใจ QDT ใŒๆถˆ่ฒปใ•ใ‚Œใพใ™ใ€‚ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซๅๅˆ†ใช QDT ๆฎ‹้ซ˜ใŒใ‚ใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚', - 'trading-assistant.form.indicatorDescription': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใฎ่ชฌๆ˜Ž', - 'trading-assistant.form.noDescription': 'ใพใ ่ชฌๆ˜ŽใŒใ‚ใ‚Šใพใ›ใ‚“', - 'trading-assistant.form.exchange': 'ไบคๆ›ใ‚’้ธๆŠž', - 'trading-assistant.form.apiKey': 'APIใ‚ญใƒผ', - 'trading-assistant.form.secretKey': '็ง˜ๅฏ†้ต', - 'trading-assistant.form.passphrase': 'ใƒ‘ใ‚นใƒ•ใƒฌใƒผใ‚บ', - 'trading-assistant.form.testConnection': 'ใƒ†ใ‚นใƒˆๆŽฅ็ถš', - 'trading-assistant.form.strategyName': 'ใƒใƒชใ‚ทใƒผๅ', - 'trading-assistant.form.symbol': 'ๅ–ๅผ•ใƒšใ‚ข', - 'trading-assistant.form.symbolHint': '็พๅœจใ€ๆš—ๅท้€š่ฒจๅ–ๅผ•ใƒšใ‚ขใฎใฟใŒใ‚ตใƒใƒผใƒˆใ•ใ‚Œใฆใ„ใพใ™', - 'trading-assistant.form.initialCapital': 'ๆŠ•่ณ‡้ก', - 'trading-assistant.form.marketType': 'ๅธ‚ๅ ดใ‚ฟใ‚คใƒ—', - 'trading-assistant.form.marketTypeFutures': 'ๅฅ‘็ด„', - 'trading-assistant.form.marketTypeSpot': 'ใ‚นใƒใƒƒใƒˆ', - 'trading-assistant.form.marketTypeHint': 'ใ“ใฎๅฅ‘็ด„ใฏๅŒๆ–นๅ‘ใฎๅ–ๅผ•ใจใƒฌใƒใƒฌใƒƒใ‚ธใ‚’ใ‚ตใƒใƒผใƒˆใ—ใพใ™ใŒใ€ใ‚นใƒใƒƒใƒˆใฏใƒญใƒณใ‚ฐใƒใ‚ธใ‚ทใƒงใƒณใฎใฟใ‚’ใ‚ตใƒใƒผใƒˆใ—ใ€ใƒฌใƒใƒฌใƒƒใ‚ธใฏ 1 ๅ€ใซๅ›บๅฎšใ•ใ‚Œใพใ™ใ€‚', - 'trading-assistant.form.leverage': '่ค‡ๆ•ฐใ‚’ๆดป็”จใ™ใ‚‹', - 'trading-assistant.form.leverageHint': 'ๅฅ‘็ด„๏ผš1๏ฝž125ๅ›žใ€ใ‚นใƒใƒƒใƒˆ๏ผšๅ›บๅฎš1ๅ›ž', - 'trading-assistant.form.spotLeverageFixed': '็พ็‰ฉๅ–ๅผ•ใฎใƒฌใƒใƒฌใƒƒใ‚ธใฏ1ๅ€ใซๅ›บๅฎšใ•ใ‚Œใพใ™', - 'trading-assistant.form.spotOnlyLongHint': 'ใ‚นใƒใƒƒใƒˆๅ–ๅผ•ใฏใƒญใƒณใ‚ฐใƒใ‚ธใ‚ทใƒงใƒณใฎใฟใ‚’ใ‚ตใƒใƒผใƒˆใ—ใพใ™', - 'trading-assistant.form.tradeDirection': 'ๅ–ๅผ•ใฎๆ–นๅ‘ๆ€ง', - 'trading-assistant.form.tradeDirectionLong': 'ใŸใ ้•ทใ„ใ ใ‘', - 'trading-assistant.form.tradeDirectionShort': '็Ÿญใ„ใ ใ‘', - 'trading-assistant.form.tradeDirectionBoth': 'ๅŒๆ–นๅ‘ๅ–ๅผ•', - 'trading-assistant.form.timeframe': 'ๆœŸ้–“', - 'trading-assistant.form.klinePeriod': 'K็ทšๆœŸ้–“', - 'trading-assistant.form.timeframe1m': '1ๅˆ†', - 'trading-assistant.form.timeframe5m': '5ๅˆ†', - 'trading-assistant.form.timeframe15m': '15ๅˆ†', - 'trading-assistant.form.timeframe30m': '30ๅˆ†', - 'trading-assistant.form.timeframe1H': '1ๆ™‚้–“', - 'trading-assistant.form.timeframe4H': '4ๆ™‚้–“', - 'trading-assistant.form.timeframe1D': '1ๆ—ฅ', - 'trading-assistant.form.selectStrategyType': 'ๆˆฆ็•ฅใ‚ฟใ‚คใƒ—ใ‚’้ธๆŠž', - 'trading-assistant.form.indicatorStrategy': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผๆˆฆ็•ฅ', - 'trading-assistant.form.indicatorStrategyDesc': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใซๅŸบใฅใ่‡ชๅ‹•ๅ–ๅผ•ๆˆฆ็•ฅ', - 'trading-assistant.form.aiStrategy': 'AIๆˆฆ็•ฅ', - 'trading-assistant.form.aiStrategyDesc': 'AIใ‚คใƒณใƒ†ใƒชใ‚ธใ‚งใƒณใƒˆๆ„ๆ€ๆฑบๅฎšใซๅŸบใฅใ่‡ชๅ‹•ๅ–ๅผ•ๆˆฆ็•ฅ', - 'trading-assistant.form.enableAiFilter': 'AIใ‚คใƒณใƒ†ใƒชใ‚ธใ‚งใƒณใƒˆๆ„ๆ€ๆฑบๅฎšใƒ•ใ‚ฃใƒซใ‚ฟใƒผใ‚’ๆœ‰ๅŠนๅŒ–', - 'trading-assistant.form.enableAiFilterHint': 'ๆœ‰ๅŠนใซใ™ใ‚‹ใจใ€ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚ทใ‚ฐใƒŠใƒซใŒAIใซใ‚ˆใฃใฆใƒ•ใ‚ฃใƒซใ‚ฟใƒชใƒณใ‚ฐใ•ใ‚Œใ€ๅ–ๅผ•ๅ“่ณชใŒๅ‘ไธŠใ—ใพใ™', - 'trading-assistant.form.aiFilterPrompt': 'ใ‚ซใ‚นใ‚ฟใƒ ใƒ—ใƒญใƒณใƒ—ใƒˆ', - 'trading-assistant.form.aiFilterPromptHint': 'AIใƒ•ใ‚ฃใƒซใ‚ฟใƒชใƒณใ‚ฐใซใ‚ซใ‚นใ‚ฟใƒ ๆŒ‡็คบใ‚’ๆไพ›ใ—ใ€็ฉบ็™ฝใฎใพใพใซใ™ใ‚‹ใจใ‚ทใ‚นใƒ†ใƒ ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใ‚’ไฝฟ็”จใ—ใพใ™', - 'trading-assistant.validation.strategyTypeRequired': 'ๆˆฆ็•ฅใ‚ฟใ‚คใƒ—ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.form.advancedSettings': '่ฉณ็ดฐ่จญๅฎš', - 'trading-assistant.form.orderMode': 'ใ‚ชใƒผใƒ€ใƒผใƒขใƒผใƒ‰', - 'trading-assistant.form.orderModeMaker': 'ใƒกใƒผใ‚ซใƒผ', - 'trading-assistant.form.orderModeTaker': 'ๅธ‚ๅ ดไพกๆ ผ๏ผˆใƒ†ใ‚คใ‚ซใƒผ๏ผ‰', - 'trading-assistant.form.orderModeHint': 'ๆœชๆฑบๆณจๆ–‡ใƒขใƒผใƒ‰ใงใฏๆŒ‡ๅ€คๆณจๆ–‡ใŒไฝฟ็”จใ•ใ‚Œใ€ๆ‰‹ๆ•ฐๆ–™ใŒๅฎ‰ใใชใ‚Šใพใ™ใ€‚ๅธ‚ๅ ดไพกๆ ผใƒขใƒผใƒ‰ใฏใ™ใใซๅฎŸ่กŒใ•ใ‚Œใ€ๆ‰‹ๆ•ฐๆ–™ใŒ้ซ˜ใใชใ‚Šใพใ™ใ€‚', - 'trading-assistant.form.makerWaitSec': 'ๆœชๆฑบๆณจๆ–‡ใฎๅพ…ใกๆ™‚้–“ (็ง’)', - 'trading-assistant.form.makerWaitSecHint': 'ๆณจๆ–‡ๅพŒใฎๅ–ๅผ•ใ‚’ๅพ…ใคๆ™‚้–“ใ€‚ใ‚ญใƒฃใƒณใ‚ปใƒซใ—ใฆใ€ใ‚ฟใ‚คใƒ ใ‚ขใ‚ฆใƒˆๅพŒใซๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚', - 'trading-assistant.form.makerRetries': 'ๆœชๆฑบๆณจๆ–‡ใฎๅ†่ฉฆ่กŒๅ›žๆ•ฐ', - 'trading-assistant.form.makerRetriesHint': 'ๆœชๆฑบๆณจๆ–‡ใŒ็ด„ๅฎšใ—ใชใ„ๅ ดๅˆใฎๆœ€ๅคงใƒชใƒˆใƒฉใ‚คๅ›žๆ•ฐ', - 'trading-assistant.form.fallbackToMarket': 'ๆœชๆฑบๆณจๆ–‡ใฏๅคฑๆ•—ใ—ใ€ๅธ‚ๅ ดไพกๆ ผใฏๅผ•ใไธ‹ใ’ใ‚‰ใ‚Œใพใ™ใ€‚', - 'trading-assistant.form.fallbackToMarketHint': '้–‹ๅง‹/็ต‚ไบ†ๆœชๆฑบๆณจๆ–‡ใŒๅฎŒไบ†ใ—ใฆใ„ใชใ„ๅ ดๅˆใ€ใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณใ‚’็ขบๅฎŸใซๅฎŒไบ†ใ•ใ›ใ‚‹ใŸใ‚ใซๆˆ่กŒๆณจๆ–‡ใซใƒ€ใ‚ฆใƒณใ‚ฐใƒฌใƒผใƒ‰ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใ‹ใฉใ†ใ‹ใ€‚', - 'trading-assistant.form.marginMode': 'ใƒžใƒผใ‚ธใƒณใƒขใƒผใƒ‰', - 'trading-assistant.form.marginModeCross': 'ๅ€‰ๅบซใŒใ„ใฃใฑใ„', - 'trading-assistant.form.marginModeIsolated': 'ๅญค็ซ‹ใ—ใŸไฝ็ฝฎ', - 'trading-assistant.form.stopLossPct': 'ใ‚นใƒˆใƒƒใƒ—ใƒญใ‚น็އ(%)', - 'trading-assistant.form.stopLossPctHint': 'ใ‚นใƒˆใƒƒใƒ—ใƒญใ‚นใฎใƒ‘ใƒผใ‚ปใƒณใƒ†ใƒผใ‚ธใ‚’่จญๅฎšใ—ใพใ™ใ€‚0 ใฏใ‚นใƒˆใƒƒใƒ—ใƒญใ‚นใŒๆœ‰ๅŠนใซใชใฃใฆใ„ใชใ„ใ“ใจใ‚’ๆ„ๅ‘ณใ—ใพใ™', - 'trading-assistant.form.takeProfitPct': 'ใƒ†ใ‚คใ‚ฏใƒ—ใƒญใƒ•ใ‚ฃใƒƒใƒˆ็އ(%)', - 'trading-assistant.form.takeProfitPctHint': 'ใƒ†ใ‚คใ‚ฏใƒ—ใƒญใƒ•ใ‚ฃใƒƒใƒˆใฎใƒ‘ใƒผใ‚ปใƒณใƒ†ใƒผใ‚ธใ‚’่จญๅฎšใ—ใพใ™ใ€‚0 ใฏใƒ†ใ‚คใ‚ฏใƒ—ใƒญใƒ•ใ‚ฃใƒƒใƒˆใ‚’็„กๅŠนใซใ™ใ‚‹ใ“ใจใ‚’ๆ„ๅ‘ณใ—ใพใ™', - 'trading-assistant.form.signalMode': 'ไฟกๅทใƒขใƒผใƒ‰', - 'trading-assistant.form.signalModeConfirmed': '็ขบ่ชใƒขใƒผใƒ‰', - 'trading-assistant.form.signalModeAggressive': 'ใ‚ขใ‚ฐใƒฌใƒƒใ‚ทใƒ–ใƒขใƒผใƒ‰', - 'trading-assistant.form.signalModeHint': '็ขบ่ชใƒขใƒผใƒ‰: ๅฎŒไบ†ใ—ใŸ K ่กŒใฎใฟใ‚’ใƒใ‚งใƒƒใ‚ฏใ—ใพใ™ใ€‚ใ‚ขใ‚ฐใƒฌใƒƒใ‚ทใƒ– ใƒขใƒผใƒ‰: K ใƒฉใ‚คใƒณใฎๅฝขๆˆใ‚‚ใƒใ‚งใƒƒใ‚ฏใ—ใพใ™', - 'trading-assistant.form.cancel': 'ใ‚ญใƒฃใƒณใ‚ปใƒซ', - 'trading-assistant.form.prev': 'ๅ‰ใฎใ‚นใƒ†ใƒƒใƒ—', - 'trading-assistant.form.next': 'ๆฌกใฎใ‚นใƒ†ใƒƒใƒ—', - 'trading-assistant.form.confirmCreate': 'ไฝœๆˆใฎ็ขบ่ช', - 'trading-assistant.form.confirmEdit': 'ๅค‰ๆ›ดใ‚’็ขบ่ชใ™ใ‚‹', - 'trading-assistant.messages.createSuccess': 'ๆˆฆ็•ฅใŒๆญฃๅธธใซไฝœๆˆใ•ใ‚Œใพใ—ใŸ', - 'trading-assistant.messages.createFailed': 'ใƒใƒชใ‚ทใƒผใฎไฝœๆˆใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.updateSuccess': 'ใƒใƒชใ‚ทใƒผใฎๆ›ดๆ–ฐใŒๆˆๅŠŸใ—ใพใ—ใŸ', - 'trading-assistant.messages.updateFailed': 'ใƒใƒชใ‚ทใƒผใฎๆ›ดๆ–ฐใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.deleteSuccess': 'ใƒใƒชใ‚ทใƒผใฎๅ‰Š้™คใŒๆˆๅŠŸใ—ใพใ—ใŸ', - 'trading-assistant.messages.deleteFailed': 'ใƒใƒชใ‚ทใƒผใฎๅ‰Š้™คใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.startSuccess': 'ๆˆฆ็•ฅใฏ็„กไบ‹ใซ้–‹ๅง‹ใ•ใ‚Œใพใ—ใŸ', - 'trading-assistant.messages.startFailed': 'ใƒใƒชใ‚ทใƒผใฎ้–‹ๅง‹ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.stopSuccess': 'ๆˆฆ็•ฅใฏๆญฃๅธธใซๅœๆญขใ•ใ‚Œใพใ—ใŸ', - 'trading-assistant.messages.stopFailed': 'ๅœๆญขๆˆฆ็•ฅใฏๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.loadFailed': 'ใƒใƒชใ‚ทใƒผใƒชใ‚นใƒˆใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.runningWarning': 'ๆˆฆ็•ฅใฏๅฎŸ่กŒใ•ใ‚Œใฆใ„ใพใ™ใ€‚ ๆˆฆ็•ฅใ‚’ๅค‰ๆ›ดใ™ใ‚‹ๅ‰ใซๆˆฆ็•ฅใ‚’ๅœๆญขใ—ใฆใใ ใ•ใ„ใ€‚', - 'trading-assistant.messages.deleteConfirmWithName': 'ใƒใƒชใ‚ทใƒผใ€Œ{name}ใ€ใ‚’ๅ‰Š้™คใ—ใฆใ‚‚ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹?ใ“ใฎๆ“ไฝœใฏๅ…ƒใซๆˆปใ™ใ“ใจใŒใงใใพใ›ใ‚“ใ€‚', - 'trading-assistant.messages.deleteConfirm': 'ใ“ใฎใƒใƒชใ‚ทใƒผใ‚’ๅ‰Š้™คใ—ใฆใ‚‚ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹?ใ“ใฎๆ“ไฝœใฏๅ…ƒใซๆˆปใ™ใ“ใจใŒใงใใพใ›ใ‚“ใ€‚', - 'trading-assistant.messages.loadTradesFailed': 'ๅ–ๅผ•่จ˜้Œฒใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.loadPositionsFailed': 'ไฝ็ฝฎใƒฌใ‚ณใƒผใƒ‰ใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.loadEquityFailed': '่ณ‡ๆœฌๆ›ฒ็ทšใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.messages.loadIndicatorsFailed': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผ ใƒชใ‚นใƒˆใฎ่ชญใฟ่พผใฟใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ๅพŒใงใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„ใ€‚', - 'trading-assistant.messages.spotLimitations': 'ใ‚นใƒใƒƒใƒˆๅ–ๅผ•ใฏ่‡ชๅ‹•็š„ใซใƒญใƒณใ‚ฐใฎใฟใ€ใƒฌใƒใƒฌใƒƒใ‚ธ1ๅ€ใซ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™', - 'trading-assistant.messages.autoFillApiConfig': 'ๅ–ๅผ•ๆ‰€ใฎ้ŽๅŽปใฎ API ่จญๅฎšใŒ่‡ชๅ‹•็š„ใซๅ…ฅๅŠ›ใ•ใ‚Œใพใ™', - 'trading-assistant.placeholders.selectIndicator': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.selectExchange': 'ไบคๆ›ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.inputApiKey': 'APIใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.inputSecretKey': '็ง˜ๅฏ†ใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.inputPassphrase': 'ใƒ‘ใ‚นใƒ•ใƒฌใƒผใ‚บใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.inputStrategyName': 'ใƒใƒชใ‚ทใƒผๅใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.selectSymbol': 'ๅ–ๅผ•ใƒšใ‚ขใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.selectTimeframe': 'ๆœŸ้–“ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.selectKlinePeriod': 'K็ทšๆœŸ้–“ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'ใ‚ซใ‚นใ‚ฟใƒ ใƒ—ใƒญใƒณใƒ—ใƒˆใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผˆใ‚ชใƒ—ใ‚ทใƒงใƒณ๏ผ‰', - 'trading-assistant.validation.indicatorRequired': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.exchangeRequired': 'ไบคๆ›ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.apiKeyRequired': 'APIใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.secretKeyRequired': '็ง˜ๅฏ†ใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.passphraseRequired': 'ใƒ‘ใ‚นใƒ•ใƒฌใƒผใ‚บใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.exchangeConfigIncomplete': 'ๅฎŒๅ…จใชไบคๆ›ๆง‹ๆˆๆƒ…ๅ ฑใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.testConnectionRequired': 'ใพใšใ€Œใƒ†ใ‚นใƒˆๆŽฅ็ถšใ€ใƒœใ‚ฟใƒณใ‚’ใ‚ฏใƒชใƒƒใ‚ฏใ—ใ€ๆŽฅ็ถšใŒๆˆๅŠŸใ™ใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.testConnectionFailed': 'ๆŽฅ็ถšใƒ†ใ‚นใƒˆใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚่จญๅฎšใ‚’็ขบ่ชใ—ใฆๅ†ๅบฆใƒ†ใ‚นใƒˆใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.strategyNameRequired': 'ใƒใƒชใ‚ทใƒผๅใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.symbolRequired': 'ๅ–ๅผ•ใƒšใ‚ขใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.initialCapitalRequired': 'ๆŠ•่ณ‡้กใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.validation.leverageRequired': 'ใƒฌใƒใƒฌใƒƒใ‚ธๆฏ”็އใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.table.time': 'ๆ™‚้–“', - 'trading-assistant.table.type': 'ใ‚ฟใ‚คใƒ—', - 'trading-assistant.table.price': 'ไพกๆ ผ', - 'trading-assistant.table.amount': 'ๆ•ฐ้‡', - 'trading-assistant.table.value': '้‡‘้ก', - 'trading-assistant.table.commission': 'ๆ‰‹ๆ•ฐๆ–™', - 'trading-assistant.table.symbol': 'ๅ–ๅผ•ใƒšใ‚ข', - 'trading-assistant.table.side': 'ๆ–นๅ‘', - 'trading-assistant.table.size': 'ใƒใ‚ธใ‚ทใƒงใƒณๆ•ฐ้‡', - 'trading-assistant.table.entryPrice': 'ใ‚ชใƒผใƒ—ใƒณไพกๆ ผ', - 'trading-assistant.table.currentPrice': '็พๅœจใฎไพกๆ ผ', - 'trading-assistant.table.unrealizedPnl': 'ๆœชๅฎŸ็พๆ็›Š', - 'trading-assistant.table.pnlPercent': 'ๆ็›Š็އ', - 'trading-assistant.table.buy': '่ฒทใ†', - 'trading-assistant.table.sell': 'ๅฃฒใ‚‹', - 'trading-assistant.table.long': '้•ทใ็ถšใ‘ใฆใใ ใ•ใ„', - 'trading-assistant.table.short': '็Ÿญใ„', - 'trading-assistant.table.noPositions': 'ใพใ ใƒใ‚ธใ‚ทใƒงใƒณใŒใ‚ใ‚Šใพใ›ใ‚“', - 'trading-assistant.detail.title': 'ๆˆฆ็•ฅใฎ่ฉณ็ดฐ', - 'trading-assistant.detail.strategyName': 'ใƒใƒชใ‚ทใƒผๅ', - 'trading-assistant.detail.strategyType': 'ๆˆฆ็•ฅใ‚ฟใ‚คใƒ—', - 'trading-assistant.detail.status': 'ใ‚นใƒ†ใƒผใ‚ฟใ‚น', - 'trading-assistant.detail.tradingMode': 'ๅ–ๅผ•ใƒขใƒ‡ใƒซ', - 'trading-assistant.detail.exchange': 'ไบคๆ›', - 'trading-assistant.detail.initialCapital': 'ๅˆๆœŸ่ณ‡ๆœฌ', - 'trading-assistant.detail.totalInvestment': 'ๆŠ•่ณ‡็ท้ก', - 'trading-assistant.detail.currentEquity': '็พๅœจใฎ็ด”่ณ‡็”ฃ', - 'trading-assistant.detail.totalPnl': 'ๆ็›Š้€š็ฎ—', - 'trading-assistant.detail.indicatorName': 'ใ‚คใƒณใ‚ธใ‚ฑใƒผใ‚ฟใƒผๅ', - 'trading-assistant.detail.maxLeverage': 'ๆœ€ๅคงใƒฌใƒใƒฌใƒƒใ‚ธ', - 'trading-assistant.detail.decideInterval': 'ๆฑบๅฎš้–“้š”', - 'trading-assistant.detail.symbols': 'ใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆ', - 'trading-assistant.detail.createdAt': 'ไฝœๆˆๆ™‚้–“', - 'trading-assistant.detail.updatedAt': 'ๆ›ดๆ–ฐๆ™‚้–“', - 'trading-assistant.detail.llmConfig': 'AIใƒขใƒ‡ใƒซๆง‹ๆˆ', - 'trading-assistant.detail.exchangeConfig': 'Exchangeใฎๆง‹ๆˆ', - 'trading-assistant.detail.provider': 'ใƒ—ใƒญใƒใ‚คใƒ€ใƒผ', - 'trading-assistant.detail.modelId': 'ใƒขใƒ‡ใƒซID', - 'trading-assistant.detail.close': '้–‰ใ˜ใ‚‹', - 'trading-assistant.detail.loadFailed': 'ใƒใƒชใ‚ทใƒผใฎ่ฉณ็ดฐใ‚’ๅ–ๅพ—ใงใใพใ›ใ‚“ใงใ—ใŸ', - 'trading-assistant.equity.noData': '็ด”่ณ‡็”ฃใƒ‡ใƒผใ‚ฟใฏใพใ ใ‚ใ‚Šใพใ›ใ‚“', - 'trading-assistant.equity.equity': '็ด”่ณ‡็”ฃ', - 'trading-assistant.exchange.tradingMode': 'ๅ–ๅผ•ใƒขใƒ‡ใƒซ', - 'trading-assistant.exchange.virtual': 'ๆจกๆ“ฌๅ–ๅผ•', - 'trading-assistant.exchange.live': 'ๅฎŸ้š›ใฎใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณ', - 'trading-assistant.exchange.selectExchange': 'ไบคๆ›ใ‚’้ธๆŠž', - 'trading-assistant.exchange.walletAddress': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚ขใƒ‰ใƒฌใ‚น', - 'trading-assistant.exchange.walletAddressPlaceholder': 'ใ‚ฆใ‚ฉใƒฌใƒƒใƒˆใ‚ขใƒ‰ใƒฌใ‚นใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผˆ0xใงๅง‹ใพใ‚‹๏ผ‰', - 'trading-assistant.exchange.privateKey': '็ง˜ๅฏ†้ต', - 'trading-assistant.exchange.privateKeyPlaceholder': '็ง˜ๅฏ†ใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„(64ๆ–‡ๅญ—)', - 'trading-assistant.exchange.testConnection': 'ใƒ†ใ‚นใƒˆๆŽฅ็ถš', - 'trading-assistant.exchange.connectionSuccess': 'ๆŽฅ็ถšๆˆๅŠŸ', - 'trading-assistant.exchange.connectionFailed': 'ๆŽฅ็ถšใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.exchange.testFailed': 'ๆŽฅ็ถšใƒ†ใ‚นใƒˆใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'trading-assistant.exchange.fillComplete': 'ๅฎŒๅ…จใชไบคๆ›ๆง‹ๆˆๆƒ…ๅ ฑใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'trading-assistant.strategyTypeOptions.ai': 'AIไธปๅฐŽใฎๆˆฆ็•ฅ', - 'trading-assistant.strategyTypeOptions.indicator': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™ๆˆฆ็•ฅ', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AIใ‚’ๆดป็”จใ—ใŸๆˆฆ็•ฅๆฉŸ่ƒฝใฏ้–‹็™บไธญใงใ™ใฎใงใ”ๆœŸๅพ…ใใ ใ•ใ„', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AIไธปๅฐŽใฎๆˆฆ็•ฅๆฉŸ่ƒฝใฏ้–‹็™บไธญใงใ™', - 'trading-assistant.indicatorType.trend': 'ใƒˆใƒฌใƒณใƒ‰', - 'trading-assistant.indicatorType.momentum': 'ๅ‹ขใ„', - 'trading-assistant.indicatorType.volatility': 'ๅค‰ๅ‹•', - 'trading-assistant.indicatorType.volume': 'ใƒœใƒชใƒฅใƒผใƒ ', - 'trading-assistant.indicatorType.custom': 'ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บ', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'ใƒใ‚คใƒŠใƒณใ‚น', - 'hyperliquid': '่ถ…ๆตๅ‹•ๆ€ง', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'ใ‚ณใ‚คใƒณใƒ™ใƒผใ‚น', - 'gate': 'Gate.io', - 'mexc': 'ใƒกใ‚ญใ‚ทใ‚ณ', - 'kraken': 'ใ‚ฏใƒฉใƒผใ‚ฑใƒณ', - 'bitfinex': 'ใƒ“ใƒƒใƒˆใƒ•ใ‚ฃใƒใƒƒใ‚ฏใ‚น', - 'bybit': 'ใƒใ‚คใƒ“ใƒƒใƒˆ', - 'kucoin': 'ใ‚ฏใƒผใ‚ณใ‚คใƒณ', - 'huobi': 'ใƒ•ใ‚ฉใƒ“', - 'bitget': 'ใƒ“ใ‚ฒใƒƒใƒˆ', - 'bitmex': 'ใƒ“ใƒƒใƒˆใƒกใƒƒใ‚ฏใ‚น', - 'deribit': 'ใƒ‡ใƒชใƒ“ใƒƒใƒˆ', - 'phemex': 'ใƒ•ใ‚งใƒกใƒƒใ‚ฏใ‚น', - 'bitmart': 'ใƒ“ใƒƒใƒˆใƒžใƒผใƒˆ', - 'bitstamp': 'ใƒ“ใƒƒใƒˆใ‚นใ‚ฟใƒณใƒ—', - 'bittrex': 'ใƒ“ใƒƒใƒˆใƒฌใƒƒใ‚ฏใ‚น', - 'poloniex': 'ใƒใƒญใƒ‹ใ‚จใƒƒใ‚ฏใ‚น', - 'gemini': 'ใ‚ธใ‚งใƒŸใƒ‹', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'ใƒ“ใƒƒใƒˆใƒ•ใƒฉใ‚คใƒคใƒผ', - 'upbit': 'ใ‚ขใƒƒใƒ—ใƒ“ใƒƒใƒˆ', - 'bithumb': 'ใƒ“ใ‚ตใƒ ', - 'coinone': 'ใ‚ณใ‚คใƒŽใƒณ', - 'zb': 'ZB', - 'lbank': 'Lใƒใƒณใ‚ฏ', - 'bibox': 'ใƒ“ใƒœใƒƒใ‚ฏใ‚น', - 'bigone': 'ใƒ“ใƒƒใ‚ฐใƒฏใƒณ', - 'bitrue': 'ใƒ“ใƒˆใ‚ฅใƒซใƒผ', - 'coinex': 'CoinEx', - 'digifinex': 'ใƒ‡ใ‚ธใƒ•ใ‚ฃใƒใƒƒใ‚ฏใ‚น', - 'ftx': 'FTX', - 'ftxus': 'FTX็ฑณๅ›ฝ', - 'binanceus': 'ใƒใ‚คใƒŠใƒณใ‚นUS', - 'binancecoinm': 'ใƒใ‚คใƒŠใƒณใ‚น COIN-M', - 'binanceusdm': 'ใƒใ‚คใƒŠใƒณใ‚นUSDโ“ˆ-M', - 'deepcoin': 'ใƒ‡ใ‚ฃใƒผใƒ—ใ‚ณใ‚คใƒณ' - }, - 'ai-trading-assistant.title': 'AIๅ–ๅผ•ใ‚ขใ‚ทใ‚นใ‚ฟใƒณใƒˆ', - 'ai-trading-assistant.strategyList': 'ๆˆฆ็•ฅไธ€่ฆง', - 'ai-trading-assistant.createStrategy': 'ใƒใƒชใ‚ทใƒผใฎไฝœๆˆ', - 'ai-trading-assistant.noStrategy': 'ใพใ ๆˆฆ็•ฅใฏใ‚ใ‚Šใพใ›ใ‚“', - 'ai-trading-assistant.selectStrategy': '่ฉณ็ดฐใ‚’่กจ็คบใ™ใ‚‹ใซใฏใ€ๅทฆๅดใ‹ใ‚‰ๆˆฆ็•ฅใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.startStrategy': 'ๆˆฆ็•ฅใ‚’็ซ‹ใกไธŠใ’ใ‚‹', - 'ai-trading-assistant.stopStrategy': 'ๆˆฆ็•ฅใ‚’ๅœๆญขใ™ใ‚‹', - 'ai-trading-assistant.editStrategy': '็ทจ้›†ๆˆฆ็•ฅ', - 'ai-trading-assistant.deleteStrategy': 'ใƒใƒชใ‚ทใƒผใฎๅ‰Š้™ค', - 'ai-trading-assistant.status.running': 'ใƒฉใƒณใƒ‹ใƒณใ‚ฐ', - 'ai-trading-assistant.status.stopped': 'ๅœๆญขใ—ใพใ—ใŸ', - 'ai-trading-assistant.status.error': 'ใ‚จใƒฉใƒผ', - 'ai-trading-assistant.tabs.tradingRecords': 'ๅ–ๅผ•ๅฑฅๆญด', - 'ai-trading-assistant.tabs.positions': 'ไฝ็ฝฎ่จ˜้Œฒ', - 'ai-trading-assistant.tabs.aiDecisions': 'AIๅˆคๅฎš่จ˜้Œฒ', - 'ai-trading-assistant.tabs.equityCurve': '่ณ‡ๆœฌๆ›ฒ็ทš', - 'ai-trading-assistant.form.createTitle': 'AIๅ–ๅผ•ๆˆฆ็•ฅใ‚’ไฝœๆˆใ™ใ‚‹', - 'ai-trading-assistant.form.editTitle': 'AIๅ–ๅผ•ๆˆฆ็•ฅใ‚’็ทจ้›†ใ™ใ‚‹', - 'ai-trading-assistant.form.strategyName': 'ใƒใƒชใ‚ทใƒผๅ', - 'ai-trading-assistant.form.modelId': 'AIใƒขใƒ‡ใƒซ', - 'ai-trading-assistant.form.modelIdHint': 'API ใ‚ญใƒผใ‚’่จญๅฎšใ›ใšใซใ‚ทใ‚นใƒ†ใƒ  OpenRouter ใ‚ตใƒผใƒ“ใ‚นใ‚’ไฝฟ็”จใ™ใ‚‹', - 'ai-trading-assistant.form.decideInterval': 'ๆฑบๅฎš้–“้š”', - 'ai-trading-assistant.form.decideInterval5m': '5ๅˆ†', - 'ai-trading-assistant.form.decideInterval10m': '10ๅˆ†', - 'ai-trading-assistant.form.decideInterval30m': '30ๅˆ†', - 'ai-trading-assistant.form.decideInterval1h': '1ๆ™‚้–“', - 'ai-trading-assistant.form.decideInterval4h': '4ๆ™‚้–“', - 'ai-trading-assistant.form.decideInterval1d': '1ๆ—ฅ', - 'ai-trading-assistant.form.decideInterval1w': '1้€ฑ้–“', - 'ai-trading-assistant.form.decideIntervalHint': 'AIใŒๆ„ๆ€ๆฑบๅฎšใ‚’่กŒใ†ใพใงใฎๆ™‚้–“้–“้š”', - 'ai-trading-assistant.form.runPeriod': 'ๅฎŸ่กŒใ‚ตใ‚คใ‚ฏใƒซ', - 'ai-trading-assistant.form.runPeriodHint': 'ๆˆฆ็•ฅๅฎŸ่กŒใฎ้–‹ๅง‹ๆ™‚ๅˆปใจ็ต‚ไบ†ๆ™‚ๅˆป', - 'ai-trading-assistant.form.startDate': '้–‹ๅง‹ๆ—ฅ', - 'ai-trading-assistant.form.endDate': '็ต‚ไบ†ๆ—ฅ', - 'ai-trading-assistant.form.qdtCostTitle': 'QDT ๆŽง้™คใฎๆŒ‡็คบ', - 'ai-trading-assistant.form.qdtCostHint': 'AI ใฎๆฑบๅฎšใ”ใจใซ {cost} QDT ใŒๅทฎใ—ๅผ•ใ‹ใ‚Œใพใ™ใ€‚ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซๅๅˆ†ใช QDT ๆฎ‹้ซ˜ใŒใ‚ใ‚‹ใ“ใจใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„ใ€‚ๆˆฆ็•ฅใฎๅฎŸ่กŒไธญใ€ๆฑบๅฎšใ”ใจใซๆ–™้‡‘ใŒใƒชใ‚ขใƒซใ‚ฟใ‚คใƒ ใงๅทฎใ—ๅผ•ใ‹ใ‚Œใพใ™ใ€‚', - 'ai-trading-assistant.form.apiKey': 'APIใ‚ญใƒผ', - 'ai-trading-assistant.form.exchange': 'ไบคๆ›ใ‚’้ธๆŠž', - 'ai-trading-assistant.form.secretKey': '็ง˜ๅฏ†้ต', - 'ai-trading-assistant.form.passphrase': 'ใƒ‘ใ‚นใƒ•ใƒฌใƒผใ‚บ', - 'ai-trading-assistant.form.testConnection': 'ใƒ†ใ‚นใƒˆๆŽฅ็ถš', - 'ai-trading-assistant.form.symbol': 'ๅ–ๅผ•ใƒšใ‚ข', - 'ai-trading-assistant.form.symbolHint': 'ๅ–ๅผ•ใ™ใ‚‹ๅ–ๅผ•ใƒšใ‚ขใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.form.initialCapital': 'ๆŠ•่ณ‡้ก๏ผˆ่จผๆ‹ ้‡‘๏ผ‰', - 'ai-trading-assistant.form.leverage': '่ค‡ๆ•ฐใ‚’ๆดป็”จใ™ใ‚‹', - 'ai-trading-assistant.form.timeframe': 'ๆœŸ้–“', - 'ai-trading-assistant.form.timeframe1m': '1ๅˆ†', - 'ai-trading-assistant.form.timeframe5m': '5ๅˆ†', - 'ai-trading-assistant.form.timeframe15m': '15ๅˆ†', - 'ai-trading-assistant.form.timeframe30m': '30ๅˆ†', - 'ai-trading-assistant.form.timeframe1H': '1ๆ™‚้–“', - 'ai-trading-assistant.form.timeframe4H': '4ๆ™‚้–“', - 'ai-trading-assistant.form.timeframe1D': '1ๆ—ฅ', - 'ai-trading-assistant.form.marketType': 'ๅธ‚ๅ ดใ‚ฟใ‚คใƒ—', - 'ai-trading-assistant.form.marketTypeFutures': 'ๅฅ‘็ด„', - 'ai-trading-assistant.form.marketTypeSpot': 'ใ‚นใƒใƒƒใƒˆ', - 'ai-trading-assistant.form.totalPnl': 'ๆ็›Š้€š็ฎ—', - 'ai-trading-assistant.form.customPrompt': 'ใ‚ซใ‚นใ‚ฟใƒ ใฎใƒ—ใƒญใƒณใƒ—ใƒˆๅ˜่ชž', - 'ai-trading-assistant.form.customPromptHint': 'ใ‚ชใƒ—ใ‚ทใƒงใƒณใ€‚ AI ๅ–ๅผ•ๆˆฆ็•ฅใจๆ„ๆ€ๆฑบๅฎšใƒญใ‚ธใƒƒใ‚ฏใ‚’ใ‚ซใ‚นใ‚ฟใƒžใ‚คใ‚บใ™ใ‚‹ใŸใ‚ใซไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚', - 'ai-trading-assistant.form.cancel': 'ใ‚ญใƒฃใƒณใ‚ปใƒซ', - 'ai-trading-assistant.form.prev': 'ๅ‰ใฎใ‚นใƒ†ใƒƒใƒ—', - 'ai-trading-assistant.form.next': 'ๆฌกใฎใ‚นใƒ†ใƒƒใƒ—', - 'ai-trading-assistant.form.confirmCreate': 'ไฝœๆˆใฎ็ขบ่ช', - 'ai-trading-assistant.form.confirmEdit': 'ๅค‰ๆ›ดใ‚’็ขบ่ชใ™ใ‚‹', - 'ai-trading-assistant.messages.createSuccess': 'ๆˆฆ็•ฅใŒๆญฃๅธธใซไฝœๆˆใ•ใ‚Œใพใ—ใŸ', - 'ai-trading-assistant.messages.createFailed': 'ใƒใƒชใ‚ทใƒผใฎไฝœๆˆใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.updateSuccess': 'ใƒใƒชใ‚ทใƒผใฎๆ›ดๆ–ฐใŒๆˆๅŠŸใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.updateFailed': 'ใƒใƒชใ‚ทใƒผใฎๆ›ดๆ–ฐใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.deleteSuccess': 'ใƒใƒชใ‚ทใƒผใฎๅ‰Š้™คใŒๆˆๅŠŸใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.deleteFailed': 'ใƒใƒชใ‚ทใƒผใฎๅ‰Š้™คใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.startSuccess': 'ๆˆฆ็•ฅใฏ็„กไบ‹ใซ้–‹ๅง‹ใ•ใ‚Œใพใ—ใŸ', - 'ai-trading-assistant.messages.startFailed': 'ใƒใƒชใ‚ทใƒผใฎ้–‹ๅง‹ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.stopSuccess': 'ๆˆฆ็•ฅใฏๆญฃๅธธใซๅœๆญขใ•ใ‚Œใพใ—ใŸ', - 'ai-trading-assistant.messages.stopFailed': 'ๅœๆญขๆˆฆ็•ฅใฏๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.loadFailed': 'ใƒใƒชใ‚ทใƒผใƒชใ‚นใƒˆใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'AIๅˆคๅฎš่จ˜้Œฒใฎๅ–ๅพ—ใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.messages.deleteConfirm': 'ใ“ใฎใƒใƒชใ‚ทใƒผใ‚’ๅ‰Š้™คใ—ใฆใ‚‚ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹?ใ“ใฎๆ“ไฝœใฏๅ…ƒใซๆˆปใ™ใ“ใจใŒใงใใพใ›ใ‚“ใ€‚', - 'ai-trading-assistant.placeholders.inputStrategyName': 'ใƒใƒชใ‚ทใƒผๅใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.placeholders.selectModelId': 'AI ใƒขใƒ‡ใƒซใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'ๆฑบๅฎš้–“้š”ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.placeholders.startTime': '้–‹ๅง‹ๆ™‚้–“', - 'ai-trading-assistant.placeholders.endTime': '็ต‚ไบ†ๆ™‚้–“', - 'ai-trading-assistant.placeholders.inputApiKey': 'APIใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.placeholders.selectExchange': 'ไบคๆ›ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.placeholders.inputSecretKey': '็ง˜ๅฏ†ใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.placeholders.inputPassphrase': 'ใƒ‘ใ‚นใƒ•ใƒฌใƒผใ‚บใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.placeholders.selectSymbol': 'BTC/USDT ใชใฉใฎๅ–ๅผ•ใƒšใ‚ขใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„ใ€‚', - 'ai-trading-assistant.placeholders.selectTimeframe': 'ๆœŸ้–“ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'ใ‚ซใ‚นใ‚ฟใƒ ใฎใƒ—ใƒญใƒณใƒ—ใƒˆๅ˜่ชžใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„ (ใ‚ชใƒ—ใ‚ทใƒงใƒณ)', - 'ai-trading-assistant.validation.strategyNameRequired': 'ใƒใƒชใ‚ทใƒผๅใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.validation.modelIdRequired': 'AI ใƒขใƒ‡ใƒซใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.validation.runPeriodRequired': 'ๅฎŸ่กŒใ‚ตใ‚คใ‚ฏใƒซใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.validation.apiKeyRequired': 'APIใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.validation.exchangeRequired': 'ไบคๆ›ใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.validation.secretKeyRequired': '็ง˜ๅฏ†ใ‚ญใƒผใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.validation.symbolRequired': 'ๅ–ๅผ•ใƒšใ‚ขใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.validation.initialCapitalRequired': 'ๆŠ•่ณ‡้กใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'ai-trading-assistant.table.time': 'ๆ™‚้–“', - 'ai-trading-assistant.table.type': 'ใ‚ฟใ‚คใƒ—', - 'ai-trading-assistant.table.price': 'ไพกๆ ผ', - 'ai-trading-assistant.table.amount': 'ๆ•ฐ้‡', - 'ai-trading-assistant.table.value': '้‡‘้ก', - 'ai-trading-assistant.table.symbol': 'ๅ–ๅผ•ใƒšใ‚ข', - 'ai-trading-assistant.table.side': 'ๆ–นๅ‘', - 'ai-trading-assistant.table.size': 'ใƒใ‚ธใ‚ทใƒงใƒณๆ•ฐ้‡', - 'ai-trading-assistant.table.entryPrice': 'ใ‚ชใƒผใƒ—ใƒณไพกๆ ผ', - 'ai-trading-assistant.table.currentPrice': '็พๅœจใฎไพกๆ ผ', - 'ai-trading-assistant.table.unrealizedPnl': 'ๆœชๅฎŸ็พๆ็›Š', - 'ai-trading-assistant.table.profit': 'ๆ็›Š', - 'ai-trading-assistant.table.openLong': '้•ทใ้–‹ใ', - 'ai-trading-assistant.table.closeLong': 'ใƒ”ใƒณใƒ‰ใ‚ฅใ‚ช', - 'ai-trading-assistant.table.openShort': 'ใ‚ชใƒผใƒ—ใƒณใ‚ทใƒงใƒผใƒˆ', - 'ai-trading-assistant.table.closeShort': '็ฉบใฎ', - 'ai-trading-assistant.table.addLong': 'ใ‚ฌใƒ‰ใƒƒใƒˆ', - 'ai-trading-assistant.table.addShort': '็Ÿญใ่ฟฝๅŠ ใ™ใ‚‹', - 'ai-trading-assistant.table.closeShortProfit': 'ใ‚ทใƒงใƒผใƒˆใƒใ‚ธใ‚ทใƒงใƒณใงๅˆฉ็›Š็ขบๅฎš', - 'ai-trading-assistant.table.closeShortStop': 'ใ‚นใƒˆใƒƒใƒ—ใƒญใ‚น', - 'ai-trading-assistant.table.closeLongProfit': '้•ทใๅœๆญขใ—ใฆๅˆฉ็›Šใ‚’ๅพ—ใ‚‹', - 'ai-trading-assistant.table.closeLongStop': 'ใ‚นใƒˆใƒƒใƒ—ใƒญใ‚น', - 'ai-trading-assistant.table.buy': '่ฒทใ†', - 'ai-trading-assistant.table.sell': 'ๅฃฒใ‚‹', - 'ai-trading-assistant.table.long': '้•ทใ็ถšใ‘ใฆใใ ใ•ใ„', - 'ai-trading-assistant.table.short': '็Ÿญใ„', - 'ai-trading-assistant.table.hold': 'ใƒ›ใƒผใƒซใƒ‰', - 'ai-trading-assistant.table.reasoning': 'ๅˆ†ๆž็†็”ฑ', - 'ai-trading-assistant.table.decisions': 'ๆ„ๆ€ๆฑบๅฎš', - 'ai-trading-assistant.table.riskAssessment': 'ใƒชใ‚นใ‚ฏ่ฉ•ไพก', - 'ai-trading-assistant.table.confidence': '่‡ชไฟก', - 'ai-trading-assistant.table.totalRecords': 'ๅˆ่จˆ {total} ใƒฌใ‚ณใƒผใƒ‰', - 'ai-trading-assistant.table.noPositions': 'ใพใ ใƒใ‚ธใ‚ทใƒงใƒณใŒใ‚ใ‚Šใพใ›ใ‚“', - 'ai-trading-assistant.detail.title': 'ๆˆฆ็•ฅใฎ่ฉณ็ดฐ', - 'ai-trading-assistant.equity.noData': '็ด”่ณ‡็”ฃใƒ‡ใƒผใ‚ฟใฏใพใ ใ‚ใ‚Šใพใ›ใ‚“', - 'ai-trading-assistant.equity.equity': '็ด”่ณ‡็”ฃ', - 'ai-trading-assistant.exchange.testFailed': 'ๆŽฅ็ถšใƒ†ใ‚นใƒˆใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.exchange.connectionSuccess': 'ๆŽฅ็ถšๆˆๅŠŸ', - 'ai-trading-assistant.exchange.connectionFailed': 'ๆŽฅ็ถšใซๅคฑๆ•—ใ—ใพใ—ใŸ', - 'ai-trading-assistant.form.advancedSettings': '่ฉณ็ดฐ่จญๅฎš', - 'ai-trading-assistant.form.orderMode': 'ใ‚ชใƒผใƒ€ใƒผใƒขใƒผใƒ‰', - 'ai-trading-assistant.form.orderModeMaker': 'ใƒกใƒผใ‚ซใƒผ', - 'ai-trading-assistant.form.orderModeTaker': 'ๅธ‚ๅ ดไพกๆ ผ๏ผˆใƒ†ใ‚คใ‚ซใƒผ๏ผ‰', - 'ai-trading-assistant.form.orderModeHint': 'ๆœชๆฑบๆณจๆ–‡ใƒขใƒผใƒ‰ใงใฏๆŒ‡ๅ€คๆณจๆ–‡ใŒไฝฟ็”จใ•ใ‚Œใ€ๆ‰‹ๆ•ฐๆ–™ใŒๅฎ‰ใใชใ‚Šใพใ™ใ€‚ๅธ‚ๅ ดไพกๆ ผใƒขใƒผใƒ‰ใฏใ™ใใซๅฎŸ่กŒใ•ใ‚Œใ€ๆ‰‹ๆ•ฐๆ–™ใŒ้ซ˜ใใชใ‚Šใพใ™ใ€‚', - 'ai-trading-assistant.form.makerWaitSec': 'ๆœชๆฑบๆณจๆ–‡ใฎๅพ…ใกๆ™‚้–“ (็ง’)', - 'ai-trading-assistant.form.makerWaitSecHint': 'ๆณจๆ–‡ๅพŒใฎๅ–ๅผ•ใ‚’ๅพ…ใคๆ™‚้–“ใ€‚ใ‚ญใƒฃใƒณใ‚ปใƒซใ—ใฆใ€ใ‚ฟใ‚คใƒ ใ‚ขใ‚ฆใƒˆๅพŒใซๅ†่ฉฆ่กŒใ—ใฆใใ ใ•ใ„ใ€‚', - 'ai-trading-assistant.form.makerRetries': 'ๆœชๆฑบๆณจๆ–‡ใฎๅ†่ฉฆ่กŒๅ›žๆ•ฐ', - 'ai-trading-assistant.form.makerRetriesHint': 'ๆœชๆฑบๆณจๆ–‡ใŒ็ด„ๅฎšใ—ใชใ„ๅ ดๅˆใฎๆœ€ๅคงใƒชใƒˆใƒฉใ‚คๅ›žๆ•ฐ', - 'ai-trading-assistant.form.fallbackToMarket': 'ๆœชๆฑบๆณจๆ–‡ใฏๅคฑๆ•—ใ—ใ€ๅธ‚ๅ ดไพกๆ ผใฏๅผ•ใไธ‹ใ’ใ‚‰ใ‚Œใพใ™ใ€‚', - 'ai-trading-assistant.form.fallbackToMarketHint': '้–‹ๅง‹/็ต‚ไบ†ๆœชๆฑบๆณจๆ–‡ใŒๅฎŒไบ†ใ—ใฆใ„ใชใ„ๅ ดๅˆใ€ใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณใ‚’็ขบๅฎŸใซๅฎŒไบ†ใ•ใ›ใ‚‹ใŸใ‚ใซๆˆ่กŒๆณจๆ–‡ใซใƒ€ใ‚ฆใƒณใ‚ฐใƒฌใƒผใƒ‰ใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚‹ใ‹ใฉใ†ใ‹ใ€‚', - 'ai-trading-assistant.form.marginMode': 'ใƒžใƒผใ‚ธใƒณใƒขใƒผใƒ‰', - 'ai-trading-assistant.form.marginModeCross': 'ๅ€‰ๅบซใŒใ„ใฃใฑใ„', - 'ai-trading-assistant.form.marginModeIsolated': 'ๅญค็ซ‹ใ—ใŸไฝ็ฝฎ', - 'ai-analysis.title': 'ใ‚ฏใ‚ฉใƒณใ‚ฟใƒ ใƒˆใƒฌใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใ‚จใƒณใ‚ธใƒณ', - 'ai-analysis.system.online': 'ใ‚ชใƒณใƒฉใ‚คใƒณ', - 'ai-analysis.system.agents': 'ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ', - 'ai-analysis.system.active': 'ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใช', - 'ai-analysis.system.stage': 'ใ‚นใƒ†ใƒผใ‚ธ', - 'ai-analysis.panel.roster': 'ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆใƒฉใ‚คใƒณใƒŠใƒƒใƒ—', - 'ai-analysis.panel.thinking': '่€ƒใˆไธญ...', - 'ai-analysis.panel.done': 'ๅฎŒไบ†', - 'ai-analysis.panel.standby': 'ใ‚นใ‚ฟใƒณใƒใ‚ค', - 'ai-analysis.input.title': 'ใ‚ฏใ‚ฉใƒณใ‚ฟใƒ ใƒˆใƒฌใƒผใƒ‡ใ‚ฃใƒณใ‚ฐใ‚จใƒณใ‚ธใƒณ', - 'ai-analysis.input.placeholder': 'ใ‚ฟใƒผใ‚ฒใƒƒใƒˆ่ณ‡็”ฃใ‚’้ธๆŠžใ—ใพใ™ (ไพ‹: BTC/USDT)', - 'ai-analysis.input.watchlist': 'ใ‚ชใƒ—ใ‚ทใƒงใƒณใ‚นใƒˆใƒƒใ‚ฏ', - 'ai-analysis.input.start': 'ๅˆ†ๆžใ‚’้–‹ๅง‹ใ™ใ‚‹', - 'ai-analysis.input.recent': 'ๆœ€่ฟ‘ใฎใ‚ฟใ‚นใ‚ฏ:', - 'ai-analysis.vis.stage': 'ใ‚นใƒ†ใƒผใ‚ธ', - 'ai-analysis.vis.processing': 'ๅ‡ฆ็†ไธญ', - 'ai-analysis.result.complete': 'ๅˆ†ๆžๅฎŒไบ†', - 'ai-analysis.result.signal': 'ๆœ€็ต‚ไฟกๅท', - 'ai-analysis.result.confidence': '่‡ชไฟก:', - 'ai-analysis.result.new': 'ๆ–ฐใ—ใ„ๅˆ†ๆž', - 'ai-analysis.result.full': 'ใƒฌใƒใƒผใƒˆๅ…จไฝ“ใ‚’่กจ็คบ', - 'ai-analysis.logs.title': 'ใ‚ทใ‚นใƒ†ใƒ ใƒญใ‚ฐ', - 'ai-analysis.modal.title': 'ๆฉŸๅฏ†ๅ ฑๅ‘Šๆ›ธ', - 'ai-analysis.modal.fundamental': 'ใƒ•ใ‚กใƒณใƒ€ใƒกใƒณใ‚ฟใƒซใ‚บๅˆ†ๆž', - 'ai-analysis.modal.technical': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๅˆ†ๆž', - 'ai-analysis.modal.sentiment': 'ๆ„Ÿๆƒ…ๅˆ†ๆž', - 'ai-analysis.modal.risk': 'ใƒชใ‚นใ‚ฏ่ฉ•ไพก', - 'ai-analysis.stage.idle': 'ใ‚นใ‚ฟใƒณใƒใ‚ค', - 'ai-analysis.stage.1': 'ใƒ•ใ‚งใƒผใ‚บ 1: ๅคšๆฌกๅ…ƒๅˆ†ๆž', - 'ai-analysis.stage.2': 'ใƒ•ใ‚งใƒผใ‚บ 2: ้•ท็Ÿญ่จŽ่ซ–', - 'ai-analysis.stage.3': 'ใƒ•ใ‚งใƒผใ‚บ 3: ๆˆฆ็•ฅ่จˆ็”ป', - 'ai-analysis.stage.4': '็ฌฌ 4 ๆฎต้šŽ: ใƒชใ‚นใ‚ฏ็ฎก็†ใฎใƒฌใƒ“ใƒฅใƒผ', - 'ai-analysis.stage.complete': 'ๅฎŒไบ†', - 'ai-analysis.agent.investment_director': 'ๆŠ•่ณ‡ใƒ‡ใ‚ฃใƒฌใ‚ฏใ‚ฟใƒผ', - 'ai-analysis.agent.role.investment_director': 'ๅŒ…ๆ‹ฌ็š„ใชๅˆ†ๆžใจๆœ€็ต‚็ต่ซ–', - 'ai-analysis.agent.market': 'ๅธ‚ๅ ดใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.market': 'ใƒ†ใ‚ฏใƒŽใƒญใ‚ธใƒผใจๅธ‚ๅ ดใƒ‡ใƒผใ‚ฟ', - 'ai-analysis.agent.fundamental': 'ใƒ•ใ‚กใƒณใƒ€ใƒกใƒณใ‚ฟใƒซใ‚บใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.fundamental': '่ฒกๅ‹™ใจ่ฉ•ไพก', - 'ai-analysis.agent.technical': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.technical': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™ใจใƒใƒฃใƒผใƒˆ', - 'ai-analysis.agent.news': 'ใƒ‹ใƒฅใƒผใ‚นใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.news': 'ใ‚ฐใƒญใƒผใƒใƒซใƒ‹ใƒฅใƒผใ‚นใƒ•ใ‚ฃใƒซใ‚ฟใƒผ', - 'ai-analysis.agent.sentiment': 'ใ‚ปใƒณใƒใƒกใƒณใƒˆใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.sentiment': '็คพไผš็š„๏ผ†ๆ„Ÿๆƒ…็š„', - 'ai-analysis.agent.risk': 'ใƒชใ‚นใ‚ฏใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.risk': 'ๅŸบๆœฌ็š„ใชใƒชใ‚นใ‚ฏใƒใ‚งใƒƒใ‚ฏ', - 'ai-analysis.agent.bull': 'ๅผทๆฐ—ใช็ ”็ฉถ่€…', - 'ai-analysis.agent.role.bull': 'ๆˆ้•ท่งฆๅช’ใฎๆŽกๆŽ˜', - 'ai-analysis.agent.bear': 'ๅผฑๆฐ—ใช็ ”็ฉถ่€…', - 'ai-analysis.agent.role.bear': 'ใƒชใ‚นใ‚ฏใจๆฌ ้™ฅใฎๆŽ˜ใ‚Šไธ‹ใ’', - 'ai-analysis.agent.manager': '็ ”็ฉถใƒžใƒใƒผใ‚ธใƒฃใƒผ', - 'ai-analysis.agent.role.manager': 'ใƒ‡ใ‚ฃใƒ™ใƒผใƒˆใƒขใƒ‡ใƒฌใƒผใ‚ฟใƒผ', - 'ai-analysis.agent.trader': 'ใƒˆใƒฌใƒผใƒ€ใƒผ', - 'ai-analysis.agent.role.trader': 'ใ‚จใ‚ฐใ‚ผใ‚ฏใƒ†ใ‚ฃใƒ–ใƒปใ‚นใƒˆใƒฉใƒ†ใ‚ธใ‚นใƒˆ', - 'ai-analysis.agent.risky': 'ๆดปๅ‹•ๅฎถใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.risky': '็ฉๆฅต็š„ใชๆˆฆ็•ฅ', - 'ai-analysis.agent.neutral': 'ใƒใƒฉใƒณใ‚นใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.neutral': 'ใƒใƒฉใƒณใ‚นๆˆฆ็•ฅ', - 'ai-analysis.agent.safe': 'ไฟๅฎˆ็š„ใชใ‚ขใƒŠใƒชใ‚นใƒˆ', - 'ai-analysis.agent.role.safe': 'ไฟๅฎˆ็š„ใชๆˆฆ็•ฅ', - 'ai-analysis.agent.cro': 'ใƒชใ‚นใ‚ฏใ‚ณใƒณใƒˆใƒญใƒผใƒซใƒžใƒใƒผใ‚ธใƒฃใƒผ (CRO)', - 'ai-analysis.agent.role.cro': 'ๆœ€็ต‚็š„ใชๆ„ๆ€ๆฑบๅฎšๆจฉ้™', - 'ai-analysis.script.market': 'ไธป่ฆใชๅ–ๅผ•ๆ‰€ใ‹ใ‚‰ OHLCV ใƒ‡ใƒผใ‚ฟใ‚’ๅ–ๅพ—ใ—ใฆใ„ใพใ™...', - 'ai-analysis.script.fundamental': 'ๅ››ๅŠๆœŸ่ฒกๅ‹™ๅ ฑๅ‘Šๆ›ธใ‚’ๅ–ๅพ—ใ—ใฆใ„ใพใ™...', - 'ai-analysis.script.technical': 'ใƒ†ใ‚ฏใƒ‹ใ‚ซใƒซๆŒ‡ๆจ™ใจใƒใƒฃใƒผใƒˆใƒ‘ใ‚ฟใƒผใƒณใ‚’ๅˆ†ๆžใ—ใฆใ„ใพใ™...', - 'ai-analysis.script.news': 'ไธ–็•Œ็š„ใช้‡‘่žใƒ‹ใƒฅใƒผใ‚นใ‚’่ชฟในใฆใ„ใพใ™...', - 'ai-analysis.script.sentiment': 'ใ‚ฝใƒผใ‚ทใƒฃใƒซใƒกใƒ‡ใ‚ฃใ‚ขใฎใƒˆใƒฌใƒณใƒ‰ใ‚’ๅˆ†ๆžไธญ...', - 'ai-analysis.script.risk': '้ŽๅŽปใฎใƒœใƒฉใƒ†ใ‚ฃใƒชใƒ†ใ‚ฃใ‚’่จˆ็ฎ—ใ—ใฆใ„ใพใ™...', - 'invite.inviteLink': 'ๆ‹›ๅพ…ใƒชใƒณใ‚ฏ', - 'invite.copy': 'ใƒชใƒณใ‚ฏใ‚’ใ‚ณใƒ”ใƒผ', - 'invite.copySuccess': 'ใ‚ณใƒ”ใƒผๆˆๅŠŸ๏ผ', - 'invite.copyFailed': 'ใ‚ณใƒ”ใƒผใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ ๆ‰‹ๅ‹•ใงใ‚ณใƒ”ใƒผใ—ใฆใใ ใ•ใ„', - 'invite.noInviteLink': 'ๆ‹›ๅพ…ใƒชใƒณใ‚ฏใŒ็”Ÿๆˆใ•ใ‚Œใพใ›ใ‚“ใงใ—ใŸ', - 'invite.totalInvites': '็ดฏ็ฉๆ‹›ๅพ…็Šถ', - 'invite.totalReward': '็ดฏ่จˆๅ ฑ้…ฌ', - 'invite.rules': 'ๆ‹›ๅพ…ใƒซใƒผใƒซ', - 'invite.rule1': 'ๅ‹้”ใฎ็™ป้ŒฒใซๆˆๅŠŸใ™ใ‚‹ใŸใณใซใ€ๅ ฑ้…ฌใ‚’ๅ—ใ‘ๅ–ใ‚Šใพใ™', - 'invite.rule2': 'ๆ‹›ๅพ…ใ•ใ‚ŒใŸๅ‹้”ใŒๆœ€ๅˆใฎใƒˆใƒฉใƒณใ‚ถใ‚ฏใ‚ทใƒงใƒณใ‚’ๅฎŒไบ†ใ™ใ‚‹ใจใ€่ฟฝๅŠ ใฎๅ ฑ้…ฌใ‚’ๅ—ใ‘ๅ–ใ‚Šใพใ™', - 'invite.rule3': 'ๆ‹›ๅพ…็‰นๅ…ธใฏใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซ็›ดๆŽฅ้€ไฟกใ•ใ‚Œใพใ™', - 'invite.inviteList': 'ๆ‹›ๅพ…ใƒชใ‚นใƒˆ', - 'invite.tasks': 'ใƒŸใƒƒใ‚ทใƒงใƒณใ‚ปใƒณใ‚ฟใƒผ', - 'invite.inviteeName': 'ๆ‹›ๅพ…่€…', - 'invite.inviteTime': 'ๆ‹›ๅพ…ๆ™‚้–“', - 'invite.status': 'ใ‚นใƒ†ใƒผใ‚ฟใ‚น', - 'invite.reward': 'ๅ ฑ้…ฌ', - 'invite.active': 'ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ใช', - 'invite.inactive': 'ใ‚ขใ‚ฏใƒ†ใ‚ฃใƒ–ๅŒ–ใ•ใ‚Œใฆใ„ใพใ›ใ‚“', - 'invite.completed': 'ๅฎŒไบ†', - 'invite.claimed': 'ๅ—ใ‘ๅ–ใ‚Šใพใ—ใŸ', - 'invite.pending': 'ๅฎŒๆˆไบˆๅฎš', - 'invite.goToTask': 'ๅฎŒไบ†ใ™ใ‚‹', - 'invite.claimReward': 'ๅ ฑ้…ฌใ‚’่ซ‹ๆฑ‚ใ™ใ‚‹', - 'invite.verify': 'ๆคœ่จผๅฎŒไบ†', - 'invite.verifySuccess': 'ๆคœ่จผๆˆๅŠŸ๏ผใ‚ฟใ‚นใ‚ฏใŒๅฎŒไบ†ใ—ใพใ—ใŸ', - 'invite.verifyNotCompleted': 'ใ‚ฟใ‚นใ‚ฏใฏใพใ ๅฎŒไบ†ใ—ใฆใ„ใพใ›ใ‚“ใ€‚ ๆœ€ๅˆใซใ‚ฟใ‚นใ‚ฏใ‚’ๅฎŒไบ†ใ—ใฆใใ ใ•ใ„', - 'invite.verifyFailed': 'ๆคœ่จผใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ๅพŒใงใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„', - 'invite.claimSuccess': '{reward} QDT ใ‚’ๆญฃๅธธใซๅ—ใ‘ๅ–ใ‚Šใพใ—ใŸ!', - 'invite.claimFailed': 'ๅŽ้›†ใซๅคฑๆ•—ใ—ใพใ—ใŸใ€‚ ๅพŒใงใ‚‚ใ†ไธ€ๅบฆใŠ่ฉฆใ—ใใ ใ•ใ„', - 'invite.totalRecords': 'ๅˆ่จˆ {total} ใƒฌใ‚ณใƒผใƒ‰', - 'invite.task.twitter.title': 'X๏ผˆTwitter๏ผ‰ใซใƒชใƒ„ใ‚คใƒผใƒˆ', - 'invite.task.twitter.desc': 'ๅ…ฌๅผใƒ„ใ‚คใƒผใƒˆใ‚’ X (Twitter) ใ‚ขใ‚ซใ‚ฆใƒณใƒˆใซๅ…ฑๆœ‰ใ—ใพใ™', - 'invite.task.youtube.title': 'YouTube ใƒใƒฃใƒณใƒใƒซใ‚’ใƒ•ใ‚ฉใƒญใƒผใ—ใฆใใ ใ•ใ„', - 'invite.task.youtube.desc': 'ๅ…ฌๅผ YouTube ใƒใƒฃใƒณใƒใƒซใ‚’่ณผ่ชญใ—ใฆใƒ•ใ‚ฉใƒญใƒผใ—ใฆใใ ใ•ใ„', - 'invite.task.telegram.title': 'ใƒ†ใƒฌใ‚ฐใƒฉใƒ ใ‚ฐใƒซใƒผใƒ—ใซๅ‚ๅŠ ใ™ใ‚‹', - 'invite.task.telegram.desc': 'ๅ…ฌๅผ Telegram ใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃ ใ‚ฐใƒซใƒผใƒ—ใซๅ‚ๅŠ ใ—ใฆใใ ใ•ใ„', - 'invite.task.discord.title': 'Discordใ‚ตใƒผใƒใƒผใซๅ‚ๅŠ ใ™ใ‚‹', - 'invite.task.discord.desc': 'Discordใ‚ณใƒŸใƒฅใƒ‹ใƒ†ใ‚ฃใ‚ตใƒผใƒใƒผใซๅ‚ๅŠ ใ—ใฆใใ ใ•ใ„', - 'message': '-', - 'layouts.usermenu.dialog.title': 'ๆƒ…ๅ ฑ', - 'layouts.usermenu.dialog.content': 'ใƒญใ‚ฐใ‚ขใ‚ฆใƒˆใ—ใฆใ‚‚ใ‚ˆใ‚ใ—ใ„ใงใ™ใ‹?', - 'layouts.userLayout.title': 'ไธ็ขบๅฎŸๆ€งใฎไธญใง็œŸๅฎŸใ‚’่ฆ‹ใคใ‘ใ‚‹', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell โ†’ open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': '่จ˜ๆ†ถ/ๅ็œ่จญๅฎš', - 'settings.group.reflection_worker': '่‡ชๅ‹•ๅ็œๆคœ่จผใƒฏใƒผใ‚ซใƒผ', - 'settings.field.ENABLE_AGENT_MEMORY': 'ใ‚จใƒผใ‚ธใ‚งใƒณใƒˆ่จ˜ๆ†ถใ‚’ๆœ‰ๅŠนๅŒ–', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'ใƒ™ใ‚ฏใƒˆใƒซๆคœ็ดขใ‚’ๆœ‰ๅŠนๅŒ–๏ผˆใƒญใƒผใ‚ซใƒซ๏ผ‰', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'ๅŸ‹ใ‚่พผใฟๆฌกๅ…ƒ', - 'settings.field.AGENT_MEMORY_TOP_K': 'Top-K ๅ–ๅพ—ๆ•ฐ', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'ๅ€™่ฃœใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใ‚ตใ‚คใ‚บ', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'ๆ™‚้–“ๆธ›่กฐใฎๅŠๆธ›ๆœŸ๏ผˆๆ—ฅ๏ผ‰', - 'settings.field.AGENT_MEMORY_W_SIM': '้กžไผผๅบฆ้‡ใฟ', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'ๆ–ฐใ—ใ•้‡ใฟ', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'ๅŽ็›Š้‡ใฟ', - 'settings.field.ENABLE_REFLECTION_WORKER': '่‡ชๅ‹•ๆคœ่จผใ‚’ๆœ‰ๅŠนๅŒ–', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'ๆคœ่จผ้–“้š”๏ผˆ็ง’๏ผ‰', - - // Profile - Notification Settings (้€š็Ÿฅ่จญๅฎš) - 'profile.notifications.title': '้€š็Ÿฅ่จญๅฎš', - 'profile.notifications.hint': 'ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฎ้€š็Ÿฅๆ–นๆณ•ใ‚’่จญๅฎšใ—ใพใ™ใ€‚่ณ‡็”ฃใƒขใƒ‹ใ‚ฟใƒผใ‚„ใ‚ขใƒฉใƒผใƒˆไฝœๆˆๆ™‚ใซ่‡ชๅ‹•็š„ใซไฝฟ็”จใ•ใ‚Œใพใ™', - 'profile.notifications.defaultChannels': 'ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆ้€š็Ÿฅใƒใƒฃใƒณใƒใƒซ', - 'profile.notifications.browser': 'ใ‚ขใƒ—ใƒชๅ†…้€š็Ÿฅ', - 'profile.notifications.email': 'ใƒกใƒผใƒซ', - 'profile.notifications.phone': 'SMS', - 'profile.notifications.telegramBotToken': 'Telegram Bot Token', - 'profile.notifications.telegramBotTokenPlaceholder': 'Telegram Bot Tokenใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'profile.notifications.telegramBotTokenHint': '@BotFatherใงใƒœใƒƒใƒˆใ‚’ไฝœๆˆใ—ใฆTokenใ‚’ๅ–ๅพ—ใ—ใฆใใ ใ•ใ„', - 'profile.notifications.telegramChatId': 'Telegram Chat ID', - 'profile.notifications.telegramPlaceholder': 'Telegram Chat IDใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผˆไพ‹๏ผš123456789๏ผ‰', - 'profile.notifications.telegramHint': '@userinfobot ใซ /start ใ‚’้€ไฟกใ—ใฆChat IDใ‚’ๅ–ๅพ—ใ—ใฆใใ ใ•ใ„', - 'profile.notifications.notifyEmail': '้€š็Ÿฅใƒกใƒผใƒซ', - 'profile.notifications.emailPlaceholder': '้€š็Ÿฅใ‚’ๅ—ใ‘ๅ–ใ‚‹ใƒกใƒผใƒซใ‚ขใƒ‰ใƒฌใ‚น', - 'profile.notifications.emailHint': 'ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใฏใ‚ขใ‚ซใ‚ฆใƒณใƒˆใƒกใƒผใƒซใ€ๅˆฅใฎใƒกใƒผใƒซใ‚‚่จญๅฎšๅฏ่ƒฝ', - 'profile.notifications.phonePlaceholder': '้›ป่ฉฑ็•ชๅทใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„๏ผˆไพ‹๏ผš+81901234567๏ผ‰', - 'profile.notifications.phoneHint': '็ฎก็†่€…ใŒTwilioใ‚ตใƒผใƒ“ใ‚นใ‚’่จญๅฎšใ™ใ‚‹ๅฟ…่ฆใŒใ‚ใ‚Šใพใ™', - 'profile.notifications.discordWebhook': 'Discord Webhook', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'Discordใ‚ตใƒผใƒใƒผ่จญๅฎšใงWebhookใ‚’ไฝœๆˆใ—ใฆใใ ใ•ใ„', - 'profile.notifications.webhookUrl': 'Webhook URL', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': 'ใ‚ซใ‚นใ‚ฟใƒ Webhook URLใ€POST JSONใง้€š็Ÿฅใ‚’้€ไฟก', - 'profile.notifications.webhookToken': 'Webhook Token๏ผˆไปปๆ„๏ผ‰', - 'profile.notifications.webhookTokenPlaceholder': 'ใƒชใ‚ฏใ‚จใ‚นใƒˆ่ช่จผ็”จBearer Token', - 'profile.notifications.webhookTokenHint': 'Authorization: Bearer Tokenใจใ—ใฆWebhookใซ้€ไฟก', - 'profile.notifications.testBtn': 'ใƒ†ใ‚นใƒˆ้€š็Ÿฅใ‚’้€ไฟก', - 'profile.notifications.saveSuccess': '้€š็Ÿฅ่จญๅฎšใ‚’ไฟๅญ˜ใ—ใพใ—ใŸ', - 'profile.notifications.selectChannel': 'ๅฐ‘ใชใใจใ‚‚1ใคใฎ้€š็Ÿฅใƒใƒฃใƒณใƒใƒซใ‚’้ธๆŠžใ—ใฆใใ ใ•ใ„', - 'profile.notifications.fillTelegramToken': 'Telegram Bot Tokenใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'profile.notifications.fillTelegram': 'Telegram Chat IDใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'profile.notifications.fillEmail': '้€š็Ÿฅใƒกใƒผใƒซใ‚’ๅ…ฅๅŠ›ใ—ใฆใใ ใ•ใ„', - 'profile.notifications.testSent': 'ใƒ†ใ‚นใƒˆ้€š็Ÿฅใ‚’้€ไฟกใ—ใพใ—ใŸใ€‚้€š็Ÿฅใƒใƒฃใƒณใƒใƒซใ‚’็ขบ่ชใ—ใฆใใ ใ•ใ„' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/ko-KR.js b/quantdinger_vue/src/locales/lang/ko-KR.js deleted file mode 100644 index 9b01e7d..0000000 --- a/quantdinger_vue/src/locales/lang/ko-KR.js +++ /dev/null @@ -1,1826 +0,0 @@ -import antdKoKR from 'ant-design-vue/es/locale-provider/ko_KR' -import momentKO from 'moment/locale/ko' - -const components = { - antLocale: antdKoKR, - momentName: 'ko', - momentLocale: momentKO -} -const locale = { - 'submit': '์ œ์ถœ', - 'save': '์ €์žฅ', - 'submit.ok': '์ œ์ถœ ์„ฑ๊ณต', - 'save.ok': '์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'menu.welcome': 'ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค', - 'menu.home': 'ํ™ˆํŽ˜์ด์ง€', - 'menu.dashboard': '๋Œ€์‹œ๋ณด๋“œ', - 'menu.dashboard.indicator': '์ง€ํ‘œ๋ถ„์„', - 'menu.dashboard.community': '์ง€ํ‘œ ์ปค๋ฎค๋‹ˆํ‹ฐ', - 'menu.dashboard.analysis': 'AI ๋ถ„์„', - 'menu.dashboard.tradingAssistant': 'ํŠธ๋ ˆ์ด๋”ฉ ์–ด์‹œ์Šคํ„ดํŠธ', - 'menu.dashboard.aiTradingAssistant': 'AI ํŠธ๋ ˆ์ด๋”ฉ ๋„์šฐ๋ฏธ', - 'menu.dashboard.signalRobot': '์‹œ๊ทธ๋„ ๋กœ๋ด‡', - 'menu.dashboard.monitor': '๋ชจ๋‹ˆํ„ฐ๋ง ํŽ˜์ด์ง€', - 'menu.dashboard.workplace': '์ž‘์—…๋Œ€', - 'menu.form': '์–‘์‹ ํŽ˜์ด์ง€', - 'menu.form.basic-form': '๊ธฐ๋ณธ ํ˜•ํƒœ', - 'menu.form.step-form': '๋‹จ๊ณ„๋ณ„ ์–‘์‹', - 'menu.form.step-form.info': '๋‹จ๊ณ„๋ณ„ ์–‘์‹(์ด์ฒด ์ •๋ณด ์ž…๋ ฅ)', - 'menu.form.step-form.confirm': '๋‹จ๊ณ„๋ณ„ ์–‘์‹(์ด์ฒด์ •๋ณด ํ™•์ธ)', - 'menu.form.step-form.result': '๋‹จ๊ณ„๋ณ„ ์–‘์‹(์™„๋ฃŒ)', - 'menu.form.advanced-form': '๊ณ ๊ธ‰ ์–‘์‹', - 'menu.list': '๋ชฉ๋ก ํŽ˜์ด์ง€', - 'menu.list.table-list': '๋ฌธ์˜ ์–‘์‹', - 'menu.list.basic-list': 'ํ‘œ์ค€ ๋ชฉ๋ก', - 'menu.list.card-list': '์นด๋“œ ๋ชฉ๋ก', - 'menu.list.search-list': '๊ฒ€์ƒ‰ ๋ชฉ๋ก', - 'menu.list.search-list.articles': '๊ฒ€์ƒ‰ ๋ชฉ๋ก(๊ธฐ์‚ฌ)', - 'menu.list.search-list.projects': '๊ฒ€์ƒ‰ ๋ชฉ๋ก(ํ”„๋กœ์ ํŠธ)', - 'menu.list.search-list.applications': '๊ฒ€์ƒ‰ ๋ชฉ๋ก(์•ฑ)', - 'menu.profile': '์„ธ๋ถ€์ •๋ณด ํŽ˜์ด์ง€', - 'menu.profile.basic': '๊ธฐ๋ณธ ์„ธ๋ถ€์ •๋ณด ํŽ˜์ด์ง€', - 'menu.profile.advanced': '๊ณ ๊ธ‰ ์„ธ๋ถ€์ •๋ณด ํŽ˜์ด์ง€', - 'menu.result': '๊ฒฐ๊ณผ ํŽ˜์ด์ง€', - 'menu.result.success': '์„ฑ๊ณต ํŽ˜์ด์ง€', - 'menu.result.fail': '์‹คํŒจ ํŽ˜์ด์ง€', - 'menu.exception': '์˜ˆ์™ธ ํŽ˜์ด์ง€', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'ํŠธ๋ฆฌ๊ฑฐ ์˜ค๋ฅ˜', - 'menu.account': '๊ฐœ์ธ ํŽ˜์ด์ง€', - 'menu.account.center': '๊ฐœ์ธ ์„ผํ„ฐ', - 'menu.account.settings': '๊ฐœ์ธ ์„ค์ •', - 'menu.account.trigger': 'ํŠธ๋ฆฌ๊ฑฐ ์˜ค๋ฅ˜', - 'menu.account.logout': '๋กœ๊ทธ์•„์›ƒ', - 'menu.wallet': '๋‚ด ์ง€๊ฐ‘', - 'menu.docs': '๋ฌธ์„œ ์„ผํ„ฐ', - 'menu.docs.detail': '๋ฌธ์„œ ์„ธ๋ถ€์ •๋ณด', - 'menu.header.refreshPage': 'ํŽ˜์ด์ง€ ์ƒˆ๋กœ ๊ณ ์นจ', - 'menu.invite.friends': '์นœ๊ตฌ ์ดˆ๋Œ€', - 'app.setting.pagestyle': '์ „๋ฐ˜์ ์ธ ์Šคํƒ€์ผ ์„ค์ •', - 'app.setting.pagestyle.light': '๋ฐ์€ ๋ฉ”๋‰ด ์Šคํƒ€์ผ', - 'app.setting.pagestyle.dark': '์–ด๋‘์šด ๋ฉ”๋‰ด ์Šคํƒ€์ผ', - 'app.setting.pagestyle.realdark': '๋‹คํฌ ๋ชจ๋“œ', - 'app.setting.themecolor': 'ํ…Œ๋งˆ ์ƒ‰์ƒ', - 'app.setting.navigationmode': 'ํƒ์ƒ‰ ๋ชจ๋“œ', - 'app.setting.sidemenu.nav': '์‚ฌ์ด๋“œ๋ฐ” ํƒ์ƒ‰', - 'app.setting.topmenu.nav': '์ƒ๋‹จ ํ‘œ์‹œ์ค„ ํƒ์ƒ‰', - 'app.setting.content-width': '์ฝ˜ํ…์ธ  ์˜์—ญ ๋„ˆ๋น„', - 'app.setting.content-width.tooltip': '์ด ์„ค์ •์€ [์ƒ๋‹จ ํ‘œ์‹œ์ค„ ํƒ์ƒ‰]์ธ ๊ฒฝ์šฐ์—๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.', - 'app.setting.content-width.fixed': '๊ณ ์ •', - 'app.setting.content-width.fluid': '์ŠคํŠธ๋ฆฌ๋ฐ', - 'app.setting.fixedheader': '๊ณ ์ • ํ—ค๋”', - 'app.setting.fixedheader.tooltip': 'ํ—ค๋” ๊ณ ์ • ์‹œ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ', - 'app.setting.autoHideHeader': '์Šคํฌ๋กคํ•  ๋•Œ ํ—ค๋” ์ˆจ๊ธฐ๊ธฐ', - 'app.setting.fixedsidebar': '์‚ฌ์ด๋“œ ๋ฉ”๋‰ด ๊ณ ์ •', - 'app.setting.sidemenu': '์‚ฌ์ด๋“œ ๋ฉ”๋‰ด ๋ ˆ์ด์•„์›ƒ', - 'app.setting.topmenu': '์ƒ๋‹จ ๋ฉ”๋‰ด ๋ ˆ์ด์•„์›ƒ', - 'app.setting.othersettings': '๊ธฐํƒ€ ์„ค์ •', - 'app.setting.weakmode': '์ƒ‰์•ฝ ๋ชจ๋“œ', - 'app.setting.multitab': '๋ฉ€ํ‹ฐํƒญ ๋ชจ๋“œ', - 'app.setting.copy': '์„ค์ • ๋ณต์‚ฌ', - 'app.setting.loading': 'ํ…Œ๋งˆ ๋กœ๋“œ ์ค‘', - 'app.setting.copyinfo': '์„ค์ •์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. src/config/defaultSettings.js', - 'app.setting.copy.success': '๋ณต์‚ฌ ์™„๋ฃŒ', - 'app.setting.copy.fail': '๋ณต์‚ฌ ์‹คํŒจ', - 'app.setting.theme.switching': 'ํ…Œ๋งˆ ๋ณ€๊ฒฝ!', - 'app.setting.production.hint': '๊ตฌ์„ฑ ํ‘œ์‹œ์ค„์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์—๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜๊ณ  ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค.', - 'app.setting.themecolor.daybreak': '์ƒˆ๋ฒฝ ํŒŒ๋ž€์ƒ‰(๊ธฐ๋ณธ๊ฐ’)', - 'app.setting.themecolor.dust': 'ํ™ฉํ˜ผ', - 'app.setting.themecolor.volcano': 'ํ™”์‚ฐ', - 'app.setting.themecolor.sunset': '์ผ๋ชฐ', - 'app.setting.themecolor.cyan': '๋ฐ์นญ', - 'app.setting.themecolor.green': '์˜ค๋กœ๋ผ ๊ทธ๋ฆฐ', - 'app.setting.themecolor.geekblue': '๊ธฑ ๋ธ”๋ฃจ', - 'app.setting.themecolor.purple': '์žฅ์ฏ”(Jiang Zi)', - 'app.setting.tooltip': 'ํŽ˜์ด์ง€ ์„ค์ •', - 'user.login.userName': '์‚ฌ์šฉ์ž ์ด๋ฆ„', - 'user.login.password': '๋น„๋ฐ€๋ฒˆํ˜ธ', - 'user.login.username.placeholder': '๊ณ„์ •: ๊ด€๋ฆฌ์ž', - 'user.login.password.placeholder': '๋น„๋ฐ€๋ฒˆํ˜ธ: admin ๋˜๋Š” ant.design', - 'user.login.message-invalid-credentials': '๋กœ๊ทธ์ธ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ๊ณผ ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.', - 'user.login.message-invalid-verification-code': '์ธ์ฆ์ฝ”๋“œ ์˜ค๋ฅ˜', - 'user.login.tab-login-credentials': '๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ', - 'user.login.tab-login-email': '์ด๋ฉ”์ผ ๋กœ๊ทธ์ธ', - 'user.login.tab-login-mobile': 'ํœด๋Œ€ํฐ๋ฒˆํ˜ธ ๋กœ๊ทธ์ธ', - 'user.login.captcha.placeholder': '๊ทธ๋ž˜ํ”ฝ ์ธ์ฆ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'user.login.mobile.placeholder': 'ํœด๋Œ€์ „ํ™”๋ฒˆํ˜ธ', - 'user.login.mobile.verification-code.placeholder': '์ธ์ฆ์ฝ”๋“œ', - 'user.login.email.placeholder': '์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'user.login.email.verification-code.placeholder': '์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'user.login.email.sending': '์ธ์ฆ์ฝ”๋“œ๊ฐ€ ์ „์†ก๋˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค...', - 'user.login.email.send-success-title': 'ํŒ', - 'user.login.email.send-success': '์ธ์ฆ์ฝ”๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฉ”์ผ์„ ํ™•์ธํ•ด ์ฃผ์„ธ์š”.', - 'user.login.sms.send-success': '์ธ์ฆ๋ฒˆํ˜ธ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž ๋ฉ”์‹œ์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”.', - 'user.login.remember-me': '์ž๋™ ๋กœ๊ทธ์ธ', - 'user.login.forgot-password': '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žŠ์œผ์…จ๋‚˜์š”?', - 'user.login.sign-in-with': '๊ธฐํƒ€ ๋กœ๊ทธ์ธ ๋ฐฉ๋ฒ•', - 'user.login.signup': '๊ณ„์ • ๋“ฑ๋ก', - 'user.login.login': '๋กœ๊ทธ์ธ', - 'user.register.register': '๋“ฑ๋ก', - 'user.register.email.placeholder': '์ด๋ฉ”์ผ', - 'user.register.password.placeholder': '6์ž ์ด์ƒ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. ์‰ฝ๊ฒŒ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.', - 'user.register.password.popover-message': '6์ž ์ด์ƒ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. ์‰ฝ๊ฒŒ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.', - 'user.register.confirm-password.placeholder': '๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ', - 'user.register.get-verification-code': '์ธ์ฆ ์ฝ”๋“œ ๋ฐ›๊ธฐ', - 'user.register.sign-in': '๊ธฐ์กด ๊ณ„์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ', - 'user.register-result.msg': '๊ท€ํ•˜์˜ ๊ณ„์ •: {email} ๋“ฑ๋ก์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'user.register-result.activation-email': 'ํ™œ์„ฑํ™” ์ด๋ฉ”์ผ์ด ๊ท€ํ•˜์˜ ์‚ฌ์„œํ•จ์œผ๋กœ ์ „์†ก๋˜์—ˆ์œผ๋ฉฐ 24์‹œ๊ฐ„ ๋™์•ˆ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ์ด๋ฉ”์ผ์— ์ฆ‰์‹œ ๋กœ๊ทธ์ธํ•˜๊ณ  ์ด๋ฉ”์ผ์— ์žˆ๋Š” ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ๊ณ„์ •์„ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค.', - 'user.register-result.back-home': 'ํ™ˆํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ€๊ธฐ', - 'user.register-result.view-mailbox': '์šฐํŽธํ•จ์„ ํ™•์ธํ•˜์„ธ์š”', - 'user.email.required': '์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'user.email.wrong-format': '์ด๋ฉ”์ผ ์ฃผ์†Œ ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค!', - 'user.userName.required': '๊ณ„์ • ์ด๋ฆ„์ด๋‚˜ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'user.password.required': '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'user.password.twice.msg': '๋‘ ๋ฒˆ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!', - 'user.password.strength.msg': '๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.', - 'user.password.strength.strong': 'ํž˜: ๊ฐ•ํ•œ', - 'user.password.strength.medium': '๊ฐ•๋„: ์ค‘๊ฐ„', - 'user.password.strength.low': '๊ฐ•๋„: ๋‚ฎ์Œ', - 'user.password.strength.short': '๊ฐ•๋„: ๋„ˆ๋ฌด ์งง์Œ', - 'user.confirm-password.required': '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ด ์ฃผ์„ธ์š”!', - 'user.phone-number.required': '์ •ํ™•ํ•œ ํœด๋Œ€ํฐ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'user.phone-number.wrong-format': 'ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค!', - 'user.verification-code.required': '์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'user.captcha.required': '๊ทธ๋ž˜ํ”ฝ ์ธ์ฆ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'user.login.infos': 'QuantDinger๋Š” AI ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ์ฃผ์‹ ๋ถ„์„ ๋ณด์กฐ ๋„๊ตฌ๋กœ ์ฆ๊ถŒ ํˆฌ์ž ์ปจ์„คํŒ… ์ž๊ฒฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ๋‚ด ๋ชจ๋“  ๋ถ„์„ ๊ฒฐ๊ณผ, ์ ์ˆ˜, ์ฐธ๊ณ  ์˜๊ฒฌ์€ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ AI์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ํ•™์Šต, ์—ฐ๊ตฌ ๋ฐ ๊ธฐ์ˆ  ๊ต๋ฅ˜์—๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ํˆฌ์ž ์กฐ์–ธ์ด๋‚˜ ์˜์‚ฌ ๊ฒฐ์ • ๊ธฐ๋ฐ˜์„ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์‹ํˆฌ์ž์—๋Š” ์‹œ์žฅ๋ฆฌ์Šคํฌ, ์œ ๋™์„ฑ๋ฆฌ์Šคํฌ, ์ •์ฑ…๋ฆฌ์Šคํฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฆฌ์Šคํฌ๊ฐ€ ์ˆ˜๋ฐ˜๋˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ์›๊ธˆ ์†์‹ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ์œ„ํ—˜ ํ—ˆ์šฉ ๋ฒ”์œ„์— ๋”ฐ๋ผ ๋…๋ฆฝ์ ์ธ ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผ ํ•˜๋ฉฐ, ์ด ๋„๊ตฌ์˜ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ํˆฌ์ž ํ–‰์œ„ ๋ฐ ๊ฒฐ๊ณผ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ€๋‹ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์žฅ์€ ์œ„ํ—˜ํ•˜๋ฏ€๋กœ ํˆฌ์ž์— ์‹ ์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.', - 'user.login.tab-login-web3': 'Web3 ๋กœ๊ทธ์ธ', - 'user.login.web3.tip': '์ง€๊ฐ‘์„ ์ด์šฉํ•œ ์„œ๋ช… ๋กœ๊ทธ์ธ', - 'user.login.web3.connect': '์ง€๊ฐ‘์„ ์—ฐ๊ฒฐํ•˜๊ณ  ๋กœ๊ทธ์ธํ•˜์„ธ์š”', - 'user.login.web3.no-wallet': '์ง€๊ฐ‘์ด ๊ฐ์ง€๋˜์ง€ ์•Š์Œ', - 'user.login.web3.no-address': '์ง€๊ฐ‘ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'user.login.web3.nonce-failed': '๋‚œ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'user.login.web3.verify-failed': '์„œ๋ช… ํ™•์ธ ์‹คํŒจ', - 'user.login.web3.success': '๋กœ๊ทธ์ธ ์„ฑ๊ณต', - 'user.login.web3.failed': '์ง€๊ฐ‘ ๋กœ๊ทธ์ธ ์‹คํŒจ', - 'nav.no_wallet': '์ง€๊ฐ‘์ด ๊ฐ์ง€๋˜์ง€ ์•Š์Œ', - 'nav.copy': '๋ณต์‚ฌ', - 'nav.copy_success': '์„ฑ๊ณต์ ์œผ๋กœ ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'user.login.oauth.google': 'Google๋กœ ๋กœ๊ทธ์ธ', - 'user.login.oauth.github': 'GitHub๋กœ ๋กœ๊ทธ์ธ', - 'user.login.oauth.loading': '์Šน์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋””๋ ‰์…˜ ์ค‘...', - 'user.login.oauth.failed': 'OAuth ๋กœ๊ทธ์ธ ์‹คํŒจ', - 'user.login.oauth.get-url-failed': '์Šน์ธ ๋งํฌ๋ฅผ ์–ป์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'user.login.subtitle': '๊ธ€๋กœ๋ฒŒ ์‹œ์žฅ์— ๋Œ€ํ•œ ์ •๋Ÿ‰์  ํ†ต์ฐฐ๋ ฅ ํ™•๋ณด', - 'user.login.legal.title': '๋ฒ•์  ๊ณ ์ง€ ์‚ฌํ•ญ', - 'user.login.legal.view': '๋ฒ•์  ๊ณ ์ง€์‚ฌํ•ญ ๋ณด๊ธฐ', - 'user.login.legal.collapse': '๋ฒ•์  ๋ฉด์ฑ…์กฐํ•ญ ์ ‘๊ธฐ', - 'user.login.legal.agree': '๋ฒ•์  ๊ณ ์ง€ ์‚ฌํ•ญ์„ ์ฝ์—ˆ์œผ๋ฉฐ ์ด์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.', - 'user.login.legal.required': '๋จผ์ € ๋ฒ•์  ๊ณ ์ง€ ์‚ฌํ•ญ์„ ์ฝ๊ณ  ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.', - 'user.login.legal.content': 'QuantDinger๋Š” AI ๋ฉ€ํ‹ฐ์—์ด์ „ํŠธ ์ฃผ์‹ ๋ถ„์„ ๋ณด์กฐ ๋„๊ตฌ๋กœ ์ฆ๊ถŒ ํˆฌ์ž ์ปจ์„คํŒ… ์ž๊ฒฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ ๋‚ด ๋ชจ๋“  ๋ถ„์„ ๊ฒฐ๊ณผ, ๋“ฑ๊ธ‰, ์ฐธ๊ณ  ์˜๊ฒฌ์€ ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ AI์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ ํ•™์Šต, ์—ฐ๊ตฌ ๋ฐ ๊ธฐ์ˆ  ๊ต๋ฅ˜์—๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ ํˆฌ์ž ์กฐ์–ธ์ด๋‚˜ ์˜์‚ฌ ๊ฒฐ์ • ๊ธฐ๋ฐ˜์„ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฃผ์‹ํˆฌ์ž์—๋Š” ์‹œ์žฅ๋ฆฌ์Šคํฌ, ์œ ๋™์„ฑ๋ฆฌ์Šคํฌ, ์ •์ฑ…๋ฆฌ์Šคํฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฆฌ์Šคํฌ๊ฐ€ ์ˆ˜๋ฐ˜๋˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ์›๊ธˆ ์†์‹ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ์œ„ํ—˜ ํ—ˆ์šฉ ๋ฒ”์œ„์— ๋”ฐ๋ผ ๋…๋ฆฝ์ ์ธ ๊ฒฐ์ •์„ ๋‚ด๋ ค์•ผ ํ•˜๋ฉฐ, ์ด ๋„๊ตฌ์˜ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ํˆฌ์ž ํ–‰์œ„ ๋ฐ ๊ฒฐ๊ณผ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ถ€๋‹ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์žฅ์€ ์œ„ํ—˜ํ•˜๋ฏ€๋กœ ํˆฌ์ž์— ์‹ ์ค‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.', - 'user.login.privacy.title': '์‚ฌ์šฉ์ž ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…', - 'user.login.privacy.view': '์‚ฌ์šฉ์ž ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ… ๋ณด๊ธฐ', - 'user.login.privacy.collapse': '์‚ฌ์šฉ์ž ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ ์•ฝ๊ด€ ๋‹ซ๊ธฐ', - 'user.login.privacy.content': '์šฐ๋ฆฌ๋Š” ๊ท€ํ•˜์˜ ๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ์™€ ๋ฐ์ดํ„ฐ ๋ณดํ˜ธ๋ฅผ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. 1) ์ˆ˜์ง‘ ๋ฒ”์œ„ : ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ๊ผญ ํ•„์š”ํ•œ ์ •๋ณด(์ด๋ฉ”์ผ, ํœด๋Œ€์ „ํ™”๋ฒˆํ˜ธ, ์ง€์—ญ๋ฒˆํ˜ธ, Web3 ์ง€๊ฐ‘ ์ฃผ์†Œ ๋“ฑ)์™€ ํ•„์ˆ˜ ๋กœ๊ทธ, ๊ธฐ๊ธฐ์ •๋ณด๋งŒ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. 2) ์ด์šฉ ๋ชฉ์ : ๊ณ„์ • ๋กœ๊ทธ์ธ ๋ฐ ๋ณด์•ˆ ํ™•์ธ, ์„œ๋น„์Šค ๊ธฐ๋Šฅ ์ œ๊ณต, ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ๊ทœ์ • ์ค€์ˆ˜ ์š”๊ตฌ ์‚ฌํ•ญ. 3) ์ €์žฅ ๋ฐ ๋ณด์•ˆ: ๋ฐ์ดํ„ฐ๋Š” ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋˜๋ฉฐ, ๋ฌด๋‹จ ์ ‘๊ทผ, ๊ณต๊ฐœ ๋˜๋Š” ์†์‹ค์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ถŒํ•œ ๋ฐ ์ ‘๊ทผ ์ œ์–ด ์กฐ์น˜๊ฐ€ ์ทจํ•ด์ง‘๋‹ˆ๋‹ค. 4) ์ œ3์ž์™€์˜ ๊ณต์œ : ๋ฒ•๋ฅ  ๋ฐ ๊ทœ์ •์— ์˜ํ•ด ์š”๊ตฌ๋˜๊ฑฐ๋‚˜ ์„œ๋น„์Šค ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ , ๊ท€ํ•˜์˜ ๊ฐœ์ธ์ •๋ณด๋Š” ์ œ3์ž์™€ ๊ณต์œ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ3์ž ์„œ๋น„์Šค(์˜ˆ: ์ง€๊ฐ‘, SMS ์„œ๋น„์Šค ์ œ๊ณต์—…์ฒด)๊ฐ€ ๊ด€๋ จ๋œ ๊ฒฝ์šฐ ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋ฒ”์œ„์—์„œ๋งŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. 5) ์ฟ ํ‚ค/๋กœ์ปฌ ์ €์žฅ์†Œ: ๋กœ๊ทธ์ธ ์ƒํƒœ ๋ฐ ํ•„์š”ํ•œ ์„ธ์…˜ ์œ ์ง€ ๊ด€๋ฆฌ(์˜ˆ: ํ† ํฐ, PHPSESSID)์— ์‚ฌ์šฉ๋˜๋ฉฐ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 6) ๊ฐœ์ธ๊ถŒ๋ฆฌ : ๊ท€ํ•˜๋Š” ๋ฒ•๋ น์— ๋”ฐ๋ฅธ ์กฐํšŒ, ์ •์ •, ์‚ญ์ œ, ๋™์˜์ฒ ํšŒ ๋“ฑ์˜ ๊ถŒ๋ฆฌ๋ฅผ ํ–‰์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 7) ๋ณ€๊ฒฝ ๋ฐ ๊ณต์ง€: ๋ณธ ์•ฝ๊ด€์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด ํŽ˜์ด์ง€์— ๋ˆˆ์— ๋„๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋ณธ ์„œ๋น„์Šค๋ฅผ ๊ณ„์† ์ด์šฉํ•˜์‹œ๋ฉด ์—…๋ฐ์ดํŠธ๋œ ๋‚ด์šฉ์„ ์ฝ๊ณ  ๋™์˜ํ•˜์‹  ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋ณธ ์•ฝ๊ด€ ๋˜๋Š” ๊ทธ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ์— ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์„œ๋น„์Šค ์‚ฌ์šฉ์„ ์ค‘๋‹จํ•˜๊ณ  ๋‹น์‚ฌ์— ๋ฌธ์˜ํ•˜์‹ญ์‹œ์˜ค.', - 'account.basicInfo': '๊ธฐ๋ณธ์ •๋ณด', - 'account.id': '์‚ฌ์šฉ์ž ID', - 'account.username': '์‚ฌ์šฉ์ž ์ด๋ฆ„', - 'account.nickname': '๋‹‰๋„ค์ž„', - 'account.email': '์ด๋ฉ”์ผ', - 'account.mobile': 'ํœด๋Œ€์ „ํ™”๋ฒˆํ˜ธ', - 'account.web3address': '์ง€๊ฐ‘ ์ฃผ์†Œ', - 'account.pid': '์ถ”์ฒœ์ธ ID', - 'account.level': '์‚ฌ์šฉ์ž ์ˆ˜์ค€', - 'account.money': '๊ท ํ˜•', - 'account.qdtBalance': 'QDT ์ž”์•ก', - 'account.score': 'ํฌ์ธํŠธ', - 'account.createtime': '๋“ฑ๋ก ์‹œ๊ฐ„', - 'account.inviteLink': '์ดˆ๋Œ€๋งํฌ', - 'account.recharge': '์žฌ์ถฉ์ „', - 'account.rechargeTip': '์ถฉ์ „ํ•˜๋ ค๋ฉด WeChat ๋˜๋Š” Alipay๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜ QR ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•˜์„ธ์š”.', - 'account.qrCodePlaceholder': 'QR ์ฝ”๋“œ ์ž๋ฆฌ ํ‘œ์‹œ์ž(์—๋ฎฌ๋ ˆ์ด์…˜)', - 'account.rechargeAmount': '์ถฉ์ „๊ธˆ์•ก', - 'account.enterAmount': '์ถฉ์ „๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'account.rechargeHint': '์ตœ์†Œ ์ž…๊ธˆ์•ก: 1 QDT', - 'account.confirmRecharge': '์ถฉ์ „ ํ™•์ธ', - 'account.enterValidAmount': '์œ ํšจํ•œ ์ถฉ์ „ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'account.rechargeSuccess': '์žฌ์ถฉ์ „ ์„ฑ๊ณต! {amount} QDT ์ž…๊ธˆ', - 'account.settings.menuMap.basic': '๊ธฐ๋ณธ ์„ค์ •', - 'account.settings.menuMap.security': '๋ณด์•ˆ ์„ค์ •', - 'account.settings.menuMap.notification': '์ƒˆ ๋ฉ”์‹œ์ง€ ์•Œ๋ฆผ', - 'account.settings.menuMap.moneyLog': '๊ธฐ๊ธˆ ์„ธ๋ถ€์ •๋ณด', - 'account.moneyLog.empty': '์•„์ง ํŽ€๋“œ ์„ธ๋ถ€์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'account.moneyLog.total': '์ด {total}๊ฐœ ๊ธฐ๋ก', - 'account.moneyLog.type.purchase': '๋งค์ˆ˜ ์ง€ํ‘œ', - 'account.moneyLog.type.recharge': '์žฌ์ถฉ์ „', - 'account.moneyLog.type.refund': 'ํ™˜๋ถˆ', - 'account.moneyLog.type.reward': '๋ณด์ƒ', - 'account.moneyLog.type.income': '์ง€ํ‘œ์†Œ๋“', - 'account.moneyLog.type.commission': 'ํ”Œ๋žซํผ ์ทจ๊ธ‰ ์ˆ˜์ˆ˜๋ฃŒ', - 'wallet.balance': 'QDT ์ž”์•ก', - 'wallet.recharge': '์žฌ์ถฉ์ „', - 'wallet.withdraw': 'ํ˜„๊ธˆ ์ธ์ถœ', - 'wallet.filter': 'ํ•„ํ„ฐ', - 'wallet.reset': '์žฌ์„ค์ •', - 'wallet.totalRecharge': '๋ˆ„์  ์ถฉ์ „', - 'wallet.totalWithdraw': '๋ˆ„์  ์ถœ๊ธˆ', - 'wallet.totalIncome': '๋ˆ„์  ์ˆ˜์ž…', - 'wallet.records': '๊ฑฐ๋ž˜๊ธฐ๋ก ๋ฐ ์ž๊ธˆ๋‚ด์—ญ', - 'wallet.tradingRecords': '๊ฑฐ๋ž˜ ๋‚ด์—ญ', - 'wallet.moneyLog': '๊ธฐ๊ธˆ ์„ธ๋ถ€์ •๋ณด', - 'wallet.rechargeTip': '์ถฉ์ „ํ•˜๋ ค๋ฉด WeChat ๋˜๋Š” Alipay๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜ QR ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•˜์„ธ์š”.', - 'wallet.qrCodePlaceholder': 'QR ์ฝ”๋“œ ์ž๋ฆฌ ํ‘œ์‹œ์ž(์—๋ฎฌ๋ ˆ์ด์…˜)', - 'wallet.rechargeAmount': '์ถฉ์ „๊ธˆ์•ก', - 'wallet.enterAmount': '์ถฉ์ „๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'wallet.rechargeHint': '์ตœ์†Œ ์ž…๊ธˆ์•ก: 1 QDT', - 'wallet.confirmRecharge': '์ถฉ์ „ ํ™•์ธ', - 'wallet.enterValidAmount': '์œ ํšจํ•œ ์ถฉ์ „ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'wallet.rechargeSuccess': '์žฌ์ถฉ์ „ ์„ฑ๊ณต! {amount} QDT ์ž…๊ธˆ', - 'wallet.rechargeFailed': '์žฌ์ถฉ์ „ ์‹คํŒจ', - 'wallet.withdrawTip': '์ถœ๊ธˆ๊ธˆ์•ก๊ณผ ์ถœ๊ธˆ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'wallet.withdrawAmount': '์ถœ๊ธˆ๊ธˆ์•ก', - 'wallet.enterWithdrawAmount': '์ถœ๊ธˆ๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'wallet.withdrawHint': '์ตœ์†Œ ์ถœ๊ธˆ ๊ธˆ์•ก: 1 QDT', - 'wallet.withdrawAddress': '์ถœ๊ธˆ์ฃผ์†Œ(์„ ํƒ)', - 'wallet.enterWithdrawAddress': '์ถœ๊ธˆ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'wallet.confirmWithdraw': '์ถœ๊ธˆ ํ™•์ธ', - 'wallet.enterValidWithdrawAmount': '์œ ํšจํ•œ ์ธ์ถœ ๊ธˆ์•ก์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'wallet.insufficientBalance': '์ž”์•ก ๋ถ€์กฑ', - 'wallet.withdrawSuccess': '์ถœ๊ธˆ ์„ฑ๊ณต! ์ธ์ถœ๋œ {๊ธˆ์•ก} QDT', - 'wallet.withdrawFailed': '์ถœ๊ธˆ ์‹คํŒจ', - 'wallet.noTradingRecords': '์•„์ง ๊ฑฐ๋ž˜๊ธฐ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค', - 'wallet.noMoneyLog': '์•„์ง ํŽ€๋“œ ์„ธ๋ถ€์ •๋ณด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'wallet.loadTradingRecordsFailed': '๊ฑฐ๋ž˜ ๊ธฐ๋ก์„ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'wallet.loadMoneyLogFailed': '์ž๊ธˆ ์„ธ๋ถ€์ •๋ณด๋ฅผ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'wallet.moneyLogTotal': '์ด {total}๊ฐœ ๊ธฐ๋ก', - 'wallet.moneyLogTypeTitle': '์œ ํ˜•', - 'wallet.moneyLogType.all': '๋ชจ๋“  ์œ ํ˜•', - 'wallet.table.time': '์‹œ๊ฐ„', - 'wallet.table.type': '์œ ํ˜•', - 'wallet.table.price': '๊ฐ€๊ฒฉ', - 'wallet.table.amount': '์ˆ˜๋Ÿ‰', - 'wallet.table.money': '๊ธˆ์•ก', - 'wallet.table.balance': '๊ท ํ˜•', - 'wallet.table.memo': '๋น„๊ณ ', - 'wallet.table.value': '๊ฐ€์น˜', - 'wallet.table.profit': '์ด์ต๊ณผ ์†์‹ค', - 'wallet.table.commission': '์ทจ๊ธ‰ ์ˆ˜์ˆ˜๋ฃŒ', - 'wallet.table.total': '์ด {total}๊ฐœ ๊ธฐ๋ก', - 'wallet.tradeType.buy': '์‚ฌ๋‹ค', - 'wallet.tradeType.sell': 'ํŒ”๋‹ค', - 'wallet.tradeType.liquidation': '๊ฐ•์ œ์ฒญ์‚ฐ', - 'wallet.tradeType.openLong': '๊ธธ๊ฒŒ ์—ด๋‹ค', - 'wallet.tradeType.addLong': '๊ฐ€๋—', - 'wallet.tradeType.closeLong': 'ํ•€๋“€์˜ค', - 'wallet.tradeType.closeLongStop': '์†์‹ค์„ ๋ฉˆ์ถ”๊ณ  ์˜ค๋žซ๋™์•ˆ', - 'wallet.tradeType.closeLongProfit': '์ด์ต์„ ์–ป๊ณ  ๋” ๋งŽ์€ ๋ ˆ๋ฒจ์„ ์˜ฌ๋ฆฌ์„ธ์š”', - 'wallet.tradeType.openShort': '์˜คํ”ˆ ์‡ผํŠธ', - 'wallet.tradeType.addShort': '์งง๊ฒŒ ์ถ”๊ฐ€ํ•˜๋‹ค', - 'wallet.tradeType.closeShort': '๋น„์–ด ์žˆ์Œ', - 'wallet.tradeType.closeShortStop': '์†์‹ค ์ค‘์ง€', - 'wallet.tradeType.closeShortProfit': '์ด์ต์„ ์–ป๊ณ  ๊ณต๋งค๋„ ๋งˆ๊ฐ', - 'wallet.moneyLogType.purchase': '๋งค์ˆ˜ ์ง€ํ‘œ', - 'wallet.moneyLogType.recharge': '์žฌ์ถฉ์ „', - 'wallet.moneyLogType.withdraw': 'ํ˜„๊ธˆ ์ธ์ถœ', - 'wallet.moneyLogType.refund': 'ํ™˜๋ถˆ', - 'wallet.moneyLogType.reward': '๋ณด์ƒ', - 'wallet.moneyLogType.income': '์†Œ๋“', - 'wallet.moneyLogType.commission': '์ทจ๊ธ‰ ์ˆ˜์ˆ˜๋ฃŒ', - 'wallet.web3Address.required': '๋จผ์ € Web3 ์ง€๊ฐ‘ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'wallet.web3Address.requiredDescription': '์ถฉ์ „ํ•˜๊ธฐ ์ „์— Web3 ์ง€๊ฐ‘ ์ฃผ์†Œ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ด์•ผ ์ถฉ์ „์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'wallet.web3Address.placeholder': 'Web3 ์ง€๊ฐ‘ ์ฃผ์†Œ(0x๋กœ ์‹œ์ž‘)๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'wallet.web3Address.save': '์ง€๊ฐ‘ ์ฃผ์†Œ ์ €์žฅ', - 'wallet.web3Address.saveSuccess': '์ง€๊ฐ‘ ์ฃผ์†Œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'wallet.web3Address.saveFailed': '์ง€๊ฐ‘ ์ฃผ์†Œ ์ €์žฅ ์‹คํŒจ', - 'wallet.web3Address.invalidFormat': '์œ ํšจํ•œ Web3 ์ง€๊ฐ‘ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. (์ด๋”๋ฆฌ์›€ ํ˜•์‹: 0x๋กœ ์‹œ์ž‘ํ•˜๋Š” 42์ž ๋˜๋Š” TRC20 ํ˜•์‹: T๋กœ ์‹œ์ž‘ํ•˜๋Š” 34์ž)', - 'wallet.selectCoin': 'ํ†ตํ™” ์„ ํƒ', - 'wallet.selectChain': '์„ ํƒ ์ฒด์ธ', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': '์ƒํ™˜ํ•˜๋ ค๋Š” QDT ๊ธˆ์•ก(์„ ํƒ ์‚ฌํ•ญ)', - 'wallet.targetQdtAmount.placeholder': '์ƒํ™˜ํ•˜๋ ค๋Š” QDT ์ˆ˜๋Ÿ‰, ํ˜„์žฌ QDT ๊ฐ€๊ฒฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': '์žฌ์ถฉ์ „ ํ•„์š”: {amount} USDT', - 'wallet.rechargeAddress': '์ถฉ์ „ ์ฃผ์†Œ', - 'wallet.copyAddress': '๋ณต์‚ฌ', - 'wallet.copySuccess': '์„ฑ๊ณต์ ์œผ๋กœ ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!', - 'wallet.copyFailed': '๋ณต์‚ฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜์„ธ์š”.', - 'wallet.rechargeAddressHint': '์ด ์ฃผ์†Œ์— {coin}์„ ์ž…๊ธˆํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ {chain}์„ ์‚ฌ์šฉํ•˜์„ธ์š”.', - 'wallet.qdtPrice.loading': '๋กœ๋“œ ์ค‘...', - 'wallet.rechargeTip.new': 'ํ†ตํ™”์™€ ์ฒด์ธ์„ ์„ ํƒํ•œ ํ›„ ์•„๋ž˜ QR ์ฝ”๋“œ๋ฅผ ์Šค์บ”ํ•˜์—ฌ ์ถฉ์ „ํ•˜์„ธ์š”.', - 'wallet.exchangeRate': '1 QDT โ‰’ {rate} USDT', - 'wallet.withdrawableAmount': '์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜„๊ธˆ ๊ธˆ์•ก', - 'wallet.totalBalance': '์ด ์ž”์•ก', - 'wallet.insufficientWithdrawable': '์ถœ๊ธˆ ๊ฐ€๋Šฅํ•œ ํ˜„๊ธˆ ๊ธˆ์•ก์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ธˆ์•ก์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: {amount} QDT', - 'wallet.withdrawAddressRequired': '์ถœ๊ธˆ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'wallet.withdrawAddressHint': '์ฃผ์†Œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ํƒˆํ‡ด ํ›„์—๋Š” ์ทจ์†Œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.', - 'wallet.withdrawSubmitSuccess': '์ฒ ํšŒ ์‹ ์ฒญ์„œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ œ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒ€ํ† ๋ฅผ ๊ธฐ๋‹ค๋ ค ์ฃผ์„ธ์š”.', - 'menu.footer.contactUs': '๋ฌธ์˜ํ•˜๊ธฐ', - 'menu.footer.getSupport': '์ง€์› ๋ฐ›๊ธฐ', - 'menu.footer.socialAccounts': '์†Œ์…œ ๊ณ„์ •', - 'menu.footer.userAgreement': '์‚ฌ์šฉ์ž ๊ณ„์•ฝ', - 'menu.footer.privacyPolicy': '๊ฐœ์ธ ์ •๋ณด ๋ณดํ˜ธ ์ •์ฑ…', - 'menu.footer.support': '์ง€์›', - 'menu.footer.featureRequest': '๊ธฐ๋Šฅ ์š”์ฒญ', - 'menu.footer.email': '์ด๋ฉ”์ผ', - 'menu.footer.liveChat': '์—ฐ์ค‘๋ฌดํœด ๋ผ์ด๋ธŒ ์ฑ„ํŒ…', - 'dashboard.analysis.title': '๋‹ค์ฐจ์› ๋ถ„์„', - 'dashboard.analysis.subtitle': 'AI ๊ธฐ๋ฐ˜ ์ข…ํ•ฉ์žฌ๋ฌด๋ถ„์„ ํ”Œ๋žซํผ', - 'dashboard.analysis.selectSymbol': '๊ธฐ๋ณธ ์ฝ”๋“œ ์„ ํƒ ๋˜๋Š” ์ž…๋ ฅ', - 'dashboard.analysis.selectModel': '๋ชจ๋ธ ์„ ํƒ', - 'dashboard.analysis.startAnalysis': '๋ถ„์„ ์‹œ์ž‘', - 'dashboard.analysis.history': '์—ญ์‚ฌ', - 'dashboard.analysis.tab.overview': '์ข…ํ•ฉ์ ์ธ ๋ถ„์„', - 'dashboard.analysis.tab.fundamental': '๊ธฐ์ดˆ', - 'dashboard.analysis.tab.technical': '๊ธฐ์ˆ ', - 'dashboard.analysis.tab.news': '๋‰ด์Šค', - 'dashboard.analysis.tab.sentiment': '๊ฐ์ •', - 'dashboard.analysis.tab.risk': '์œ„ํ—˜', - 'dashboard.analysis.tab.debate': '๊ธธ๊ณ  ์งง์€ ๋…ผ์Ÿ', - 'dashboard.analysis.tab.decision': '์ตœ์ข… ๊ฒฐ์ •', - 'dashboard.analysis.empty.selectSymbol': '๋ถ„์„์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋Œ€์ƒ์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.analysis.empty.selectSymbolDesc': '์ž์ฒด ์„ ํƒํ•œ ์ฃผ์‹ ๋ชฉ๋ก์—์„œ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋‹ค์ฐจ์› AI ๋ถ„์„ ๋ณด๊ณ ์„œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.', - 'dashboard.analysis.empty.startAnalysis': '๋‹ค์ฐจ์› ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด "๋ถ„์„ ์‹œ์ž‘" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”.', - 'dashboard.analysis.empty.startAnalysisDesc': 'ํŽ€๋”๋ฉ˜ํ„ธ, ๊ธฐ์ˆ , ๋‰ด์Šค, ์ •์„œ, ๋ฆฌ์Šคํฌ ๋“ฑ ๋‹ค์ฐจ์›์—์„œ ์ข…ํ•ฉ์ ์ธ ๋ถ„์„์„ ์ œ๊ณตํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.', - 'dashboard.analysis.empty.noData': 'ํ˜„์žฌ {type} ๋ถ„์„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ข…ํ•ฉ์ ์ธ ๋ถ„์„์„ ์ˆ˜ํ–‰ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.analysis.empty.noWatchlist': 'ํ˜„์žฌ ์ž์ฒด์„ ํƒํ•œ ์ข…๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.analysis.empty.noHistory': '์•„์ง ๊ธฐ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.analysis.empty.watchlistHint': 'ํ˜„์žฌ ์ž์ฒด ์„ ํƒํ•œ ์ฃผ์‹์ด ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋ฌธ์˜ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.analysis.empty.noDebateData': '์•„์ง ํ† ๋ก  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.analysis.empty.noDecisionData': '์•„์ง ๊ฒฐ์ • ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.analysis.empty.selectAgent': '๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ ค๋ฉด ์—์ด์ „ํŠธ๋ฅผ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.analysis.loading.analyzing': '๋ถ„์„ ์ค‘์ž…๋‹ˆ๋‹ค. ์ž ์‹œ ๊ธฐ๋‹ค๋ ค ์ฃผ์„ธ์š”...', - 'dashboard.analysis.loading.fundamental': '๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ค‘...', - 'dashboard.analysis.loading.technical': '๊ธฐ์ˆ  ์ง€ํ‘œ ๋ถ„์„ ์ค‘...', - 'dashboard.analysis.loading.news': '๋‰ด์Šค ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ค‘...', - 'dashboard.analysis.loading.sentiment': '์‹œ์žฅ ์‹ฌ๋ฆฌ ๋ถ„์„ ์ค‘โ€ฆ', - 'dashboard.analysis.loading.risk': '์œ„ํ—˜ ํ‰๊ฐ€ ์ค‘...', - 'dashboard.analysis.loading.debate': '๋กฑ์ˆ ๋…ผ์Ÿ์ด ์ง„ํ–‰์ค‘์ธ๋ฐ..', - 'dashboard.analysis.loading.decision': '์ตœ์ข… ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ์ค‘...', - 'dashboard.analysis.score.overall': '์ข…ํ•ฉํ‰๊ฐ€', - 'dashboard.analysis.score.recommendation': 'ํˆฌ์ž ์กฐ์–ธ', - 'dashboard.analysis.score.confidence': '์ž์‹ ๊ฐ', - 'dashboard.analysis.dimension.fundamental': '๊ธฐ์ดˆ', - 'dashboard.analysis.dimension.technical': '๊ธฐ์ˆ ', - 'dashboard.analysis.dimension.news': '๋‰ด์Šค', - 'dashboard.analysis.dimension.sentiment': '๊ฐ์ •', - 'dashboard.analysis.dimension.risk': '์œ„ํ—˜', - 'dashboard.analysis.card.dimensionScores': '๊ฐ ์ฐจ์›์— ๋Œ€ํ•œ ํ‰๊ฐ€', - 'dashboard.analysis.card.overviewReport': '์ข…ํ•ฉ๋ถ„์„๋ณด๊ณ ์„œ', - 'dashboard.analysis.card.financialMetrics': '์žฌ๋ฌด ์ง€ํ‘œ', - 'dashboard.analysis.card.fundamentalReport': '๊ธฐ์ดˆ๋ถ„์„ ๋ณด๊ณ ์„œ', - 'dashboard.analysis.card.technicalIndicators': '๊ธฐ์ˆ  ์ง€ํ‘œ', - 'dashboard.analysis.card.technicalReport': '๊ธฐ์ˆ ์  ๋ถ„์„ ๋ณด๊ณ ์„œ', - 'dashboard.analysis.card.newsList': '๊ด€๋ จ ๋‰ด์Šค', - 'dashboard.analysis.card.newsReport': '๋‰ด์Šค ๋ถ„์„ ๋ณด๊ณ ์„œ', - 'dashboard.analysis.card.sentimentIndicators': '๊ฐ์ • ์ง€ํ‘œ', - 'dashboard.analysis.card.sentimentReport': '๊ฐ์ • ๋ถ„์„ ๋ณด๊ณ ์„œ', - 'dashboard.analysis.card.riskMetrics': '์œ„ํ—˜ ์ง€ํ‘œ', - 'dashboard.analysis.card.riskReport': '์œ„ํ—˜ ํ‰๊ฐ€ ๋ณด๊ณ ์„œ', - 'dashboard.analysis.card.bullView': '๊ฐ•์„ธ ์ „๋ง(๊ฐ•์„ธ)', - 'dashboard.analysis.card.bearView': '์•ฝ์„ธ ์ „๋ง (๊ณฐ)', - 'dashboard.analysis.card.researchConclusion': '์—ฐ๊ตฌ์›์˜ ๊ฒฐ๋ก ', - 'dashboard.analysis.card.traderPlan': '์ƒ์ธ ๊ณ„ํš', - 'dashboard.analysis.card.riskDebate': '์œ„ํ—˜์œ„์›ํšŒ ํ† ๋ก ', - 'dashboard.analysis.card.finalDecision': '์ตœ์ข… ๊ฒฐ์ •', - 'dashboard.analysis.card.tradePlanDetail': '๊ฑฐ๋ž˜ ๊ณ„ํš ์„ธ๋ถ€์ •๋ณด', - 'dashboard.analysis.tradingPlan.entry_price': '์ž…์žฅ๋ฃŒ', - 'dashboard.analysis.tradingPlan.position_size': '์œ„์น˜ ํฌ๊ธฐ', - 'dashboard.analysis.tradingPlan.stop_loss': '์†์‹ค์„ ๋ง‰๋‹ค', - 'dashboard.analysis.tradingPlan.take_profit': '์ด์ต์„ ์–ป์œผ์„ธ์š”', - 'dashboard.analysis.label.confidence': '์ž์‹ ๊ฐ', - 'dashboard.analysis.label.keyPoints': 'ํ•ต์‹ฌ ํฌ์ธํŠธ', - 'dashboard.analysis.label.riskWarning': '์œ„ํ—˜ ๊ฒฝ๊ณ ', - 'dashboard.analysis.risk.risky': '์œ„ํ—˜ํ•˜๋‹ค', - 'dashboard.analysis.risk.neutral': '์ค‘๋ฆฝ์  ๊ด€์  (Neutral)', - 'dashboard.analysis.risk.safe': '๋ณด์ˆ˜์  ๊ด€์ (์•ˆ์ „)', - 'dashboard.analysis.risk.conclusion': '๊ฒฐ๋ก ', - 'dashboard.analysis.feature.fundamental': '๊ธฐ๋ณธ์  ๋ถ„์„', - 'dashboard.analysis.feature.technical': '๊ธฐ์ˆ ์  ๋ถ„์„', - 'dashboard.analysis.feature.news': '๋‰ด์Šค ๋ถ„์„', - 'dashboard.analysis.feature.sentiment': '๊ฐ์ • ๋ถ„์„', - 'dashboard.analysis.feature.risk': '์œ„ํ—˜ ํ‰๊ฐ€', - 'dashboard.analysis.watchlist.title': '๋‚˜์˜ ์ฃผ์‹ ์„ ํƒ', - 'dashboard.analysis.watchlist.add': '์ถ”๊ฐ€ํ•˜๋‹ค', - 'dashboard.analysis.watchlist.addStock': '์žฌ๊ณ  ์ถ”๊ฐ€', - 'dashboard.analysis.modal.addStock.title': '์˜ต์…˜ ์žฌ๊ณ  ์ถ”๊ฐ€', - 'dashboard.analysis.modal.addStock.confirm': '์•Œ์•˜์–ด', - 'dashboard.analysis.modal.addStock.cancel': '์ทจ์†Œ', - 'dashboard.analysis.modal.addStock.market': '์‹œ์žฅ ์œ ํ˜•', - 'dashboard.analysis.modal.addStock.marketPlaceholder': '์‹œ์žฅ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'dashboard.analysis.modal.addStock.marketRequired': '์‹œ์žฅ ์œ ํ˜•์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.analysis.modal.addStock.symbol': '์ฃผ์‹ ์ฝ”๋“œ', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': '์˜ˆ: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': '์ฃผ์‹์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'dashboard.analysis.modal.addStock.searchPlaceholder': '๋Œ€์ƒ ์ฝ”๋“œ ๋˜๋Š” ์ด๋ฆ„ ๊ฒ€์ƒ‰', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': '๊ธฐ๋ณธ ์ฝ”๋“œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅํ•˜์„ธ์š”(์˜ˆ: AAPL, BTC/USDT, EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': '๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ฐ์ฒด ๊ฒ€์ƒ‰ ๋˜๋Š” ์ฝ”๋“œ ์ง์ ‘ ์ž…๋ ฅ ์ง€์›(์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ์ด๋ฆ„์„ ์–ป์Œ)', - 'dashboard.analysis.modal.addStock.search': '๊ฒ€์ƒ‰', - 'dashboard.analysis.modal.addStock.searchResults': '๊ฒ€์ƒ‰๊ฒฐ๊ณผ', - 'dashboard.analysis.modal.addStock.hotSymbols': '์ธ๊ธฐ ์žˆ๋Š” ํƒ€๊ฒŸ', - 'dashboard.analysis.modal.addStock.noHotSymbols': '์•„์ง ์ธ๊ธฐ ์žˆ๋Š” ํƒ€๊ฒŸ์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.analysis.modal.addStock.selectedSymbol': '์„ ํƒ๋จ', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': '๋จผ์ € ๋Œ€์ƒ์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': '๋Œ€์ƒ์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋Œ€์ƒ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž…๋ ฅํ•˜์„ธ์š”', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'ํƒ€๊ฒŸ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': '๋จผ์ € ์‹œ์žฅ ์œ ํ˜•์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.analysis.modal.addStock.searchFailed': '๊ฒ€์ƒ‰์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.analysis.modal.addStock.noSearchResults': '์ผ์น˜ํ•˜๋Š” ๋Œ€์ƒ์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.analysis.modal.addStock.willAutoFetchName': '์‹œ์Šคํ…œ์—์„œ ์ž๋™์œผ๋กœ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.', - 'dashboard.analysis.modal.addStock.addDirectly': '์ง์ ‘ ์ถ”๊ฐ€', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': '์ถ”๊ฐ€๋˜๋ฉด ์ด๋ฆ„์ด ์ž๋™์œผ๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.', - 'dashboard.analysis.market.USStock': '๋ฏธ๊ตญ ์ฃผ์‹', - 'dashboard.analysis.market.Crypto': '์•”ํ˜ธํ™”ํ', - 'dashboard.analysis.market.Forex': '์™ธํ™˜', - 'dashboard.analysis.market.Futures': '์„ ๋ฌผ', - 'dashboard.analysis.modal.history.title': '์—ญ์‚ฌ์  ๋ถ„์„ ๊ธฐ๋ก', - 'dashboard.analysis.modal.history.viewResult': '๊ฒฐ๊ณผ ๋ณด๊ธฐ', - 'dashboard.analysis.modal.history.completeTime': '์™„๋ฃŒ ์‹œ๊ฐ„', - 'dashboard.analysis.modal.history.error': '์˜ค๋ฅ˜', - 'dashboard.analysis.status.pending': '๋ณด๋ฅ˜ ์ค‘', - 'dashboard.analysis.status.processing': '์ฒ˜๋ฆฌ', - 'dashboard.analysis.status.completed': '์™„๋ฃŒ๋จ', - 'dashboard.analysis.status.failed': '์‹คํŒจํ–ˆ๋‹ค', - 'dashboard.analysis.message.selectSymbol': '๋Œ€์ƒ์„ ๋จผ์ € ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'dashboard.analysis.message.taskCreated': '๋ถ„์„ ์ž‘์—…์ด ์ƒ์„ฑ๋˜์–ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค...', - 'dashboard.analysis.message.analysisComplete': '๋ถ„์„ ์™„๋ฃŒ', - 'dashboard.analysis.message.analysisCompleteCache': '๋ถ„์„ ์™„๋ฃŒ(์บ์‹œ๋œ ๋ฐ์ดํ„ฐ ํ™œ์šฉ)', - 'dashboard.analysis.message.analysisFailed': '๋ถ„์„์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.analysis.message.addStockSuccess': '์„ฑ๊ณต์ ์œผ๋กœ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'dashboard.analysis.message.addStockFailed': '์ถ”๊ฐ€ ์‹คํŒจ', - 'dashboard.analysis.message.removeStockSuccess': '์„ฑ๊ณต์ ์œผ๋กœ ์ œ๊ฑฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'dashboard.analysis.message.removeStockFailed': '์ œ๊ฑฐ ์‹คํŒจ', - 'dashboard.analysis.message.resumingAnalysis': '๋ถ„์„ ์ž‘์—…์„ ์žฌ๊ฐœํ•˜๋Š” ์ค‘...', - 'dashboard.analysis.message.deleteSuccess': '์„ฑ๊ณต์ ์œผ๋กœ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'dashboard.analysis.message.deleteFailed': '์‚ญ์ œ ์‹คํŒจ', - 'dashboard.analysis.modal.history.delete': '์‚ญ์ œ', - 'dashboard.analysis.modal.history.deleteConfirm': '์ด ๋ถ„์„ ๊ธฐ๋ก์„ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?', - 'dashboard.analysis.test': '์ƒ์  ๋ฒˆํ˜ธ {no}, Gongzhuan Road', - 'dashboard.analysis.introduce': 'ํ‘œ์‹œ๊ธฐ ์„ค๋ช…', - 'dashboard.analysis.total-sales': '์ด๋งค์ถœ', - 'dashboard.analysis.day-sales': '์ผํ‰๊ท  ๋งค์ถœ์—”์—”', - 'dashboard.analysis.visits': '๋ฐฉ๋ฌธ', - 'dashboard.analysis.visits-trend': 'ํŠธ๋ž˜ํ”ฝ ๋™ํ–ฅ', - 'dashboard.analysis.visits-ranking': '๋งค์žฅ ๋ฐฉ๋ฌธ ์ˆœ์œ„', - 'dashboard.analysis.day-visits': '์ผ์ผ ๋ฐฉ๋ฌธ', - 'dashboard.analysis.week': '๋งค์ฃผ ์ „๋…„ ๋Œ€๋น„', - 'dashboard.analysis.day': '์ „๋…„ ๋Œ€๋น„', - 'dashboard.analysis.payments': '๊ฒฐ์ œ ํšŸ์ˆ˜', - 'dashboard.analysis.conversion-rate': '์ „ํ™˜์œจ', - 'dashboard.analysis.operational-effect': '์šด์˜ํ™œ๋™ ํšจ๊ณผ', - 'dashboard.analysis.sales-trend': 'ํŒ๋งค ๋™ํ–ฅ', - 'dashboard.analysis.sales-ranking': '๋งค์žฅํŒ๋งค์ˆœ์œ„', - 'dashboard.analysis.all-year': '์ผ๋…„ ๋‚ด๋‚ด', - 'dashboard.analysis.all-month': '์ด๋ฒˆ ๋‹ฌ', - 'dashboard.analysis.all-week': '์ด๋ฒˆ ์ฃผ', - 'dashboard.analysis.all-day': '์˜ค๋Š˜', - 'dashboard.analysis.search-users': '๊ฒ€์ƒ‰ ์‚ฌ์šฉ์ž ์ˆ˜', - 'dashboard.analysis.per-capita-search': '1์ธ๋‹น ๊ฒ€์ƒ‰๋Ÿ‰', - 'dashboard.analysis.online-top-search': '์˜จ๋ผ์ธ ์ธ๊ธฐ ๊ฒ€์ƒ‰์–ด', - 'dashboard.analysis.the-proportion-of-sales': 'ํŒ๋งค ์นดํ…Œ๊ณ ๋ฆฌ ๋น„์œจ', - 'dashboard.analysis.dropdown-option-one': '์ฒซ ๋ฒˆ์งธ ์ž‘์ „', - 'dashboard.analysis.dropdown-option-two': '์ž‘์ „ 2', - 'dashboard.analysis.channel.all': '๋ชจ๋“  ์ฑ„๋„', - 'dashboard.analysis.channel.online': '์˜จ๋ผ์ธ', - 'dashboard.analysis.channel.stores': '์ €์žฅ', - 'dashboard.analysis.sales': 'ํŒ๋งค', - 'dashboard.analysis.traffic': '์Šน๊ฐ ํ๋ฆ„', - 'dashboard.analysis.table.rank': '์ˆœ์œ„', - 'dashboard.analysis.table.search-keyword': 'ํ‚ค์›Œ๋“œ ๊ฒ€์ƒ‰', - 'dashboard.analysis.table.users': '์‚ฌ์šฉ์ž ์ˆ˜', - 'dashboard.analysis.table.weekly-range': '์ฃผ๊ฐ„ ์ฆ๊ฐ€', - 'dashboard.indicator.selectSymbol': '๊ธฐ๋ณธ ์ฝ”๋“œ ์„ ํƒ ๋˜๋Š” ์ž…๋ ฅ', - 'dashboard.indicator.emptyWatchlistHint': 'ํ˜„์žฌ ์ž์ฒด ์„ ํƒํ•œ ์ฃผ์‹์ด ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.indicator.hint.selectSymbol': '๋ถ„์„์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋Œ€์ƒ์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.indicator.hint.selectSymbolDesc': 'K-๋ผ์ธ ์ฐจํŠธ ๋ฐ ๊ธฐ์ˆ  ์ง€ํ‘œ๋ฅผ ๋ณด๋ ค๋ฉด ์œ„ ๊ฒ€์ƒ‰์ฐฝ์—์„œ ์ฃผ์‹ ์ฝ”๋“œ๋ฅผ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'dashboard.indicator.retry': '๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”', - 'dashboard.indicator.panel.title': '๊ธฐ์ˆ  ์ง€ํ‘œ', - 'dashboard.indicator.panel.realtimeOn': '์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ๋„๊ธฐ', - 'dashboard.indicator.panel.realtimeOff': '์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ ํ™œ์„ฑํ™”', - 'dashboard.indicator.panel.themeLight': '์–ด๋‘์šด ํ…Œ๋งˆ๋กœ ์ „ํ™˜', - 'dashboard.indicator.panel.themeDark': '๋ฐ์€ ํ…Œ๋งˆ๋กœ ์ „ํ™˜', - 'dashboard.indicator.section.enabled': 'ํ™œ์„ฑํ™”๋จ', - 'dashboard.indicator.section.added': '๋‚ด๊ฐ€ ์ถ”๊ฐ€ํ•œ ์ง€ํ‘œ', - 'dashboard.indicator.section.custom': '์ง์ ‘ ๋งŒ๋“  ์ง€ํ‘œ', - 'dashboard.indicator.section.bought': '๋‚ด๊ฐ€ ๊ตฌ๋งคํ•œ ์ง€ํ‘œ', - 'dashboard.indicator.section.myCreated': '๋‚ด๊ฐ€ ๋งŒ๋“  ์ง€ํ‘œ', - 'dashboard.indicator.empty': '์•„์ง ํ‘œ์‹œ๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋จผ์ € ํ‘œ์‹œ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜์„ธ์š”.', - 'dashboard.indicator.buy': '๋งค์ˆ˜ ์ง€ํ‘œ', - 'dashboard.indicator.action.start': '์‹œ์ž‘', - 'dashboard.indicator.action.stop': '๋‹ซ๊ธฐ', - 'dashboard.indicator.action.edit': 'ํŽธ์ง‘', - 'dashboard.indicator.action.delete': '์‚ญ์ œ', - 'dashboard.indicator.action.backtest': '๋ฐฑํ…Œ์ŠคํŠธ', - 'dashboard.indicator.status.normal': '์ •์ƒ', - 'dashboard.indicator.status.normalPermanent': '์ผ๋ฐ˜(์˜๊ตฌ์ ์œผ๋กœ ์œ ํšจ)', - 'dashboard.indicator.status.expired': '๋งŒ๋ฃŒ๋จ', - 'dashboard.indicator.expiry.permanent': '์˜๊ตฌ์ ์œผ๋กœ ์œ ํšจํ•จ', - 'dashboard.indicator.expiry.noExpiry': '๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์—†์Œ', - 'dashboard.indicator.expiry.expired': '๋งŒ๋ฃŒ๋จ: {date}', - 'dashboard.indicator.expiry.expiresOn': '๋งŒ๋ฃŒ ์‹œ๊ฐ„: {date}', - 'dashboard.indicator.delete.confirmTitle': '์‚ญ์ œ ํ™•์ธ', - 'dashboard.indicator.delete.confirmContent': '"{name}" ํ‘œ์‹œ๊ธฐ๋ฅผ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด ์ž‘์—…์€ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.delete.confirmOk': '์‚ญ์ œ', - 'dashboard.indicator.delete.confirmCancel': '์ทจ์†Œ', - 'dashboard.indicator.delete.success': '์„ฑ๊ณต์ ์œผ๋กœ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'dashboard.indicator.delete.failed': '์‚ญ์ œ ์‹คํŒจ', - 'dashboard.indicator.save.success': '์„ฑ๊ณต์ ์œผ๋กœ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'dashboard.indicator.save.failed': '์ €์žฅ ์‹คํŒจ', - 'dashboard.indicator.error.loadWatchlistFailed': '์˜ต์…˜ ์žฌ๊ณ ๋ฅผ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.error.chartNotReady': '์ฐจํŠธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋จผ์ € ๋Œ€์ƒ์„ ์„ ํƒํ•˜๊ณ  ์ฐจํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค ์ฃผ์„ธ์š”.', - 'dashboard.indicator.error.chartMethodNotReady': '์ฐจํŠธ ๊ตฌ์„ฑ ์š”์†Œ ๋ฉ”์„œ๋“œ๊ฐ€ ์ค€๋น„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.indicator.error.chartExecuteNotReady': '์ฐจํŠธ ๊ตฌ์„ฑ์š”์†Œ ์‹คํ–‰ ๋ฐฉ๋ฒ•์ด ์ค€๋น„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.indicator.error.parseFailed': 'Python ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.error.parseFailedCheck': 'Python ์ฝ”๋“œ๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ํ˜•์‹์„ ํ™•์ธํ•˜์„ธ์š”.', - 'dashboard.indicator.error.addIndicatorFailed': 'ํ‘œ์‹œ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.error.runIndicatorFailed': '์‹คํ–‰ ํ‘œ์‹œ๊ธฐ ์‹คํŒจ', - 'dashboard.indicator.error.pleaseLogin': '๋จผ์ € ๋กœ๊ทธ์ธํ•ด์ฃผ์„ธ์š”', - 'dashboard.indicator.error.loadDataFailed': '๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ์‹คํŒจ', - 'dashboard.indicator.error.loadDataFailedDesc': '๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”', - 'dashboard.indicator.error.pythonEngineFailed': 'Python ์—”์ง„์„ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ๊ณ  ํ‘œ์‹œ๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.error.chartInitFailed': '์ฐจํŠธ ์ดˆ๊ธฐํ™” ์‹คํŒจ', - 'dashboard.indicator.warning.enterCode': 'ํ‘œ์‹œ๊ธฐ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž…๋ ฅํ•˜์„ธ์š”.', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python ์—”์ง„์„ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'ํ˜„์žฌ ์ง€์—ญ ๋˜๋Š” ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ๋Š” ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.warning.chartNotInitialized': '์ฐจํŠธ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์•„ ์„  ๊ทธ๋ฆฌ๊ธฐ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.success.runIndicator': 'ํ‘œ์‹œ๊ธฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.', - 'dashboard.indicator.success.clearDrawings': '๋ชจ๋“  ์„ ํ™” ์‚ญ์ œ๋จ', - 'dashboard.indicator.sma': 'SMA(์ด๋™ ํ‰๊ท  ์กฐํ•ฉ)', - 'dashboard.indicator.ema': 'EMA(์ง€์ˆ˜ ์ด๋™ ํ‰๊ท  ์กฐํ•ฉ)', - 'dashboard.indicator.rsi': 'RSI(์ƒ๋Œ€๊ฐ•๋„)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': '๋ณผ๋ฆฐ์ € ๋ฐด๋“œ', - 'dashboard.indicator.atr': 'ATR(ํ‰๊ท  ์‹ค์ œ ๋ฒ”์œ„)', - 'dashboard.indicator.cci': 'CCI(์ƒํ’ˆ ์ฑ„๋„ ์ง€์ˆ˜)', - 'dashboard.indicator.williams': 'Williams %R(์œŒ๋ฆฌ์—„์Šค ์ง€ํ‘œ)', - 'dashboard.indicator.mfi': 'MFI(์ž๊ธˆ ํ๋ฆ„ ์ง€์ˆ˜)', - 'dashboard.indicator.adx': 'ADX(ํ‰๊ท  ์ถ”์„ธ ์ง€์ˆ˜)', - 'dashboard.indicator.obv': 'OBV(์—๋„ˆ์ง€ํŒŒ)', - 'dashboard.indicator.adosc': 'ADOSC(๋ˆ„์ /๋””์ŠคํŒจ์น˜ ์˜ค์‹ค๋ ˆ์ดํ„ฐ)', - 'dashboard.indicator.ad': 'AD(์ง‘์ /๋ถ„๋ฐฐ์„ )', - 'dashboard.indicator.kdj': 'KDJ(ํ™•๋ฅ ์  ์ง€ํ‘œ)', - 'dashboard.indicator.signal.buy': '๊ตฌ๋งค', - 'dashboard.indicator.signal.sell': 'ํŒ๋งค', - 'dashboard.indicator.signal.supertrendBuy': '์ŠˆํผํŠธ๋ Œ๋“œ ๊ตฌ๋งค', - 'dashboard.indicator.signal.supertrendSell': '์ŠˆํผํŠธ๋ Œ๋“œ ๋งค๋„', - 'dashboard.indicator.chart.kline': 'K๋ผ์ธ', - 'dashboard.indicator.chart.volume': '๋ณผ๋ฅจ', - 'dashboard.indicator.chart.uptrend': '์ƒ์Šน ์ถ”์„ธ', - 'dashboard.indicator.chart.downtrend': 'ํ•˜๋ฝ ์ถ”์„ธ', - 'dashboard.indicator.tooltip.time': '์‹œ๊ฐ„', - 'dashboard.indicator.tooltip.open': '์—ด๋‹ค', - 'dashboard.indicator.tooltip.close': '๋ฐ›๋‹ค', - 'dashboard.indicator.tooltip.high': '๋†’๋‹ค', - 'dashboard.indicator.tooltip.low': '๋‚ฎ์Œ', - 'dashboard.indicator.tooltip.volume': '๋ณผ๋ฅจ', - 'dashboard.indicator.drawing.line': '์„ ๋ถ„', - 'dashboard.indicator.drawing.horizontalLine': '์ˆ˜ํ‰์„ ', - 'dashboard.indicator.drawing.verticalLine': '์ˆ˜์ง์„ ', - 'dashboard.indicator.drawing.ray': '๋ ˆ์ด', - 'dashboard.indicator.drawing.straightLine': '์ง์„ ', - 'dashboard.indicator.drawing.parallelLine': 'ํ‰ํ–‰์„ ', - 'dashboard.indicator.drawing.priceLine': '๊ฐ€๊ฒฉ์„ ', - 'dashboard.indicator.drawing.priceChannel': '๊ฐ€๊ฒฉ ์ฑ„๋„', - 'dashboard.indicator.drawing.fibonacciLine': 'ํ”ผ๋ณด๋‚˜์น˜ ๋ผ์ธ', - 'dashboard.indicator.drawing.clearAll': '๋ชจ๋“  ์„ ํ™” ์ง€์šฐ๊ธฐ', - 'dashboard.indicator.market.USStock': '๋ฏธ๊ตญ ์ฃผ์‹', - 'dashboard.indicator.market.Crypto': '์•”ํ˜ธํ™”ํ', - 'dashboard.indicator.market.Forex': '์™ธํ™˜', - 'dashboard.indicator.market.Futures': '์„ ๋ฌผ', - 'dashboard.indicator.create': '์ง€ํ‘œ ์ƒ์„ฑ', - 'dashboard.indicator.editor.title': '์ง€ํ‘œ ์ƒ์„ฑ/ํŽธ์ง‘', - 'dashboard.indicator.editor.name': '์ง€ํ‘œ ์ด๋ฆ„', - 'dashboard.indicator.editor.nameRequired': '์ง€ํ‘œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'dashboard.indicator.editor.namePlaceholder': '์ง€ํ‘œ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'dashboard.indicator.editor.description': 'ํ‘œ์‹œ๊ธฐ ์„ค๋ช…', - 'dashboard.indicator.editor.descriptionPlaceholder': 'ํ‘œ์‹œ๊ธฐ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”(์„ ํƒ ์‚ฌํ•ญ).', - 'dashboard.indicator.editor.code': 'ํŒŒ์ด์ฌ ์ฝ”๋“œ', - 'dashboard.indicator.editor.codeRequired': 'ํ‘œ์‹œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'dashboard.indicator.editor.codePlaceholder': 'Python ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'dashboard.indicator.editor.run': '๋‹ฌ๋ฆฌ๋‹ค', - 'dashboard.indicator.editor.runHint': '์‹คํ–‰ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด K-๋ผ์ธ ์ฐจํŠธ์˜ ์ง€ํ‘œ ํšจ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.editor.guide': '๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ', - 'dashboard.indicator.editor.guideTitle': 'Python ์ง€ํ‘œ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ', - 'dashboard.indicator.editor.save': '์ €์žฅ', - 'dashboard.indicator.editor.cancel': '์ทจ์†Œ', - 'dashboard.indicator.editor.unnamed': '์ด๋ฆ„ ์—†๋Š” ํ‘œ์‹œ๊ธฐ', - 'dashboard.indicator.editor.publishToCommunity': '์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ฒŒ์‹œ', - 'dashboard.indicator.editor.publishToCommunityHint': '๊ฒŒ์‹œ๋˜๋ฉด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ท€ํ•˜์˜ ์ง€ํ‘œ๋ฅผ ๋ณด๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.editor.indicatorType': 'ํ‘œ์‹œ๊ธฐ ์œ ํ˜•', - 'dashboard.indicator.editor.indicatorTypeRequired': '์ง€ํ‘œ ์œ ํ˜•์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.indicator.editor.indicatorTypePlaceholder': '์ง€ํ‘œ ์œ ํ˜•์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.indicator.editor.previewImage': '๋ฏธ๋ฆฌ๋ณด๊ธฐ', - 'dashboard.indicator.editor.uploadImage': '์‚ฌ์ง„ ์—…๋กœ๋“œ', - 'dashboard.indicator.editor.previewImageHint': '๊ถŒ์žฅ ํฌ๊ธฐ: 800x400, 2MB ์ดํ•˜', - 'dashboard.indicator.editor.pricing': 'ํŒ๋งค๊ฐ€(QDT)', - 'dashboard.indicator.editor.pricingType.free': '๋ฌด๋ฃŒ', - 'dashboard.indicator.editor.pricingType.permanent': '์˜๊ตฌ', - 'dashboard.indicator.editor.pricingType.monthly': '์›”๋ณ„ ๊ฒฐ์ œ', - 'dashboard.indicator.editor.price': '๊ฐ€๊ฒฉ', - 'dashboard.indicator.editor.priceRequired': '๊ฐ€๊ฒฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'dashboard.indicator.editor.pricePlaceholder': '๊ฐ€๊ฒฉ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'dashboard.indicator.editor.pricingHint': '๋ฌด๋ฃŒ ์ง€ํ‘œ์˜ ๊ฐ€๊ฒฉ์€ 0์ด์ง€๋งŒ ํ”Œ๋žซํผ์€ ์ง€ํ‘œ ์‚ฌ์šฉ๋Ÿ‰๊ณผ ์นญ์ฐฌ๋ฅ ์— ๋”ฐ๋ผ ๋ณด์ƒ(QDT)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.', - 'dashboard.indicator.editor.aiGenerate': '์ง€๋Šฅํ˜• ์„ธ๋Œ€', - 'dashboard.indicator.editor.aiPromptPlaceholder': '๋‹น์‹ ์˜ ์•„์ด๋””์–ด๋ฅผ ์•Œ๋ ค์ฃผ์‹œ๋ฉด Python ํ‘œ์‹œ๊ธฐ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI ์ƒ์„ฑ ์ฝ”๋“œ', - 'dashboard.indicator.editor.aiPromptRequired': '๋‹น์‹ ์˜ ์ƒ๊ฐ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'dashboard.indicator.editor.aiGenerateSuccess': '์ฝ”๋“œ ์ƒ์„ฑ ์„ฑ๊ณต', - 'dashboard.indicator.editor.aiGenerateError': '์ฝ”๋“œ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.indicator.editor.verifyCode': '์ฝ”๋“œ ๊ฒ€์ฆ', - 'dashboard.indicator.editor.verifyCodeSuccess': '๊ฒ€์ฆ ํ†ต๊ณผ', - 'dashboard.indicator.editor.verifyCodeFailed': '๊ฒ€์ฆ ์‹คํŒจ', - 'dashboard.indicator.editor.verifyCodeEmpty': '์ฝ”๋“œ๋Š” ๋น„์›Œ๋‘˜ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค', - 'dashboard.indicator.backtest.title': '์ง€ํ‘œ ๋ฐฑํ…Œ์ŠคํŠธ', - 'dashboard.indicator.backtest.config': '๋ฐฑํ…Œ์ŠคํŠธ ๋งค๊ฐœ๋ณ€์ˆ˜', - 'dashboard.indicator.backtest.startDate': '์‹œ์ž‘์ผ', - 'dashboard.indicator.backtest.endDate': '์ข…๋ฃŒ์ผ', - 'dashboard.indicator.backtest.selectStartDate': '์‹œ์ž‘์ผ ์„ ํƒ', - 'dashboard.indicator.backtest.selectEndDate': '์ข…๋ฃŒ์ผ ์„ ํƒ', - 'dashboard.indicator.backtest.startDateRequired': '์‹œ์ž‘์ผ์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.indicator.backtest.endDateRequired': '์ข…๋ฃŒ์ผ์„ ์„ ํƒํ•˜์„ธ์š”.', - 'dashboard.indicator.backtest.initialCapital': '์ดˆ๊ธฐ์ž๋ณธ๊ธˆ', - 'dashboard.indicator.backtest.initialCapitalRequired': '์ดˆ๊ธฐ์ž๊ธˆ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'dashboard.indicator.backtest.commission': '์ˆ˜์ˆ˜๋ฃŒ', - 'dashboard.indicator.backtest.leverage': '๋ ˆ๋ฒ„๋ฆฌ์ง€ ๋น„์œจ', - 'dashboard.indicator.backtest.tradeDirection': '๊ฑฐ๋ž˜ ๋ฐฉํ–ฅ', - 'dashboard.indicator.backtest.longOnly': '์˜ค๋ž˜ ๊ฐ€์„ธ์š”', - 'dashboard.indicator.backtest.shortOnly': '์งง์€', - 'dashboard.indicator.backtest.both': '์–‘๋ฐฉํ–ฅ', - 'dashboard.indicator.backtest.run': '๋ฐฑํ…Œ์ŠคํŒ… ์‹œ์ž‘', - 'dashboard.indicator.backtest.rerun': '๋‹ค์‹œ ๋ฐฑํ…Œ์ŠคํŠธ', - 'dashboard.indicator.backtest.close': '๋‹ซ๊ธฐ', - 'dashboard.indicator.backtest.running': '์ง€ํ‘œ ๋ฐฑํ…Œ์ŠคํŠธ ์ง„ํ–‰ ์ค‘...', - 'dashboard.indicator.backtest.results': '๋ฐฑํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ', - 'dashboard.indicator.backtest.totalReturn': '์ด ์ˆ˜์ต', - 'dashboard.indicator.backtest.annualReturn': '์—ฐ๊ฐ„ ์†Œ๋“', - 'dashboard.indicator.backtest.maxDrawdown': '์ตœ๋Œ€ ๊ฐ์†Œ', - 'dashboard.indicator.backtest.sharpeRatio': '์ƒคํ”„๋น„์œจ', - 'dashboard.indicator.backtest.winRate': '์Šน๋ฅ ', - 'dashboard.indicator.backtest.profitFactor': '์†์ต ๋น„์œจ', - 'dashboard.indicator.backtest.totalTrades': '๊ฑฐ๋ž˜์ˆ˜', - 'dashboard.indicator.totalReturn': '์ด ์ˆ˜์ต', - 'dashboard.indicator.annualReturn': '์—ฐ๊ฐ„ ์ˆ˜์ต๋ฅ ', - 'dashboard.indicator.maxDrawdown': '์ตœ๋Œ€ ๊ฐ์†Œ', - 'dashboard.indicator.sharpeRatio': '์ƒคํ”„๋น„์œจ', - 'dashboard.indicator.winRate': '์Šน๋ฅ ', - 'dashboard.indicator.profitFactor': '์†์ต ๋น„์œจ', - 'dashboard.indicator.totalTrades': '์ด ๊ฑฐ๋ž˜ ์ˆ˜', - 'dashboard.indicator.backtest.totalCommission': '์ด ์ทจ๊ธ‰ ์ˆ˜์ˆ˜๋ฃŒ', - 'dashboard.indicator.backtest.equityCurve': '์ˆ˜์ต๋ฅ  ๊ณก์„ ', - 'dashboard.indicator.backtest.strategy': '์ง€ํ‘œ์†Œ๋“', - 'dashboard.indicator.backtest.benchmark': '๋ฒค์น˜๋งˆํฌ ์ˆ˜์ต๋ฅ ', - 'dashboard.indicator.backtest.tradeHistory': '๊ฑฐ๋ž˜ ๋‚ด์—ญ', - 'dashboard.indicator.backtest.tradeTime': '์‹œ๊ฐ„', - 'dashboard.indicator.backtest.tradeType': '์œ ํ˜•', - 'dashboard.indicator.backtest.buy': '์‚ฌ๋‹ค', - 'dashboard.indicator.backtest.sell': 'ํŒ”๋‹ค', - 'dashboard.indicator.backtest.liquidation': '์ฒญ์‚ฐ', - 'dashboard.indicator.backtest.openLong': '๊ธธ๊ฒŒ ์—ด๋‹ค', - 'dashboard.indicator.backtest.closeLong': 'ํ•€๋“€์˜ค', - 'dashboard.indicator.backtest.closeLongStop': '๋งค์ˆ˜์— ๊ฐ€๊นŒ์›€(์†์ ˆ๋งค)', - 'dashboard.indicator.backtest.closeLongProfit': '๋” ๋‹ซ๊ธฐ (์ด์ต ์‹คํ˜„)', - 'dashboard.indicator.backtest.addLong': '๋กฑ ํฌ์ง€์…˜ ์ถ”๊ฐ€', - 'dashboard.indicator.backtest.openShort': '์˜คํ”ˆ ์‡ผํŠธ', - 'dashboard.indicator.backtest.closeShort': '๋น„์–ด ์žˆ์Œ', - 'dashboard.indicator.backtest.closeShortStop': '์ฒญ์‚ฐ(์†์ ˆ๋งค)', - 'dashboard.indicator.backtest.closeShortProfit': '๋งˆ๊ฐ(์ด์ต์‹คํ˜„)', - 'dashboard.indicator.backtest.addShort': '์ˆ ํฌ์ง€์…˜ ์ถ”๊ฐ€', - 'dashboard.indicator.backtest.price': '๊ฐ€๊ฒฉ', - 'dashboard.indicator.backtest.amount': '์ˆ˜๋Ÿ‰', - 'dashboard.indicator.backtest.balance': '๊ณ„์ขŒ์ž”๊ณ ', - 'dashboard.indicator.backtest.profit': '์ด์ต๊ณผ ์†์‹ค', - 'dashboard.indicator.backtest.success': '๋ฐฑํ…Œ์ŠคํŠธ ์™„๋ฃŒ', - 'dashboard.indicator.backtest.failed': '๋ฐฑํ…Œ์ŠคํŠธ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'dashboard.indicator.backtest.noIndicatorCode': '์ด ์ง€ํ‘œ์— ๋Œ€ํ•œ ๋ฐฑํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.backtest.noSymbol': '๊ฑฐ๋ž˜๋Œ€์ƒ์„ ๋จผ์ € ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'dashboard.indicator.backtest.dateRangeExceeded': '๋ฐฑํ…Œ์ŠคํŠธ ์‹œ๊ฐ„ ๋ฒ”์œ„๊ฐ€ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. {timeframe} ๊ธฐ๊ฐ„์€ ์ตœ๋Œ€ {maxRange}๊นŒ์ง€ ๋ฐฑํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion scale-in', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': '๋ฌธ์„œ ์„ผํ„ฐ', - 'dashboard.docs.search.placeholder': '๋ฌธ์„œ ๊ฒ€์ƒ‰...', - 'dashboard.docs.category.all': '๋ชจ๋‘', - 'dashboard.docs.category.guide': '๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ', - 'dashboard.docs.category.api': 'API ๋ฌธ์„œ', - 'dashboard.docs.category.tutorial': 'ํŠœํ† ๋ฆฌ์–ผ', - 'dashboard.docs.category.faq': 'FAQ', - 'dashboard.docs.featured.title': '๊ถŒ์žฅ ๋ฌธ์„œ', - 'dashboard.docs.featured.tag': '์ถ”์ฒœ', - 'dashboard.docs.list.views': '์ฐพ์•„๋ณด๊ธฐ', - 'dashboard.docs.list.author': '์ž‘์„ฑ์ž', - 'dashboard.docs.list.empty': '์•„์ง ๋ฌธ์„œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'dashboard.docs.list.backToAll': '๋ชจ๋“  ๋ฌธ์„œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ', - 'dashboard.docs.list.total': '์ด {count}๊ฐœ์˜ ๋ฌธ์„œ', - 'dashboard.docs.detail.back': '๋ฌธ์„œ ๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ', - 'dashboard.docs.detail.updatedAt': '์—…๋ฐ์ดํŠธ ๋‚ ์งœ', - 'dashboard.docs.detail.related': '๊ด€๋ จ ๋ฌธ์„œ', - 'dashboard.docs.detail.notFound': '๋ฌธ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค', - 'dashboard.docs.detail.error': '๋ฌธ์„œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'dashboard.docs.search.result': '๊ฒ€์ƒ‰๊ฒฐ๊ณผ', - 'dashboard.docs.search.keyword': 'ํ‚ค์›Œ๋“œ', - 'community.filter.indicatorType': 'ํ‘œ์‹œ๊ธฐ ์œ ํ˜•', - 'community.filter.all': '๋ชจ๋‘', - 'community.filter.other': '๊ธฐํƒ€ ์˜ต์…˜', - 'community.filter.pricing': '๊ฐ€๊ฒฉ ์œ ํ˜•', - 'community.filter.allPricing': '๋ชจ๋“  ๊ฐ€๊ฒฉ', - 'community.filter.sortBy': '์ •๋ ฌ ๊ธฐ์ค€', - 'community.filter.search': '๊ฒ€์ƒ‰', - 'community.filter.searchPlaceholder': '์ธก์ •ํ•ญ๋ชฉ ์ด๋ฆ„ ๊ฒ€์ƒ‰', - 'community.indicatorType.trend': 'ํŠธ๋ Œ๋“œ ์œ ํ˜•', - 'community.indicatorType.momentum': '๋ชจ๋ฉ˜ํ…€ํ˜•', - 'community.indicatorType.volatility': '๋ณ€๋™์„ฑ', - 'community.indicatorType.volume': '๋ณผ๋ฅจ', - 'community.indicatorType.custom': '์‚ฌ์šฉ์ž ์ •์˜', - 'community.pricing.free': '๋ฌด๋ฃŒ', - 'community.pricing.paid': '์ง€๋ถˆ', - 'community.sort.downloads': '๋‹ค์šด๋กœ๋“œ', - 'community.sort.rating': '๋“ฑ๊ธ‰', - 'community.sort.newest': '์ตœ์‹  ๋ฆด๋ฆฌ์Šค', - 'community.pagination.total': '์ด {total} ์ง€ํ‘œ', - 'community.noDescription': '์•„์ง ์„ค๋ช…์ด ์—†์Šต๋‹ˆ๋‹ค', - 'community.detail.type': '์œ ํ˜•', - 'community.detail.pricing': '๊ฐ€๊ฒฉ', - 'community.detail.rating': '๋“ฑ๊ธ‰', - 'community.detail.downloads': '๋‹ค์šด๋กœ๋“œ', - 'community.detail.author': '์ž‘์„ฑ์ž', - 'community.detail.description': '์†Œ๊ฐœ', - 'community.detail.detailContent': '์ž์„ธํ•œ ์„ค๋ช…', - 'community.detail.backtestStats': '๋ฐฑํ…Œ์ŠคํŠธ ํ†ต๊ณ„', - 'community.action.purchase': '๋งค์ˆ˜ ์ง€ํ‘œ', - 'community.action.addToMyIndicators': '๋‚ด ์ง€ํ‘œ์— ์ถ”๊ฐ€', - 'community.action.favorite': '์ปฌ๋ ‰์…˜', - 'community.action.unfavorite': '์ฆ๊ฒจ์ฐพ๊ธฐ ์ทจ์†Œ', - 'community.action.buyNow': '์ง€๊ธˆ ๊ตฌ๋งค', - 'community.action.renew': '๊ฐฑ์‹ ', - 'community.purchase.price': '๊ฐ€๊ฒฉ', - 'community.purchase.permanent': '์˜๊ตฌ', - 'community.purchase.monthly': '๋‹ฌ', - 'community.purchase.confirmBuy': '์ด ์ง€ํ‘œ({price} QDT) ๊ตฌ๋งค๋ฅผ ํ™•์ธํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?', - 'community.purchase.confirmRenew': '์ด ์ง€ํ‘œ({price} QDT/์›”)๋ฅผ ๊ฐฑ์‹ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?', - 'community.purchase.confirmFree': '์ด ๋ฌด๋ฃŒ ํ‘œ์‹œ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?', - 'community.purchase.confirmTitle': '์กฐ์น˜ ํ™•์ธ', - 'community.purchase.owned': '์ด ํ‘œ์‹œ๊ธฐ๋ฅผ ๊ตฌ์ž…ํ•˜์…จ์Šต๋‹ˆ๋‹ค(์˜๊ตฌ์ ์œผ๋กœ ์œ ํšจํ•จ).', - 'community.purchase.ownIndicator': '๊ท€ํ•˜๊ฐ€ ๊ฒŒ์‹œํ•œ ์ธก์ •ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.', - 'community.purchase.expired': '๊ตฌ๋…์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'community.purchase.expiresOn': '๋งŒ๋ฃŒ ์‹œ๊ฐ„: {date}', - 'community.tabs.detail': '์ง€ํ‘œ ์„ธ๋ถ€์ •๋ณด', - 'community.tabs.backtest': '๋ฐฑํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ', - 'community.tabs.ratings': '์‚ฌ์šฉ์ž ๋ฆฌ๋ทฐ', - 'community.rating.myRating': '๋‚ด ํ‰๊ฐ€', - 'community.rating.stars': '๋ณ„ {count}๊ฐœ', - 'community.rating.commentPlaceholder': '๋‹น์‹ ์˜ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜์„ธ์š”...', - 'community.rating.submit': 'ํ‰๊ฐ€ ์ œ์ถœ', - 'community.rating.modify': '์ˆ˜์ •', - 'community.rating.saveModify': '๋ณ€๊ฒฝ์‚ฌํ•ญ ์ €์žฅ', - 'community.rating.cancel': '์ทจ์†Œ', - 'community.rating.selectRating': '๋“ฑ๊ธ‰์„ ์„ ํƒํ•ด ์ฃผ์„ธ์š”', - 'community.rating.success': 'ํ‰๊ฐ€ ์„ฑ๊ณต', - 'community.rating.modifySuccess': '๋ฆฌ๋ทฐ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'community.rating.failed': 'ํ‰๊ฐ€ ์‹คํŒจ', - 'community.rating.noRatings': '์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค', - 'community.backtest.note': '์œ„ ๋ฐ์ดํ„ฐ๋Š” ๊ณผ๊ฑฐ ๋ฐฑํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์ด๋ฉฐ ์ฐธ๊ณ ์šฉ์ผ ๋ฟ ๋ฏธ๋ž˜ ์ˆ˜์ต์„ ๋‚˜ํƒ€๋‚ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.', - 'community.backtest.noData': '์•„์ง ๋ฐฑํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'community.backtest.uploadHint': '์ž‘์„ฑ์ž๋Š” ์•„์ง ๋ฐฑํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.', - 'community.message.loadFailed': 'ํ‘œ์‹œ๊ธฐ ๋ชฉ๋ก์„ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'community.message.purchaseProcessing': '๊ตฌ๋งค ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘...', - 'community.message.downloadSuccess': '๋‚ด ์ธก์ •ํ•ญ๋ชฉ ๋ชฉ๋ก์— ์ธก์ •ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'community.message.favoriteSuccess': '์ˆ˜์ง‘ ์„ฑ๊ณต', - 'community.message.unfavoriteSuccess': '์ˆ˜์ง‘์„ ์ทจ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'community.message.operationSuccess': '์ž‘์—… ์„ฑ๊ณต', - 'community.message.operationFailed': '์ž‘์—… ์‹คํŒจ', - 'community.banner.readOnly': '์ฝ๊ธฐ ์ „์šฉ', - 'community.banner.loginHint': '๋กœ๊ทธ์ธ ๋˜๋Š” ๋“ฑ๋ก์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ ๋…๋ฆฝ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์—ฌ CSRF ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜์„ธ์š”', - 'community.banner.jumpButton': '๋กœ๊ทธ์ธ/๋“ฑ๋ก์œผ๋กœ ์ด๋™', - 'dashboard.totalEquity': '์ด์ž๋ณธ', - 'dashboard.totalPnL': '์ด์†์ต', - 'dashboard.aiStrategies': 'AI ์ „๋žต', - 'dashboard.indicatorStrategies': '์ง€ํ‘œ ์ „๋žต', - 'dashboard.running': '๋‹ฌ๋ฆฌ๊ธฐ', - 'dashboard.pnlHistory': '์—ญ์‚ฌ์  ์†์ต', - 'dashboard.strategyPerformance': '์ „๋žต ์†์ต๋น„์œจ', - 'dashboard.recentTrades': '์ตœ๊ทผ ๊ฑฐ๋ž˜', - 'dashboard.currentPositions': 'ํ˜„์žฌ ์œ„์น˜', - 'dashboard.table.time': '์‹œ๊ฐ„', - 'dashboard.table.strategy': '์ •์ฑ… ์ด๋ฆ„', - 'dashboard.table.symbol': '๋Œ€์ƒ', - 'dashboard.table.type': '์œ ํ˜•', - 'dashboard.table.side': '๋ฐฉํ–ฅ', - 'dashboard.table.size': '๋ฏธ๊ฒฐ์ œ์•ฝ์ •', - 'dashboard.table.entryPrice': 'ํ‰๊ท  ๊ฐœ์žฅ๊ฐ€', - 'dashboard.table.price': '๊ฐ€๊ฒฉ', - 'dashboard.table.amount': '์ˆ˜๋Ÿ‰', - 'dashboard.table.profit': '์ด์ต๊ณผ ์†์‹ค', - 'dashboard.pendingOrders': '์ฃผ๋ฌธ ์‹คํ–‰ ๊ธฐ๋ก', - 'dashboard.totalOrders': '์ด {total}๊ฑด', - 'dashboard.viewError': '์˜ค๋ฅ˜ ๋ณด๊ธฐ', - 'dashboard.filled': '์ฒด๊ฒฐ๋จ', - 'dashboard.orderTable.time': '์ƒ์„ฑ ์‹œ๊ฐ„', - 'dashboard.orderTable.strategy': '์ „๋žต', - 'dashboard.orderTable.symbol': '๊ฑฐ๋ž˜ ์Œ', - 'dashboard.orderTable.signalType': '์‹ ํ˜ธ ์œ ํ˜•', - 'dashboard.orderTable.amount': '์ˆ˜๋Ÿ‰', - 'dashboard.orderTable.price': '์ฒด๊ฒฐ ๊ฐ€๊ฒฉ', - 'dashboard.orderTable.status': '์ƒํƒœ', - 'dashboard.orderTable.executedAt': '์‹คํ–‰ ์‹œ๊ฐ„', - 'dashboard.signalType.openLong': '๋กฑ ์˜คํ”ˆ', - 'dashboard.signalType.openShort': '์ˆ ์˜คํ”ˆ', - 'dashboard.signalType.closeLong': '๋กฑ ์ฒญ์‚ฐ', - 'dashboard.signalType.closeShort': '์ˆ ์ฒญ์‚ฐ', - 'dashboard.signalType.addLong': '๋กฑ ์ถ”๊ฐ€', - 'dashboard.signalType.addShort': '์ˆ ์ถ”๊ฐ€', - 'dashboard.status.pending': '๋Œ€๊ธฐ ์ค‘', - 'dashboard.status.processing': '์ฒ˜๋ฆฌ ์ค‘', - 'dashboard.status.completed': '์™„๋ฃŒ', - 'dashboard.status.failed': '์‹คํŒจ', - 'dashboard.status.cancelled': '์ทจ์†Œ๋จ', - 'dashboard.table.pnl': '๋ฏธ์‹คํ˜„ ์†์ต', - 'form.basic-form.basic.title': '๊ธฐ๋ณธ ํ˜•ํƒœ', - 'form.basic-form.basic.description': '์–‘์‹ ํŽ˜์ด์ง€๋Š” ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ฑฐ๋‚˜ ํ™•์ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์–‘์‹์€ ๋ฐ์ดํ„ฐ ํ•ญ๋ชฉ์ด ๊ฑฐ์˜ ์—†๋Š” ์–‘์‹ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.', - 'form.basic-form.title.label': '์ œ๋ชฉ', - 'form.basic-form.title.placeholder': '๋ชฉํ‘œ์— ์ด๋ฆ„์„ ์ง€์–ด์ฃผ์„ธ์š”', - 'form.basic-form.title.required': '์ œ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”', - 'form.basic-form.date.label': '์‹œ์ž‘์ผ ๋ฐ ์ข…๋ฃŒ์ผ', - 'form.basic-form.placeholder.start': '์‹œ์ž‘์ผ', - 'form.basic-form.placeholder.end': '์ข…๋ฃŒ์ผ', - 'form.basic-form.date.required': '์‹œ์ž‘์ผ๊ณผ ์ข…๋ฃŒ์ผ์„ ์„ ํƒํ•˜์„ธ์š”.', - 'form.basic-form.goal.label': '๋ชฉํ‘œ ์„ค๋ช…', - 'form.basic-form.goal.placeholder': '๋‹จ๊ณ„๋ณ„ ์—…๋ฌด ๋ชฉํ‘œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'form.basic-form.goal.required': '๋ชฉํ‘œ ์„ค๋ช…์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'form.basic-form.standard.label': '์ธก์ •ํ•˜๋‹ค', - 'form.basic-form.standard.placeholder': '์ธก์ •ํ•ญ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'form.basic-form.standard.required': '์ธก์ •ํ•ญ๋ชฉ์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'form.basic-form.client.label': '๊ณ ๊ฐ', - 'form.basic-form.client.required': '๊ท€ํ•˜๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ณ ๊ฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.', - 'form.basic-form.label.tooltip': '๋Œ€์ƒ ์„œ๋น„์Šค ๋Œ€์ƒ์ž', - 'form.basic-form.client.placeholder': '๊ท€ํ•˜๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ณ ๊ฐ, ๋‚ด๋ถ€ ๊ณ ๊ฐ์„ ์ง์ ‘ @์ด๋ฆ„/์ง์œ„ ๋ฒˆํ˜ธ๋กœ ์„ค๋ช…ํ•˜์‹ญ์‹œ์˜ค.', - 'form.basic-form.invites.label': '๋ฆฌ๋ทฐ์–ด ์ดˆ๋Œ€', - 'form.basic-form.invites.placeholder': '@์ด๋ฆ„/์‚ฌ์›๋ฒˆํ˜ธ๋กœ ์ง์ ‘ ๋ณด๋‚ด์ฃผ์„ธ์š”. ์ตœ๋Œ€ 5๋ช…๊นŒ์ง€ ์ดˆ๋Œ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.', - 'form.basic-form.weight.label': '๋ฌด๊ฒŒ', - 'form.basic-form.weight.placeholder': '์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'form.basic-form.public.label': '๋Œ€์ค‘์„ ๋Œ€์ƒ์œผ๋กœ', - 'form.basic-form.label.help': '๊ณ ๊ฐ๊ณผ ๊ฒ€ํ† ์ž๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.', - 'form.basic-form.radio.public': '๋Œ€์ค‘', - 'form.basic-form.radio.partially-public': '๋ถ€๋ถ„์ ์œผ๋กœ ๊ณต๊ฐœ', - 'form.basic-form.radio.private': '๋น„๊ณต๊ฐœ', - 'form.basic-form.publicUsers.placeholder': '์—ด๋ ค ์žˆ๋‹ค', - 'form.basic-form.option.A': '๋™๋ฃŒ 1', - 'form.basic-form.option.B': '๋™๋ฃŒ 2', - 'form.basic-form.option.C': '๋™๋ฃŒ 3', - 'form.basic-form.email.required': '์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'form.basic-form.email.wrong-format': '์ด๋ฉ”์ผ ์ฃผ์†Œ ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค!', - 'form.basic-form.userName.required': '์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'form.basic-form.password.required': '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'form.basic-form.password.twice': '๋‘ ๋ฒˆ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!', - 'form.basic-form.strength.msg': '6์ž ์ด์ƒ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”. ์‰ฝ๊ฒŒ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”.', - 'form.basic-form.strength.strong': 'ํž˜: ๊ฐ•ํ•œ', - 'form.basic-form.strength.medium': '๊ฐ•๋„: ์ค‘๊ฐ„', - 'form.basic-form.strength.short': '๊ฐ•๋„: ๋„ˆ๋ฌด ์งง์Œ', - 'form.basic-form.confirm-password.required': '๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ™•์ธํ•ด ์ฃผ์„ธ์š”!', - 'form.basic-form.phone-number.required': 'ํœด๋Œ€ํฐ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'form.basic-form.phone-number.wrong-format': 'ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ ํ˜•์‹์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค!', - 'form.basic-form.verification-code.required': '์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'form.basic-form.form.get-captcha': '์ธ์ฆ ์ฝ”๋“œ ๋ฐ›๊ธฐ', - 'form.basic-form.captcha.second': '์ดˆ', - 'form.basic-form.form.optional': '(์„ ํƒ์‚ฌํ•ญ)', - 'form.basic-form.form.submit': '์ œ์ถœ', - 'form.basic-form.form.save': '์ €์žฅ', - 'form.basic-form.email.placeholder': '์ด๋ฉ”์ผ', - 'form.basic-form.password.placeholder': '๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” 6์ž ์ด์ƒ, ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„', - 'form.basic-form.confirm-password.placeholder': '๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ', - 'form.basic-form.phone-number.placeholder': 'ํœด๋Œ€์ „ํ™”๋ฒˆํ˜ธ', - 'form.basic-form.verification-code.placeholder': '์ธ์ฆ์ฝ”๋“œ', - 'result.success.title': '์ œ์ถœ ์„ฑ๊ณต', - 'result.success.description': '์ œ์ถœ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€๋Š” ์ผ๋ จ์˜ ์ž‘์—… ์ž‘์—…์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ํ”ผ๋“œ๋ฐฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ž‘์—…์ธ ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€ ์ „์—ญ ํ”„๋กฌํ”„ํŠธ ํ”ผ๋“œ๋ฐฑ์„ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด ํ…์ŠคํŠธ ์˜์—ญ์—๋Š” ๊ฐ„๋‹จํ•œ ๋ณด์ถฉ ์ง€์นจ์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "๋ฌธ์„œ"๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜ ํšŒ์ƒ‰ ์˜์—ญ์— ๋” ๋ณต์žกํ•œ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'result.success.operate-title': 'ํ”„๋กœ์ ํŠธ ์ด๋ฆ„', - 'result.success.operate-id': 'ํ”„๋กœ์ ํŠธ ID', - 'result.success.principal': '๋‹ด๋‹น์ž', - 'result.success.operate-time': '์œ ํšจ์‹œ๊ฐ„', - 'result.success.step1-title': 'ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ', - 'result.success.step1-operator': '์ฟ  ๋ฆด๋ฆฌ', - 'result.success.step2-title': 'ํ•™๊ณผ ์‚ฌ์ „ ๊ฒ€ํ† ', - 'result.success.step2-operator': '์ €์šฐ ๋งˆ์˜ค๋งˆ์˜ค', - 'result.success.step2-extra': '๊ธด๊ธ‰', - 'result.success.step3-title': '์žฌ๋ฌด ๊ฒ€ํ† ', - 'result.success.step4-title': '์™„๋ฃŒ', - 'result.success.btn-return': '๋ชฉ๋ก์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ', - 'result.success.btn-project': 'ํ•ญ๋ชฉ ๋ณด๊ธฐ', - 'result.success.btn-print': '์ธ์‡„', - 'result.fail.error.title': '์ œ์ถœ ์‹คํŒจ', - 'result.fail.error.description': '๋‹ค์‹œ ์ œ์ถœํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ณ  ์ˆ˜์ •ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.', - 'result.fail.error.hint-title': '์ œ์ถœํ•œ ์ฝ˜ํ…์ธ ์— ๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.', - 'result.fail.error.hint-text1': '๊ท€ํ•˜์˜ ๊ณ„์ •์ด ๋™๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'result.fail.error.hint-btn1': '์ฆ‰์‹œ ํ•ด๋™', - 'result.fail.error.hint-text2': '๊ท€ํ•˜์˜ ๊ณ„์ •์€ ์•„์ง ์‹ ์ฒญํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค', - 'result.fail.error.hint-btn2': '์ง€๊ธˆ ์—…๊ทธ๋ ˆ์ด๋“œ', - 'result.fail.error.btn-text': '์ˆ˜์ •์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ', - 'account.settings.menuMap.custom': '๊ฐœ์ธํ™”', - 'account.settings.menuMap.binding': '๊ณ„์ • ๋ฐ”์ธ๋”ฉ', - 'account.settings.basic.avatar': '์•„๋ฐ”ํƒ€', - 'account.settings.basic.change-avatar': '์•„๋ฐ”ํƒ€ ๋ณ€๊ฒฝ', - 'account.settings.basic.email': '์ด๋ฉ”์ผ', - 'account.settings.basic.email-message': '์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'account.settings.basic.nickname': '๋‹‰๋„ค์ž„', - 'account.settings.basic.nickname-message': '๋‹‰๋„ค์ž„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'account.settings.basic.profile': 'ํ”„๋กœํ•„', - 'account.settings.basic.profile-message': '๊ฐœ์ธ ํ”„๋กœํ•„์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'account.settings.basic.profile-placeholder': 'ํ”„๋กœํ•„', - 'account.settings.basic.country': '๊ตญ๊ฐ€/์ง€์—ญ', - 'account.settings.basic.country-message': '๊ตญ๊ฐ€๋‚˜ ์ง€์—ญ์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'account.settings.basic.geographic': '์ง€๋ฐฉ ๋ฐ ๋„์‹œ', - 'account.settings.basic.geographic-message': '๊ท€ํ•˜์˜ ์‹œ/๋„๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'account.settings.basic.address': '๊ฑฐ๋ฆฌ ์ฃผ์†Œ', - 'account.settings.basic.address-message': '์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'account.settings.basic.phone': '์—ฐ๋ฝ์ฒ˜', - 'account.settings.basic.phone-message': '์—ฐ๋ฝ์ฒ˜๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!', - 'account.settings.basic.update': '๊ธฐ๋ณธ์ •๋ณด ์—…๋ฐ์ดํŠธ', - 'account.settings.basic.update.success': '๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'account.settings.security.strong': '๊ฐ•ํ•œ', - 'account.settings.security.medium': '์•ˆ์œผ๋กœ', - 'account.settings.security.weak': '์•ฝํ•œ', - 'account.settings.security.password': '๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ', - 'account.settings.security.password-description': 'ํ˜„์žฌ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ•๋„:', - 'account.settings.security.phone': '๋ณด์•ˆ ํœด๋Œ€ํฐ', - 'account.settings.security.phone-description': '์ด๋ฏธ ๋ฐ”์ธ๋”ฉ๋œ ํœด๋Œ€ํฐ:', - 'account.settings.security.question': '๋ณด์•ˆ ๋ฌธ์ œ', - 'account.settings.security.question-description': '๋ณด์•ˆ ์งˆ๋ฌธ์ด ์„ค์ •๋˜์ง€ ์•Š์•„ ๊ณ„์ • ๋ณด์•ˆ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'account.settings.security.email': '์ด๋ฉ”์ผ ๋ฐ”์ธ๋”ฉ', - 'account.settings.security.email-description': '์ด๋ฏธ ๋ฐ”์ธ๋”ฉ๋œ ์ด๋ฉ”์ผ ์ฃผ์†Œ:', - 'account.settings.security.mfa': 'MFA ์žฅ์น˜', - 'account.settings.security.mfa-description': 'MFA ๋””๋ฐ”์ด์Šค๊ฐ€ ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ ํ›„ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'account.settings.security.modify': '์ˆ˜์ •', - 'account.settings.security.set': '์„ค์ •', - 'account.settings.security.bind': '๋ฐ”์ธ๋”ฉ', - 'account.settings.binding.taobao': 'ํƒ€์˜ค๋ฐ”์˜ค ๋ฐ”์ธ๋”ฉ', - 'account.settings.binding.taobao-description': 'ํ˜„์žฌ ํƒ€์˜ค๋ฐ”์˜ค ๊ณ„์ •์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค', - 'account.settings.binding.alipay': '์•Œ๋ฆฌํŽ˜์ด ๋ฐ”์ธ๋”ฉ', - 'account.settings.binding.alipay-description': 'Alipay ๊ณ„์ •์ด ํ˜„์žฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.', - 'account.settings.binding.dingding': '๋ฐ”์ธ๋”ฉ ๋”ฉํ†ก', - 'account.settings.binding.dingding-description': 'ํ˜„์žฌ ๋ฐ”์ธ๋”ฉ๋œ DingTalk ๊ณ„์ •์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'account.settings.binding.bind': '๋ฐ”์ธ๋”ฉ', - 'account.settings.notification.password': '๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ', - 'account.settings.notification.password-description': '๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ๋ฉ”์‹œ์ง€๋Š” ์‚ฌ์ดํŠธ ๋ฉ”์‹œ์ง€ ํ˜•์‹์œผ๋กœ ํ†ต๋ณด๋ฉ๋‹ˆ๋‹ค.', - 'account.settings.notification.messages': '์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€', - 'account.settings.notification.messages-description': '์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€๋Š” ์‚ฌ์ดํŠธ ๋ฉ”์‹œ์ง€ ํ˜•์‹์œผ๋กœ ํ†ต๋ณด๋ฉ๋‹ˆ๋‹ค.', - 'account.settings.notification.todo': 'ํ•ด์•ผ ํ•  ์ผ', - 'account.settings.notification.todo-description': 'ํ• ์ผ์€ ์‚ฌ์ดํŠธ ๋‚ด ๋ฉ”์‹œ์ง€๋กœ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.', - 'account.settings.settings.open': '์—ด๋‹ค', - 'account.settings.settings.close': '๋‹ซ๊ธฐ', - 'trading-assistant.title': 'ํŠธ๋ ˆ์ด๋”ฉ ์–ด์‹œ์Šคํ„ดํŠธ', - 'trading-assistant.strategyList': '์ „๋žต ๋ชฉ๋ก', - 'trading-assistant.createStrategy': '์ •์ฑ… ๋งŒ๋“ค๊ธฐ', - 'trading-assistant.noStrategy': '์•„์ง ์ „๋žต์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.selectStrategy': '์„ธ๋ถ€์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด ์™ผ์ชฝ์—์„œ ์ „๋žต์„ ์„ ํƒํ•˜์„ธ์š”.', - 'trading-assistant.startStrategy': '์ถœ์‹œ ์ „๋žต', - 'trading-assistant.stopStrategy': '์ค‘์ง€ ์ „๋žต', - 'trading-assistant.editStrategy': 'ํŽธ์ง‘ ์ „๋žต', - 'trading-assistant.deleteStrategy': '์ •์ฑ… ์‚ญ์ œ', - 'trading-assistant.status.running': '๋‹ฌ๋ฆฌ๊ธฐ', - 'trading-assistant.status.stopped': '์ค‘์ง€๋จ', - 'trading-assistant.status.error': '์˜ค๋ฅ˜', - 'trading-assistant.strategyType.IndicatorStrategy': '๊ธฐ์ˆ  ์ง€ํ‘œ ์ „๋žต', - 'trading-assistant.strategyType.PromptBasedStrategy': '๋‹จ์„œ ์ „๋žต', - 'trading-assistant.strategyType.GridStrategy': '๊ทธ๋ฆฌ๋“œ ์ „๋žต', - 'trading-assistant.tabs.tradingRecords': '๊ฑฐ๋ž˜ ๋‚ด์—ญ', - 'trading-assistant.tabs.positions': '์ง์œ„๊ธฐ๋ก', - 'trading-assistant.tabs.equityCurve': '์ฃผ์‹๊ณก์„ ', - 'trading-assistant.form.step1': '์ง€ํ‘œ ์„ ํƒ', - 'trading-assistant.form.step2': '๊ตํ™˜ ๊ตฌ์„ฑ', - 'trading-assistant.form.step3': '์ „๋žต ๋งค๊ฐœ๋ณ€์ˆ˜', - 'trading-assistant.form.indicator': '์ง€ํ‘œ ์„ ํƒ', - 'trading-assistant.form.indicatorHint': '์ž์‹ ์ด ๊ตฌ๋งคํ–ˆ๊ฑฐ๋‚˜ ์ƒ์„ฑํ•œ ๊ธฐ์ˆ  ์ง€ํ‘œ๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.form.qdtCostHints': '์ „๋žต์„ ์‚ฌ์šฉํ•˜๋ฉด QDT๊ฐ€ ์†Œ๋ชจ๋ฉ๋‹ˆ๋‹ค. ๊ณ„์ •์— QDT ์ž”์•ก์ด ์ถฉ๋ถ„ํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”.', - 'trading-assistant.form.indicatorDescription': 'ํ‘œ์‹œ๊ธฐ ์„ค๋ช…', - 'trading-assistant.form.noDescription': '์•„์ง ์„ค๋ช…์ด ์—†์Šต๋‹ˆ๋‹ค', - 'trading-assistant.form.exchange': '๊ตํ™˜ ์„ ํƒ', - 'trading-assistant.form.apiKey': 'API ํ‚ค', - 'trading-assistant.form.secretKey': '๋น„๋ฐ€ํ‚ค', - 'trading-assistant.form.passphrase': '์•”ํ˜ธ', - 'trading-assistant.form.testConnection': '์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ', - 'trading-assistant.form.strategyName': '์ •์ฑ… ์ด๋ฆ„', - 'trading-assistant.form.symbol': '๊ฑฐ๋ž˜ ์Œ', - 'trading-assistant.form.symbolHint': 'ํ˜„์žฌ๋Š” ์•”ํ˜ธํ™”ํ ๊ฑฐ๋ž˜์Œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค', - 'trading-assistant.form.initialCapital': 'ํˆฌ์ž๊ธˆ์•ก', - 'trading-assistant.form.marketType': '์‹œ์žฅ ์œ ํ˜•', - 'trading-assistant.form.marketTypeFutures': '๊ณ„์•ฝ', - 'trading-assistant.form.marketTypeSpot': '์ŠคํŒŸ', - 'trading-assistant.form.marketTypeHint': '๊ณ„์•ฝ์€ ์–‘๋ฐฉํ–ฅ ๊ฑฐ๋ž˜์™€ ๋ ˆ๋ฒ„๋ฆฌ์ง€๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ˜๋ฉด ํ˜„๋ฌผ์€ ๋กฑ ํฌ์ง€์…˜๋งŒ ์ง€์›ํ•˜๊ณ  ๋ ˆ๋ฒ„๋ฆฌ์ง€๋Š” 1x๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.', - 'trading-assistant.form.leverage': '์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ™œ์šฉ', - 'trading-assistant.form.leverageHint': '๊ณ„์•ฝ : 1~125ํšŒ, ํ˜„๋ฌผ : ๊ณ ์ • 1ํšŒ', - 'trading-assistant.form.spotLeverageFixed': 'ํ˜„๋ฌผ ๊ฑฐ๋ž˜ ๋ ˆ๋ฒ„๋ฆฌ์ง€๋Š” 1x๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.', - 'trading-assistant.form.spotOnlyLongHint': 'ํ˜„๋ฌผ ๊ฑฐ๋ž˜๋Š” ๋งค์ˆ˜ ํฌ์ง€์…˜๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค', - 'trading-assistant.form.tradeDirection': '๊ฑฐ๋ž˜ ๋ฐฉํ–ฅ', - 'trading-assistant.form.tradeDirectionLong': '์˜ค์ง ๊ธธ๋‹ค', - 'trading-assistant.form.tradeDirectionShort': '๋‹จ์ง€ ์งง๋‹ค', - 'trading-assistant.form.tradeDirectionBoth': '์–‘๋ฐฉํ–ฅ ๊ฑฐ๋ž˜', - 'trading-assistant.form.timeframe': '๊ธฐ๊ฐ„', - 'trading-assistant.form.klinePeriod': 'K์„  ๊ธฐ๊ฐ„', - 'trading-assistant.form.timeframe1m': '1๋ถ„', - 'trading-assistant.form.timeframe5m': '5๋ถ„', - 'trading-assistant.form.timeframe15m': '15๋ถ„', - 'trading-assistant.form.timeframe30m': '30๋ถ„', - 'trading-assistant.form.timeframe1H': '1์‹œ๊ฐ„', - 'trading-assistant.form.timeframe4H': '4์‹œ๊ฐ„', - 'trading-assistant.form.timeframe1D': '1์ผ', - 'trading-assistant.form.selectStrategyType': '์ „๋žต ์œ ํ˜• ์„ ํƒ', - 'trading-assistant.form.indicatorStrategy': '์ง€ํ‘œ ์ „๋žต', - 'trading-assistant.form.indicatorStrategyDesc': '๊ธฐ์ˆ  ์ง€ํ‘œ ๊ธฐ๋ฐ˜ ์ž๋™ ๊ฑฐ๋ž˜ ์ „๋žต', - 'trading-assistant.form.aiStrategy': 'AI ์ „๋žต', - 'trading-assistant.form.aiStrategyDesc': 'AI ์ง€๋Šฅํ˜• ์˜์‚ฌ๊ฒฐ์ • ๊ธฐ๋ฐ˜ ์ž๋™ ๊ฑฐ๋ž˜ ์ „๋žต', - 'trading-assistant.form.enableAiFilter': 'AI ์ง€๋Šฅํ˜• ์˜์‚ฌ๊ฒฐ์ • ํ•„ํ„ฐ ํ™œ์„ฑํ™”', - 'trading-assistant.form.enableAiFilterHint': 'ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ง€ํ‘œ ์‹ ํ˜ธ๊ฐ€ AI์— ์˜ํ•ด ํ•„ํ„ฐ๋ง๋˜์–ด ๊ฑฐ๋ž˜ ํ’ˆ์งˆ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค', - 'trading-assistant.form.aiFilterPrompt': '์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กฌํ”„ํŠธ', - 'trading-assistant.form.aiFilterPromptHint': 'AI ํ•„ํ„ฐ๋ง์„ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ์ง€์นจ์„ ์ œ๊ณตํ•˜๊ณ , ๋น„์›Œ๋‘๋ฉด ์‹œ์Šคํ…œ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค', - 'trading-assistant.validation.strategyTypeRequired': '์ „๋žต ์œ ํ˜•์„ ์„ ํƒํ•˜์„ธ์š”', - 'trading-assistant.form.advancedSettings': '๊ณ ๊ธ‰ ์„ค์ •', - 'trading-assistant.form.orderMode': '์ฃผ๋ฌธ ๋ชจ๋“œ', - 'trading-assistant.form.orderModeMaker': '๋ฉ”์ด์ปค', - 'trading-assistant.form.orderModeTaker': '์‹œ์žฅ๊ฐ€(ํ…Œ์ด์ปค)', - 'trading-assistant.form.orderModeHint': '์ง€์ •๊ฐ€ ์ฃผ๋ฌธ ๋ชจ๋“œ๋Š” ์ง€์ •๊ฐ€ ์ฃผ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฒ˜๋ฆฌ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ๋” ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์‹œ์žฅ ๊ฐ€๊ฒฉ ๋ชจ๋“œ๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜๋ฉฐ ์ฒ˜๋ฆฌ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ๋” ๋†’์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.form.makerWaitSec': '์ง€์ •๊ฐ€ ์ฃผ๋ฌธ ๋Œ€๊ธฐ ์‹œ๊ฐ„(์ดˆ)', - 'trading-assistant.form.makerWaitSecHint': '์ฃผ๋ฌธ ํ›„ ๊ฑฐ๋ž˜๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ทจ์†Œํ•˜๊ณ  ์‹œ๊ฐ„ ์ดˆ๊ณผ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.', - 'trading-assistant.form.makerRetries': '๋ณด๋ฅ˜ ์ค‘์ธ ์ฃผ๋ฌธ์— ๋Œ€ํ•œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜', - 'trading-assistant.form.makerRetriesHint': '๋ณด๋ฅ˜ ์ค‘์ธ ์ฃผ๋ฌธ์ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ๋•Œ ์ตœ๋Œ€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜', - 'trading-assistant.form.fallbackToMarket': '์ง€์ •๊ฐ€ ์ฃผ๋ฌธ์ด ์‹คํŒจํ•˜๊ณ  ์‹œ์žฅ ๊ฐ€๊ฒฉ์ด ํ•˜๋ฝํ•ฉ๋‹ˆ๋‹ค.', - 'trading-assistant.form.fallbackToMarketHint': '๊ฐœ์‹œ/์ฒญ์‚ฐ ๋ณด๋ฅ˜ ์ฃผ๋ฌธ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฑฐ๋ž˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์žฅ๊ฐ€ ์ฃผ๋ฌธ์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€.', - 'trading-assistant.form.marginMode': '๋งˆ์ง„ ๋ชจ๋“œ', - 'trading-assistant.form.marginModeCross': '์ „์ฒด ์ฐฝ๊ณ ', - 'trading-assistant.form.marginModeIsolated': '๊ณ ๋ฆฝ๋œ ์œ„์น˜', - 'trading-assistant.form.stopLossPct': '์ •์ง€์†ํ•ด์œจ(%)', - 'trading-assistant.form.stopLossPctHint': '์ •์ง€ ์†์‹ค ๋น„์œจ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 0์€ ์ •์ง€ ์†์‹ค์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.', - 'trading-assistant.form.takeProfitPct': '์ด์ต ์‹คํ˜„ ๋น„์œจ(%)', - 'trading-assistant.form.takeProfitPctHint': '์ด์ต์‹คํ˜„ ๋น„์œจ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 0์€ ์ด์ต์‹คํ˜„์„ ๋น„ํ™œ์„ฑํ™”ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.', - 'trading-assistant.form.signalMode': '์‹ ํ˜ธ ๋ชจ๋“œ', - 'trading-assistant.form.signalModeConfirmed': '๋ชจ๋“œ ํ™•์ธ', - 'trading-assistant.form.signalModeAggressive': '๊ณต๊ฒฉ์  ๋ชจ๋“œ', - 'trading-assistant.form.signalModeHint': 'ํ™•์ธ ๋ชจ๋“œ: ์™„๋ฃŒ๋œ K ๋ผ์ธ๋งŒ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์  ๋ชจ๋“œ: K ๋ผ์ธ ํ˜•์„ฑ๋„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.', - 'trading-assistant.form.cancel': '์ทจ์†Œ', - 'trading-assistant.form.prev': '์ด์ „ ๋‹จ๊ณ„', - 'trading-assistant.form.next': '๋‹ค์Œ ๋‹จ๊ณ„', - 'trading-assistant.form.confirmCreate': '์ƒ์„ฑ ํ™•์ธ', - 'trading-assistant.form.confirmEdit': '๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ', - 'trading-assistant.messages.createSuccess': '์ „๋žต์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.createFailed': '์ •์ฑ…์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.updateSuccess': '์ •์ฑ… ์—…๋ฐ์ดํŠธ ์„ฑ๊ณต', - 'trading-assistant.messages.updateFailed': '์ •์ฑ… ์—…๋ฐ์ดํŠธ ์‹คํŒจ', - 'trading-assistant.messages.deleteSuccess': '์ •์ฑ… ์‚ญ์ œ ์„ฑ๊ณต', - 'trading-assistant.messages.deleteFailed': '์ •์ฑ… ์‚ญ์ œ ์‹คํŒจ', - 'trading-assistant.messages.startSuccess': '์ „๋žต์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'trading-assistant.messages.startFailed': '์ •์ฑ…์„ ์‹œ์ž‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.stopSuccess': '์ „๋žต์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.stopFailed': '์ค‘์ง€ ์ „๋žต์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.loadFailed': '์ •์ฑ… ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.runningWarning': '์ „๋žต์ด ์‹คํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ „๋žต์„ ์ˆ˜์ •ํ•˜๊ธฐ ์ „์— ์ „๋žต์„ ์ค‘์ง€ํ•˜์„ธ์š”.', - 'trading-assistant.messages.deleteConfirmWithName': '"{name}" ์ •์ฑ…์„ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด ์ž‘์—…์€ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.deleteConfirm': '์ด ์ •์ฑ…์„ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด ์ž‘์—…์€ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.loadTradesFailed': '๊ฑฐ๋ž˜ ๊ธฐ๋ก์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.loadPositionsFailed': '์œ„์น˜ ๊ธฐ๋ก์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.loadEquityFailed': '์ž๊ธฐ์ž๋ณธ๊ณก์„  ํš๋“ ์‹คํŒจ', - 'trading-assistant.messages.loadIndicatorsFailed': 'ํ‘œ์‹œ๊ธฐ ๋ชฉ๋ก์„ ๋กœ๋“œํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'trading-assistant.messages.spotLimitations': 'ํ˜„๋ฌผ ๊ฑฐ๋ž˜๋Š” ์ž๋™์œผ๋กœ ๋งค์ˆ˜, 1๋ฐฐ ๋ ˆ๋ฒ„๋ฆฌ์ง€๋กœ ์„ค์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.messages.autoFillApiConfig': '๊ฑฐ๋ž˜์†Œ์˜ ๊ณผ๊ฑฐ API ๊ตฌ์„ฑ์ด ์ž๋™์œผ๋กœ ์ฑ„์›Œ์กŒ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.placeholders.selectIndicator': '์ง€ํ‘œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”', - 'trading-assistant.placeholders.selectExchange': '๊ตํ™˜์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'trading-assistant.placeholders.inputApiKey': 'API ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'trading-assistant.placeholders.inputSecretKey': '๋น„๋ฐ€ํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'trading-assistant.placeholders.inputPassphrase': '์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'trading-assistant.placeholders.inputStrategyName': '์ •์ฑ… ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'trading-assistant.placeholders.selectSymbol': '๊ฑฐ๋ž˜์Œ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'trading-assistant.placeholders.selectTimeframe': '๊ธฐ๊ฐ„์„ ์„ ํƒํ•˜์„ธ์š”.', - 'trading-assistant.placeholders.selectKlinePeriod': 'K์„  ๊ธฐ๊ฐ„์„ ์„ ํƒํ•˜์„ธ์š”', - 'trading-assistant.placeholders.inputAiFilterPrompt': '์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”(์„ ํƒ์‚ฌํ•ญ)', - 'trading-assistant.validation.indicatorRequired': '์ง€ํ‘œ๋ฅผ ์„ ํƒํ•˜์„ธ์š”', - 'trading-assistant.validation.exchangeRequired': '๊ตํ™˜์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'trading-assistant.validation.apiKeyRequired': 'API ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'trading-assistant.validation.secretKeyRequired': '๋น„๋ฐ€ํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'trading-assistant.validation.passphraseRequired': '์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'trading-assistant.validation.exchangeConfigIncomplete': '์ „์ฒด ๊ตํ™˜ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'trading-assistant.validation.testConnectionRequired': '๋จผ์ € "์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ" ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ณ  ์—ฐ๊ฒฐ์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”', - 'trading-assistant.validation.testConnectionFailed': '์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ์„ ํ™•์ธํ•˜๊ณ  ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•˜์„ธ์š”', - 'trading-assistant.validation.strategyNameRequired': '์ •์ฑ… ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'trading-assistant.validation.symbolRequired': '๊ฑฐ๋ž˜์Œ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'trading-assistant.validation.initialCapitalRequired': 'ํˆฌ์ž๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.', - 'trading-assistant.validation.leverageRequired': '๋ ˆ๋ฒ„๋ฆฌ์ง€ ๋น„์œจ์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'trading-assistant.table.time': '์‹œ๊ฐ„', - 'trading-assistant.table.type': '์œ ํ˜•', - 'trading-assistant.table.price': '๊ฐ€๊ฒฉ', - 'trading-assistant.table.amount': '์ˆ˜๋Ÿ‰', - 'trading-assistant.table.value': '๊ธˆ์•ก', - 'trading-assistant.table.commission': '์ทจ๊ธ‰ ์ˆ˜์ˆ˜๋ฃŒ', - 'trading-assistant.table.symbol': '๊ฑฐ๋ž˜์Œ', - 'trading-assistant.table.side': '๋ฐฉํ–ฅ', - 'trading-assistant.table.size': 'ํฌ์ง€์…˜ ์ˆ˜๋Ÿ‰', - 'trading-assistant.table.entryPrice': '๊ฐœ์žฅ ๊ฐ€๊ฒฉ', - 'trading-assistant.table.currentPrice': 'ํ˜„์žฌ ๊ฐ€๊ฒฉ', - 'trading-assistant.table.unrealizedPnl': '๋ฏธ์‹คํ˜„ ์†์ต', - 'trading-assistant.table.pnlPercent': '์†์ต๋น„์œจ', - 'trading-assistant.table.buy': '์‚ฌ๋‹ค', - 'trading-assistant.table.sell': 'ํŒ”๋‹ค', - 'trading-assistant.table.long': '์˜ค๋ž˜ ๊ฐ€์„ธ์š”', - 'trading-assistant.table.short': '์งง์€', - 'trading-assistant.table.noPositions': '์•„์ง ์ง์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.detail.title': '์ „๋žต ์„ธ๋ถ€์ •๋ณด', - 'trading-assistant.detail.strategyName': '์ •์ฑ… ์ด๋ฆ„', - 'trading-assistant.detail.strategyType': '์ „๋žต ์œ ํ˜•', - 'trading-assistant.detail.status': '์ƒํƒœ', - 'trading-assistant.detail.tradingMode': '๊ฑฐ๋ž˜ ๋ชจ๋ธ', - 'trading-assistant.detail.exchange': '๊ตํ™˜', - 'trading-assistant.detail.initialCapital': '์ดˆ๊ธฐ์ž๋ณธ๊ธˆ', - 'trading-assistant.detail.totalInvestment': '์ดํˆฌ์ž๊ธˆ์•ก', - 'trading-assistant.detail.currentEquity': 'ํ˜„์žฌ ์ˆœ์ž์‚ฐ', - 'trading-assistant.detail.totalPnl': '์ด์†์ต', - 'trading-assistant.detail.indicatorName': '์ง€ํ‘œ ์ด๋ฆ„', - 'trading-assistant.detail.maxLeverage': '์ตœ๋Œ€ ๋ ˆ๋ฒ„๋ฆฌ์ง€', - 'trading-assistant.detail.decideInterval': '๊ฒฐ์ • ๊ฐ„๊ฒฉ', - 'trading-assistant.detail.symbols': '๊ฑฐ๋ž˜๊ฐœ์ฒด', - 'trading-assistant.detail.createdAt': '์ƒ์„ฑ ์‹œ๊ฐ„', - 'trading-assistant.detail.updatedAt': '์—…๋ฐ์ดํŠธ ์‹œ๊ฐ„', - 'trading-assistant.detail.llmConfig': 'AI ๋ชจ๋ธ ๊ตฌ์„ฑ', - 'trading-assistant.detail.exchangeConfig': '๊ตํ™˜ ๊ตฌ์„ฑ', - 'trading-assistant.detail.provider': '๊ณต๊ธ‰์ž', - 'trading-assistant.detail.modelId': '๋ชจ๋ธ ID', - 'trading-assistant.detail.close': '๋‹ซ๊ธฐ', - 'trading-assistant.detail.loadFailed': '์ •์ฑ… ์„ธ๋ถ€์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.equity.noData': '์•„์ง ์ˆœ์ž์‚ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'trading-assistant.equity.equity': '์ˆœ์ž์‚ฐ', - 'trading-assistant.exchange.tradingMode': '๊ฑฐ๋ž˜ ๋ชจ๋ธ', - 'trading-assistant.exchange.virtual': '๋ชจ์˜๊ฑฐ๋ž˜', - 'trading-assistant.exchange.live': '์‹ค์ œ ๊ฑฐ๋ž˜', - 'trading-assistant.exchange.selectExchange': '๊ตํ™˜ ์„ ํƒ', - 'trading-assistant.exchange.walletAddress': '์ง€๊ฐ‘ ์ฃผ์†Œ', - 'trading-assistant.exchange.walletAddressPlaceholder': '์ง€๊ฐ‘ ์ฃผ์†Œ(0x๋กœ ์‹œ์ž‘)๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'trading-assistant.exchange.privateKey': '๊ฐœ์ธ ํ‚ค', - 'trading-assistant.exchange.privateKeyPlaceholder': '๊ฐœ์ธํ‚ค(64์ž)๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.', - 'trading-assistant.exchange.testConnection': '์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ', - 'trading-assistant.exchange.connectionSuccess': '์—ฐ๊ฒฐ ์„ฑ๊ณต', - 'trading-assistant.exchange.connectionFailed': '์—ฐ๊ฒฐ ์‹คํŒจ', - 'trading-assistant.exchange.testFailed': '์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ์‹คํŒจ', - 'trading-assistant.exchange.fillComplete': '์ „์ฒด ๊ตํ™˜ ๊ตฌ์„ฑ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'trading-assistant.strategyTypeOptions.ai': 'AI ์ค‘์‹ฌ ์ „๋žต', - 'trading-assistant.strategyTypeOptions.indicator': '๊ธฐ์ˆ  ์ง€ํ‘œ ์ „๋žต', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI ๊ธฐ๋ฐ˜ ์ „๋žต ๊ธฐ๋Šฅ์€ ๊ฐœ๋ฐœ ์ค‘์ด๋ฏ€๋กœ ๊ณ„์† ์ง€์ผœ๋ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI ๊ธฐ๋ฐ˜ ์ „๋žต ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์ค‘', - 'trading-assistant.indicatorType.trend': '์ถ”์„ธ', - 'trading-assistant.indicatorType.momentum': '์ถ”์ง„๋ ฅ', - 'trading-assistant.indicatorType.volatility': '๋ณ€๋™', - 'trading-assistant.indicatorType.volume': '๋ณผ๋ฅจ', - 'trading-assistant.indicatorType.custom': '์‚ฌ์šฉ์ž ์ •์˜', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': '๋ฐ”์ด๋‚ธ์Šค', - 'hyperliquid': '์ดˆ์•ก์ฒด', - 'blockchaincom': '๋ธ”๋ก์ฒด์ธ๋‹ท์ปด', - 'coinbaseexchange': '์ฝ”์ธ๋ฒ ์ด์Šค', - 'gate': 'Gate.io', - 'mexc': '๋ฉ•์‹œ์ฝ”', - 'kraken': 'ํฌ๋ผ์ผ„', - 'bitfinex': '๋น„ํŠธํŒŒ์ด๋„ฅ์Šค', - 'bybit': '๋ฐ”์ด๋น„ํŠธ', - 'kucoin': '์ฟ ์ฝ”์ธ', - 'huobi': 'ํ›„์˜ค๋น„', - 'bitget': '๋น„ํŠธ๊ฒŸ', - 'bitmex': '๋น„ํŠธ๋ฉ•์Šค', - 'deribit': '๋ฐ๋ฆฌ๋น„ํŠธ', - 'phemex': 'ํŽ˜๋ฉ•์Šค', - 'bitmart': '๋น„ํŠธ๋งˆํŠธ', - 'bitstamp': '๋น„ํŠธ์Šคํƒฌํ”„', - 'bittrex': '๋น„ํŠธ๋ ‰์Šค', - 'poloniex': 'ํด๋กœ๋‹‰์Šค', - 'gemini': '์Œ๋‘ฅ์ด์ž๋ฆฌ', - 'cryptocom': 'ํฌ๋ฆฝํ† ๋‹ท์ปด', - 'bitflyer': '๋น„ํŠธํ”Œ๋ผ์ด์–ด', - 'upbit': '์—…๋น„ํŠธ', - 'bithumb': '๋น—์ธ', - 'coinone': '์ฝ”์ธ์›', - 'zb': 'ZB', - 'lbank': 'L์€ํ–‰', - 'bibox': '๋น„๋ฐ•์Šค', - 'bigone': '๋น…์›', - 'bitrue': '๋ฐ”์ดํŠธ๋ฃจ', - 'coinex': '์ฝ”์ธ์—‘์Šค', - 'digifinex': '๋””์ง€ํŒŒ์ด๋„ฅ์Šค', - 'ftx': 'FTX', - 'ftxus': 'FTX ๋ฏธ๊ตญ', - 'binanceus': '๋ฐ”์ด๋‚ธ์Šค ๋ฏธ๊ตญ', - 'binancecoinm': '๋ฐ”์ด๋‚ธ์Šค ์ฝ”์ธ-M', - 'binanceusdm': '๋ฐ”์ด๋‚ธ์Šค USDโ“ˆ-M', - 'deepcoin': '๋”ฅ์ฝ”์ธ' - }, - 'ai-trading-assistant.title': 'AI ํŠธ๋ ˆ์ด๋”ฉ ๋„์šฐ๋ฏธ', - 'ai-trading-assistant.strategyList': '์ „๋žต ๋ชฉ๋ก', - 'ai-trading-assistant.createStrategy': '์ •์ฑ… ๋งŒ๋“ค๊ธฐ', - 'ai-trading-assistant.noStrategy': '์•„์ง ์ „๋žต์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.selectStrategy': '์„ธ๋ถ€์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด ์™ผ์ชฝ์—์„œ ์ „๋žต์„ ์„ ํƒํ•˜์„ธ์š”.', - 'ai-trading-assistant.startStrategy': '์ถœ์‹œ ์ „๋žต', - 'ai-trading-assistant.stopStrategy': '์ค‘์ง€ ์ „๋žต', - 'ai-trading-assistant.editStrategy': 'ํŽธ์ง‘ ์ „๋žต', - 'ai-trading-assistant.deleteStrategy': '์ •์ฑ… ์‚ญ์ œ', - 'ai-trading-assistant.status.running': '๋‹ฌ๋ฆฌ๊ธฐ', - 'ai-trading-assistant.status.stopped': '์ค‘์ง€๋จ', - 'ai-trading-assistant.status.error': '์˜ค๋ฅ˜', - 'ai-trading-assistant.tabs.tradingRecords': '๊ฑฐ๋ž˜ ๋‚ด์—ญ', - 'ai-trading-assistant.tabs.positions': '์ง์œ„๊ธฐ๋ก', - 'ai-trading-assistant.tabs.aiDecisions': 'AI ์˜์‚ฌ๊ฒฐ์ • ๊ธฐ๋ก', - 'ai-trading-assistant.tabs.equityCurve': '์ฃผ์‹๊ณก์„ ', - 'ai-trading-assistant.form.createTitle': 'AI ๊ฑฐ๋ž˜ ์ „๋žต ์ˆ˜๋ฆฝ', - 'ai-trading-assistant.form.editTitle': 'AI ๊ฑฐ๋ž˜ ์ „๋žต ํŽธ์ง‘', - 'ai-trading-assistant.form.strategyName': '์ •์ฑ… ์ด๋ฆ„', - 'ai-trading-assistant.form.modelId': 'AI ๋ชจ๋ธ', - 'ai-trading-assistant.form.modelIdHint': 'API ํ‚ค๋ฅผ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ OpenRouter ์„œ๋น„์Šค ์‚ฌ์šฉ', - 'ai-trading-assistant.form.decideInterval': '๊ฒฐ์ • ๊ฐ„๊ฒฉ', - 'ai-trading-assistant.form.decideInterval5m': '5๋ถ„', - 'ai-trading-assistant.form.decideInterval10m': '10๋ถ„', - 'ai-trading-assistant.form.decideInterval30m': '30๋ถ„', - 'ai-trading-assistant.form.decideInterval1h': '1์‹œ๊ฐ„', - 'ai-trading-assistant.form.decideInterval4h': '4์‹œ๊ฐ„', - 'ai-trading-assistant.form.decideInterval1d': '1์ผ', - 'ai-trading-assistant.form.decideInterval1w': '1์ฃผ', - 'ai-trading-assistant.form.decideIntervalHint': 'AI๊ฐ€ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ', - 'ai-trading-assistant.form.runPeriod': '์‹คํ–‰ ์ฃผ๊ธฐ', - 'ai-trading-assistant.form.runPeriodHint': '์ „๋žต ์‹คํ–‰์˜ ์‹œ์ž‘ ์‹œ๊ฐ„๊ณผ ์ข…๋ฃŒ ์‹œ๊ฐ„', - 'ai-trading-assistant.form.startDate': '์‹œ์ž‘์ผ', - 'ai-trading-assistant.form.endDate': '์ข…๋ฃŒ์ผ', - 'ai-trading-assistant.form.qdtCostTitle': 'QDT ๊ณต์ œ ์ง€์นจ', - 'ai-trading-assistant.form.qdtCostHint': '๊ฐ AI ๊ฒฐ์ •์— ๋Œ€ํ•ด {cost} QDT๊ฐ€ ์ฐจ๊ฐ๋ฉ๋‹ˆ๋‹ค. ๊ท€ํ•˜์˜ ๊ณ„์ •์— ์ถฉ๋ถ„ํ•œ QDT ์ž”์•ก์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ „๋žต์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๊ฐ ๊ฒฐ์ •์— ๋Œ€ํ•ด ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฐจ๊ฐ๋ฉ๋‹ˆ๋‹ค.', - 'ai-trading-assistant.form.apiKey': 'API ํ‚ค', - 'ai-trading-assistant.form.exchange': '๊ตํ™˜ ์„ ํƒ', - 'ai-trading-assistant.form.secretKey': '๋น„๋ฐ€ํ‚ค', - 'ai-trading-assistant.form.passphrase': '์•”ํ˜ธ', - 'ai-trading-assistant.form.testConnection': '์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ', - 'ai-trading-assistant.form.symbol': '๊ฑฐ๋ž˜ ์Œ', - 'ai-trading-assistant.form.symbolHint': '๊ฑฐ๋ž˜ํ•  ๊ฑฐ๋ž˜์Œ์„ ์„ ํƒํ•˜์„ธ์š”', - 'ai-trading-assistant.form.initialCapital': 'ํˆฌ์ž๊ธˆ์•ก(๋งˆ์ง„)', - 'ai-trading-assistant.form.leverage': '์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ™œ์šฉ', - 'ai-trading-assistant.form.timeframe': '๊ธฐ๊ฐ„', - 'ai-trading-assistant.form.timeframe1m': '1๋ถ„', - 'ai-trading-assistant.form.timeframe5m': '5๋ถ„', - 'ai-trading-assistant.form.timeframe15m': '15๋ถ„', - 'ai-trading-assistant.form.timeframe30m': '30๋ถ„', - 'ai-trading-assistant.form.timeframe1H': '1์‹œ๊ฐ„', - 'ai-trading-assistant.form.timeframe4H': '4์‹œ๊ฐ„', - 'ai-trading-assistant.form.timeframe1D': '1์ผ', - 'ai-trading-assistant.form.marketType': '์‹œ์žฅ ์œ ํ˜•', - 'ai-trading-assistant.form.marketTypeFutures': '๊ณ„์•ฝ', - 'ai-trading-assistant.form.marketTypeSpot': '์ŠคํŒŸ', - 'ai-trading-assistant.form.totalPnl': '์ด์†์ต', - 'ai-trading-assistant.form.customPrompt': '๋งž์ถค ํ”„๋กฌํ”„ํŠธ ๋‹จ์–ด', - 'ai-trading-assistant.form.customPromptHint': '์„ ํƒ ์‚ฌํ•ญ, AI ๊ฑฐ๋ž˜ ์ „๋žต ๋ฐ ์˜์‚ฌ ๊ฒฐ์ • ๋…ผ๋ฆฌ๋ฅผ ์‚ฌ์šฉ์ž ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.', - 'ai-trading-assistant.form.cancel': '์ทจ์†Œ', - 'ai-trading-assistant.form.prev': '์ด์ „ ๋‹จ๊ณ„', - 'ai-trading-assistant.form.next': '๋‹ค์Œ ๋‹จ๊ณ„', - 'ai-trading-assistant.form.confirmCreate': '์ƒ์„ฑ ํ™•์ธ', - 'ai-trading-assistant.form.confirmEdit': '๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ', - 'ai-trading-assistant.messages.createSuccess': '์ „๋žต์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.messages.createFailed': '์ •์ฑ…์„ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.messages.updateSuccess': '์ •์ฑ… ์—…๋ฐ์ดํŠธ ์„ฑ๊ณต', - 'ai-trading-assistant.messages.updateFailed': '์ •์ฑ… ์—…๋ฐ์ดํŠธ ์‹คํŒจ', - 'ai-trading-assistant.messages.deleteSuccess': '์ •์ฑ… ์‚ญ์ œ ์„ฑ๊ณต', - 'ai-trading-assistant.messages.deleteFailed': '์ •์ฑ… ์‚ญ์ œ ์‹คํŒจ', - 'ai-trading-assistant.messages.startSuccess': '์ „๋žต์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'ai-trading-assistant.messages.startFailed': '์ •์ฑ…์„ ์‹œ์ž‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.messages.stopSuccess': '์ „๋žต์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.messages.stopFailed': '์ค‘์ง€ ์ „๋žต์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.messages.loadFailed': '์ •์ฑ… ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'AI ๊ฒฐ์ • ๊ธฐ๋ก์„ ๊ฐ€์ ธ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.messages.deleteConfirm': '์ด ์ •์ฑ…์„ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด ์ž‘์—…์€ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.placeholders.inputStrategyName': '์ •์ฑ… ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'ai-trading-assistant.placeholders.selectModelId': 'AI ๋ชจ๋ธ์„ ์„ ํƒํ•ด ์ฃผ์„ธ์š”', - 'ai-trading-assistant.placeholders.selectDecideInterval': '๊ฒฐ์ • ๊ฐ„๊ฒฉ์„ ์„ ํƒํ•˜์„ธ์š”.', - 'ai-trading-assistant.placeholders.startTime': '์‹œ์ž‘ ์‹œ๊ฐ„', - 'ai-trading-assistant.placeholders.endTime': '์ข…๋ฃŒ ์‹œ๊ฐ„', - 'ai-trading-assistant.placeholders.inputApiKey': 'API ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'ai-trading-assistant.placeholders.selectExchange': '๊ตํ™˜์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'ai-trading-assistant.placeholders.inputSecretKey': '๋น„๋ฐ€ํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'ai-trading-assistant.placeholders.inputPassphrase': '์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'ai-trading-assistant.placeholders.selectSymbol': '๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฑฐ๋ž˜์Œ์„ ์„ ํƒํ•˜์„ธ์š”: BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': '๊ธฐ๊ฐ„์„ ์„ ํƒํ•˜์„ธ์š”.', - 'ai-trading-assistant.placeholders.inputCustomPrompt': '๋งž์ถค ํ”„๋กฌํ”„ํŠธ ๋‹จ์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”(์„ ํƒ์‚ฌํ•ญ).', - 'ai-trading-assistant.validation.strategyNameRequired': '์ •์ฑ… ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜์„ธ์š”.', - 'ai-trading-assistant.validation.modelIdRequired': 'AI ๋ชจ๋ธ์„ ์„ ํƒํ•ด ์ฃผ์„ธ์š”', - 'ai-trading-assistant.validation.runPeriodRequired': '์‹คํ–‰ ์ฃผ๊ธฐ๋ฅผ ์„ ํƒํ•˜์„ธ์š”.', - 'ai-trading-assistant.validation.apiKeyRequired': 'API ํ‚ค๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'ai-trading-assistant.validation.exchangeRequired': '๊ตํ™˜์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'ai-trading-assistant.validation.secretKeyRequired': '๋น„๋ฐ€ํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”', - 'ai-trading-assistant.validation.symbolRequired': '๊ฑฐ๋ž˜์Œ์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”', - 'ai-trading-assistant.validation.initialCapitalRequired': 'ํˆฌ์ž๊ธˆ์•ก์„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.', - 'ai-trading-assistant.table.time': '์‹œ๊ฐ„', - 'ai-trading-assistant.table.type': '์œ ํ˜•', - 'ai-trading-assistant.table.price': '๊ฐ€๊ฒฉ', - 'ai-trading-assistant.table.amount': '์ˆ˜๋Ÿ‰', - 'ai-trading-assistant.table.value': '๊ธˆ์•ก', - 'ai-trading-assistant.table.symbol': '๊ฑฐ๋ž˜ ์Œ', - 'ai-trading-assistant.table.side': '๋ฐฉํ–ฅ', - 'ai-trading-assistant.table.size': 'ํฌ์ง€์…˜ ์ˆ˜๋Ÿ‰', - 'ai-trading-assistant.table.entryPrice': '๊ฐœ์žฅ ๊ฐ€๊ฒฉ', - 'ai-trading-assistant.table.currentPrice': 'ํ˜„์žฌ ๊ฐ€๊ฒฉ', - 'ai-trading-assistant.table.unrealizedPnl': '๋ฏธ์‹คํ˜„ ์†์ต', - 'ai-trading-assistant.table.profit': '์ด์ต๊ณผ ์†์‹ค', - 'ai-trading-assistant.table.openLong': '๊ธธ๊ฒŒ ์—ด๋‹ค', - 'ai-trading-assistant.table.closeLong': 'ํ•€๋“€์˜ค', - 'ai-trading-assistant.table.openShort': '์˜คํ”ˆ ์‡ผํŠธ', - 'ai-trading-assistant.table.closeShort': '๋น„์–ด ์žˆ์Œ', - 'ai-trading-assistant.table.addLong': '๊ฐ€๋—', - 'ai-trading-assistant.table.addShort': '์งง๊ฒŒ ์ถ”๊ฐ€ํ•˜๋‹ค', - 'ai-trading-assistant.table.closeShortProfit': '์ˆ ํฌ์ง€์…˜์—์„œ ์ด์ต์„ ์–ป์œผ์„ธ์š”', - 'ai-trading-assistant.table.closeShortStop': '์†์‹ค ์ค‘์ง€', - 'ai-trading-assistant.table.closeLongProfit': '์˜ค๋ž˜ ๋ฉˆ์ถ”๊ณ  ์ด์ต์„ ์–ป์œผ์‹ญ์‹œ์˜ค', - 'ai-trading-assistant.table.closeLongStop': '์†์‹ค ์ค‘์ง€', - 'ai-trading-assistant.table.buy': '์‚ฌ๋‹ค', - 'ai-trading-assistant.table.sell': 'ํŒ”๋‹ค', - 'ai-trading-assistant.table.long': '์˜ค๋ž˜ ๊ฐ€์„ธ์š”', - 'ai-trading-assistant.table.short': '์งง์€', - 'ai-trading-assistant.table.hold': '๋ณด๋ฅ˜', - 'ai-trading-assistant.table.reasoning': '๋ถ„์„ ์ด์œ ', - 'ai-trading-assistant.table.decisions': '์˜์‚ฌ๊ฒฐ์ •', - 'ai-trading-assistant.table.riskAssessment': '์œ„ํ—˜ ํ‰๊ฐ€', - 'ai-trading-assistant.table.confidence': '์ž์‹ ๊ฐ', - 'ai-trading-assistant.table.totalRecords': '์ด {total}๊ฐœ ๊ธฐ๋ก', - 'ai-trading-assistant.table.noPositions': '์•„์ง ์ง์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.detail.title': '์ „๋žต ์„ธ๋ถ€์ •๋ณด', - 'ai-trading-assistant.equity.noData': '์•„์ง ์ˆœ์ž์‚ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.equity.equity': '์ˆœ์ž์‚ฐ', - 'ai-trading-assistant.exchange.testFailed': '์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ ์‹คํŒจ', - 'ai-trading-assistant.exchange.connectionSuccess': '์—ฐ๊ฒฐ ์„ฑ๊ณต', - 'ai-trading-assistant.exchange.connectionFailed': '์—ฐ๊ฒฐ ์‹คํŒจ', - 'ai-trading-assistant.form.advancedSettings': '๊ณ ๊ธ‰ ์„ค์ •', - 'ai-trading-assistant.form.orderMode': '์ฃผ๋ฌธ ๋ชจ๋“œ', - 'ai-trading-assistant.form.orderModeMaker': '๋ฉ”์ด์ปค', - 'ai-trading-assistant.form.orderModeTaker': '์‹œ์žฅ๊ฐ€(ํ…Œ์ด์ปค)', - 'ai-trading-assistant.form.orderModeHint': '์ง€์ •๊ฐ€ ์ฃผ๋ฌธ ๋ชจ๋“œ๋Š” ์ง€์ •๊ฐ€ ์ฃผ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์ฒ˜๋ฆฌ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ๋” ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์‹œ์žฅ ๊ฐ€๊ฒฉ ๋ชจ๋“œ๋Š” ์ฆ‰์‹œ ์‹คํ–‰๋˜๋ฉฐ ์ฒ˜๋ฆฌ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ๋” ๋†’์Šต๋‹ˆ๋‹ค.', - 'ai-trading-assistant.form.makerWaitSec': '์ง€์ •๊ฐ€ ์ฃผ๋ฌธ ๋Œ€๊ธฐ ์‹œ๊ฐ„(์ดˆ)', - 'ai-trading-assistant.form.makerWaitSecHint': '์ฃผ๋ฌธ ํ›„ ๊ฑฐ๋ž˜๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ์ทจ์†Œํ•˜๊ณ  ์‹œ๊ฐ„ ์ดˆ๊ณผ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”.', - 'ai-trading-assistant.form.makerRetries': '๋ณด๋ฅ˜ ์ค‘์ธ ์ฃผ๋ฌธ์— ๋Œ€ํ•œ ์žฌ์‹œ๋„ ํšŸ์ˆ˜', - 'ai-trading-assistant.form.makerRetriesHint': '๋ณด๋ฅ˜ ์ค‘์ธ ์ฃผ๋ฌธ์ด ์‹คํ–‰๋˜์ง€ ์•Š์„ ๋•Œ ์ตœ๋Œ€ ์žฌ์‹œ๋„ ํšŸ์ˆ˜', - 'ai-trading-assistant.form.fallbackToMarket': '์ง€์ •๊ฐ€ ์ฃผ๋ฌธ์ด ์‹คํŒจํ•˜๊ณ  ์‹œ์žฅ ๊ฐ€๊ฒฉ์ด ํ•˜๋ฝํ•ฉ๋‹ˆ๋‹ค.', - 'ai-trading-assistant.form.fallbackToMarketHint': '๊ฐœ์‹œ/์ฒญ์‚ฐ ๋ณด๋ฅ˜ ์ฃผ๋ฌธ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๊ฑฐ๋ž˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์‹œ์žฅ๊ฐ€ ์ฃผ๋ฌธ์œผ๋กœ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€.', - 'ai-trading-assistant.form.marginMode': '๋งˆ์ง„ ๋ชจ๋“œ', - 'ai-trading-assistant.form.marginModeCross': '์ „์ฒด ์ฐฝ๊ณ ', - 'ai-trading-assistant.form.marginModeIsolated': '๊ณ ๋ฆฝ๋œ ์œ„์น˜', - 'ai-analysis.title': 'ํ€€ํŠธ ํŠธ๋ ˆ์ด๋”ฉ ์—”์ง„', - 'ai-analysis.system.online': '์˜จ๋ผ์ธ', - 'ai-analysis.system.agents': '๋Œ€๋ฆฌ์ธ', - 'ai-analysis.system.active': 'ํ™œ์„ฑ', - 'ai-analysis.system.stage': '๋ฌด๋Œ€', - 'ai-analysis.panel.roster': '์—์ด์ „ํŠธ ๋ผ์ธ์—…', - 'ai-analysis.panel.thinking': '์ƒ๊ฐํ•˜๋‹ค...', - 'ai-analysis.panel.done': '์™„๋ฃŒ', - 'ai-analysis.panel.standby': '๋Œ€๊ธฐ', - 'ai-analysis.input.title': 'ํ€€ํŠธ ํŠธ๋ ˆ์ด๋”ฉ ์—”์ง„', - 'ai-analysis.input.placeholder': '๋Œ€์ƒ ์ž์‚ฐ ์„ ํƒ(์˜ˆ: BTC/USDT)', - 'ai-analysis.input.watchlist': '์˜ต์…˜ ์ฃผ์‹', - 'ai-analysis.input.start': '๋ถ„์„ ์‹œ์ž‘', - 'ai-analysis.input.recent': '์ตœ๊ทผ ์ž‘์—…:', - 'ai-analysis.vis.stage': '๋ฌด๋Œ€', - 'ai-analysis.vis.processing': '์ฒ˜๋ฆฌ', - 'ai-analysis.result.complete': '๋ถ„์„ ์™„๋ฃŒ', - 'ai-analysis.result.signal': '์ตœ์ข… ์‹ ํ˜ธ', - 'ai-analysis.result.confidence': '์ž์‹ ๊ฐ:', - 'ai-analysis.result.new': '์ƒˆ๋กœ์šด ๋ถ„์„', - 'ai-analysis.result.full': '์ „์ฒด ๋ณด๊ณ ์„œ ๋ณด๊ธฐ', - 'ai-analysis.logs.title': '์‹œ์Šคํ…œ ๋กœ๊ทธ', - 'ai-analysis.modal.title': '๊ธฐ๋ฐ€ ๋ณด๊ณ ์„œ', - 'ai-analysis.modal.fundamental': '๊ธฐ๋ณธ์  ๋ถ„์„', - 'ai-analysis.modal.technical': '๊ธฐ์ˆ ์  ๋ถ„์„', - 'ai-analysis.modal.sentiment': '๊ฐ์ • ๋ถ„์„', - 'ai-analysis.modal.risk': '์œ„ํ—˜ ํ‰๊ฐ€', - 'ai-analysis.stage.idle': '๋Œ€๊ธฐ', - 'ai-analysis.stage.1': '1๋‹จ๊ณ„: ๋‹ค์ฐจ์› ๋ถ„์„', - 'ai-analysis.stage.2': '2๋‹จ๊ณ„: ์žฅ๋‹จ๊ธฐ ํ† ๋ก ', - 'ai-analysis.stage.3': '3๋‹จ๊ณ„: ์ „๋žต์  ๊ณ„ํš', - 'ai-analysis.stage.4': '๋„ค ๋ฒˆ์งธ ๋‹จ๊ณ„: ์œ„ํ—˜ ํ†ต์ œ ๊ฒ€ํ† ', - 'ai-analysis.stage.complete': '์™„๋ฃŒ', - 'ai-analysis.agent.investment_director': 'ํˆฌ์ž ์ด์‚ฌ', - 'ai-analysis.agent.role.investment_director': '์ข…ํ•ฉ ๋ถ„์„ ๋ฐ ์ตœ์ข… ๊ฒฐ๋ก ', - 'ai-analysis.agent.market': '์‹œ์žฅ ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.market': '๊ธฐ์ˆ  ๋ฐ ์‹œ์žฅ ๋ฐ์ดํ„ฐ', - 'ai-analysis.agent.fundamental': '๊ธฐ๋ณธ ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.fundamental': '์žฌ๋ฌด ๋ฐ ํ‰๊ฐ€', - 'ai-analysis.agent.technical': '๊ธฐ์ˆ  ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.technical': '๊ธฐ์ˆ  ์ง€ํ‘œ ๋ฐ ์ฐจํŠธ', - 'ai-analysis.agent.news': '๋‰ด์Šค ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.news': '๊ธ€๋กœ๋ฒŒ ๋‰ด์Šค ํ•„ํ„ฐ', - 'ai-analysis.agent.sentiment': '๊ฐ์ • ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.sentiment': '์‚ฌํšŒ์  ๋ฐ ์ •์„œ์ ', - 'ai-analysis.agent.risk': '์œ„ํ—˜ ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.risk': '๊ธฐ๋ณธ ๋ฆฌ์Šคํฌ ์ ๊ฒ€', - 'ai-analysis.agent.bull': '๋‚™๊ด€์ ์ธ ์—ฐ๊ตฌ์›', - 'ai-analysis.agent.role.bull': '์„ฑ์žฅ์ด‰๋งค ์ฑ„๊ตด', - 'ai-analysis.agent.bear': '์•ฝ์„ธ ์—ฐ๊ตฌ์›', - 'ai-analysis.agent.role.bear': '์œ„ํ—˜ ๋ฐ ๊ฒฐํ•จ ์กฐ์‚ฌ', - 'ai-analysis.agent.manager': '์—ฐ๊ตฌ ๊ด€๋ฆฌ์ž', - 'ai-analysis.agent.role.manager': 'ํ† ๋ก  ์ง„ํ–‰์ž', - 'ai-analysis.agent.trader': '์ƒ์ธ', - 'ai-analysis.agent.role.trader': '๊ฒฝ์˜ ์ „๋žต๊ฐ€', - 'ai-analysis.agent.risky': 'ํ™œ๋™๊ฐ€ ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.risky': '๊ณต๊ฒฉ์ ์ธ ์ „๋žต', - 'ai-analysis.agent.neutral': '๊ท ํ˜• ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.neutral': '๊ท ํ˜• ์ „๋žต', - 'ai-analysis.agent.safe': '๋ณด์ˆ˜์ ์ธ ๋ถ„์„๊ฐ€', - 'ai-analysis.agent.role.safe': '๋ณด์ˆ˜์  ์ „๋žต', - 'ai-analysis.agent.cro': '์œ„ํ—˜ ํ†ต์ œ ๊ด€๋ฆฌ์ž(CRO)', - 'ai-analysis.agent.role.cro': '์ตœ์ข… ์˜์‚ฌ๊ฒฐ์ • ๊ถŒํ•œ', - 'ai-analysis.script.market': '์ฃผ์š” ๊ฑฐ๋ž˜์†Œ์—์„œ OHLCV ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ค‘...', - 'ai-analysis.script.fundamental': '๋ถ„๊ธฐ๋ณ„ ์žฌ๋ฌด ๋ณด๊ณ ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ค‘...', - 'ai-analysis.script.technical': '๊ธฐ์ˆ ์ง€ํ‘œ ๋ฐ ์ฐจํŠธ ํŒจํ„ด ๋ถ„์„ ์ค‘...', - 'ai-analysis.script.news': '๊ธ€๋กœ๋ฒŒ ๊ธˆ์œต ๋‰ด์Šค๋ฅผ ์Šค์บ”ํ•˜๋Š” ์ค‘...', - 'ai-analysis.script.sentiment': '์†Œ์…œ๋ฏธ๋””์–ด ํŠธ๋ Œ๋“œ ๋ถ„์„โ€ฆ', - 'ai-analysis.script.risk': '์—ญ์‚ฌ์  ๋ณ€๋™์„ฑ์„ ๊ณ„์‚ฐํ•˜๋Š” ์ค‘...', - 'invite.inviteLink': '์ดˆ๋Œ€๋งํฌ', - 'invite.copy': '๋งํฌ ๋ณต์‚ฌ', - 'invite.copySuccess': '์„ฑ๊ณต์ ์œผ๋กœ ๋ณต์‚ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!', - 'invite.copyFailed': '๋ณต์‚ฌํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ๋ณต์‚ฌํ•˜์„ธ์š”.', - 'invite.noInviteLink': '์ดˆ๋Œ€ ๋งํฌ๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.', - 'invite.totalInvites': '๋ˆ„์  ์ดˆ๋Œ€', - 'invite.totalReward': '๋ˆ„์  ๋ณด์ƒ', - 'invite.rules': '์ดˆ๋Œ€ ๊ทœ์น™', - 'invite.rule1': '์นœ๊ตฌ๋ฅผ ๋“ฑ๋กํ•˜๋„๋ก ์„ฑ๊ณต์ ์œผ๋กœ ์ดˆ๋Œ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ณด์ƒ์„ ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.', - 'invite.rule2': '์ดˆ๋Œ€ํ•œ ์นœ๊ตฌ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๊ฑฐ๋ž˜๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ์ถ”๊ฐ€ ๋ณด์ƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.', - 'invite.rule3': '์ดˆ๋Œ€ ๋ณด์ƒ์€ ๊ท€ํ•˜์˜ ๊ณ„์ •์œผ๋กœ ์ง์ ‘ ์ „์†ก๋ฉ๋‹ˆ๋‹ค', - 'invite.inviteList': '์ดˆ๋Œ€ ๋ชฉ๋ก', - 'invite.tasks': '์„ ๊ต ์„ผํ„ฐ', - 'invite.inviteeName': '์ดˆ๋Œ€๋ฐ›์€ ์‚ฌ๋žŒ', - 'invite.inviteTime': '์ดˆ๋Œ€ ์‹œ๊ฐ„', - 'invite.status': '์ƒํƒœ', - 'invite.reward': '๋ณด์ƒ', - 'invite.active': 'ํ™œ์„ฑ', - 'invite.inactive': 'ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์Œ', - 'invite.completed': '์™„๋ฃŒ๋จ', - 'invite.claimed': '์ ‘์ˆ˜๋จ', - 'invite.pending': '์™„๋ฃŒ ์˜ˆ์ •', - 'invite.goToTask': '์™„๋ฃŒํ•˜๋‹ค', - 'invite.claimReward': '๋ณด์ƒ ์ฒญ๊ตฌ', - 'invite.verify': 'ํ™•์ธ ์™„๋ฃŒ', - 'invite.verifySuccess': 'ํ™•์ธ์— ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์™„๋ฃŒ', - 'invite.verifyNotCompleted': '์ž‘์—…์ด ์•„์ง ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ž‘์—…์„ ์™„๋ฃŒํ•˜์„ธ์š”.', - 'invite.verifyFailed': 'ํ™•์ธ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'invite.claimSuccess': '{reward} QDT๋ฅผ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค!', - 'invite.claimFailed': '์ˆ˜์ง‘ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ๋„ํ•ด ์ฃผ์„ธ์š”.', - 'invite.totalRecords': '์ด {total}๊ฐœ ๊ธฐ๋ก', - 'invite.task.twitter.title': 'X(ํŠธ์œ„ํ„ฐ)๋กœ ๋ฆฌํŠธ์œ—', - 'invite.task.twitter.desc': '๊ณต์‹ ํŠธ์œ—์„ X(ํŠธ์œ„ํ„ฐ) ๊ณ„์ •์— ๊ณต์œ ํ•˜์„ธ์š”', - 'invite.task.youtube.title': 'YouTube ์ฑ„๋„์„ ํŒ”๋กœ์šฐํ•˜์„ธ์š”', - 'invite.task.youtube.desc': '๊ณต์‹ YouTube ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๊ณ  ํŒ”๋กœ์šฐํ•˜์„ธ์š”.', - 'invite.task.telegram.title': 'ํ…”๋ ˆ๊ทธ๋žจ ๊ทธ๋ฃน์— ๊ฐ€์ž…ํ•˜์„ธ์š”', - 'invite.task.telegram.desc': '๊ณต์‹ ํ…”๋ ˆ๊ทธ๋žจ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ทธ๋ฃน์— ๊ฐ€์ž…ํ•˜์„ธ์š”', - 'invite.task.discord.title': 'Discord ์„œ๋ฒ„์— ๊ฐ€์ž…ํ•˜์„ธ์š”', - 'invite.task.discord.desc': 'Discord ์ปค๋ฎค๋‹ˆํ‹ฐ ์„œ๋ฒ„์— ๊ฐ€์ž…ํ•˜์„ธ์š”', - 'message': '-', - 'layouts.usermenu.dialog.title': '์ •๋ณด', - 'layouts.usermenu.dialog.content': '์ •๋ง๋กœ ๋กœ๊ทธ์•„์›ƒํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?', - 'layouts.userLayout.title': '๋ถˆํ™•์‹ค์„ฑ ์†์—์„œ ์ง„์‹ค์„ ์ฐพ์•„๋ผ', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell โ†’ open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': '๋ฉ”๋ชจ๋ฆฌ/๋ฆฌํ”Œ๋ ‰์…˜ ์„ค์ •', - 'settings.group.reflection_worker': '์ž๋™ ๋ฆฌํ”Œ๋ ‰์…˜ ๊ฒ€์ฆ ์›Œ์ปค', - 'settings.field.ENABLE_AGENT_MEMORY': '์—์ด์ „ํŠธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': '๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ์‚ฌ์šฉ(๋กœ์ปฌ)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': '์ž„๋ฒ ๋”ฉ ์ฐจ์›', - 'settings.field.AGENT_MEMORY_TOP_K': 'Top-K ์กฐํšŒ ๊ฐœ์ˆ˜', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'ํ›„๋ณด ์œˆ๋„์šฐ ํฌ๊ธฐ', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': '์‹œ๊ฐ„ ๊ฐ์‡  ๋ฐ˜๊ฐ๊ธฐ(์ผ)', - 'settings.field.AGENT_MEMORY_W_SIM': '์œ ์‚ฌ๋„ ๊ฐ€์ค‘์น˜', - 'settings.field.AGENT_MEMORY_W_RECENCY': '์‹œ๊ฐ„ ๊ฐ€์ค‘์น˜', - 'settings.field.AGENT_MEMORY_W_RETURNS': '์ˆ˜์ต ๊ฐ€์ค‘์น˜', - 'settings.field.ENABLE_REFLECTION_WORKER': '์ž๋™ ๊ฒ€์ฆ ์‚ฌ์šฉ', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': '๊ฒ€์ฆ ์ฃผ๊ธฐ(์ดˆ)', - - // Profile - Notification Settings (์•Œ๋ฆผ ์„ค์ •) - 'profile.notifications.title': '์•Œ๋ฆผ ์„ค์ •', - 'profile.notifications.hint': '๊ธฐ๋ณธ ์•Œ๋ฆผ ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•˜์„ธ์š”. ์ž์‚ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ์•Œ๋ฆผ ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค', - 'profile.notifications.defaultChannels': '๊ธฐ๋ณธ ์•Œ๋ฆผ ์ฑ„๋„', - 'profile.notifications.browser': '์•ฑ ๋‚ด ์•Œ๋ฆผ', - 'profile.notifications.email': '์ด๋ฉ”์ผ', - 'profile.notifications.phone': 'SMS', - 'profile.notifications.telegramBotToken': 'Telegram Bot Token', - 'profile.notifications.telegramBotTokenPlaceholder': 'Telegram Bot Token์„ ์ž…๋ ฅํ•˜์„ธ์š”', - 'profile.notifications.telegramBotTokenHint': '@BotFather์—์„œ ๋ด‡์„ ๋งŒ๋“ค์–ด Token์„ ๋ฐ›์œผ์„ธ์š”', - 'profile.notifications.telegramChatId': 'Telegram Chat ID', - 'profile.notifications.telegramPlaceholder': 'Telegram Chat ID๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” (์˜ˆ: 123456789)', - 'profile.notifications.telegramHint': '@userinfobot์— /start๋ฅผ ๋ณด๋‚ด Chat ID๋ฅผ ๋ฐ›์œผ์„ธ์š”', - 'profile.notifications.notifyEmail': '์•Œ๋ฆผ ์ด๋ฉ”์ผ', - 'profile.notifications.emailPlaceholder': '์•Œ๋ฆผ์„ ๋ฐ›์„ ์ด๋ฉ”์ผ ์ฃผ์†Œ', - 'profile.notifications.emailHint': '๊ธฐ๋ณธ๊ฐ’์€ ๊ณ„์ • ์ด๋ฉ”์ผ์ด๋ฉฐ ๋‹ค๋ฅธ ์ด๋ฉ”์ผ๋„ ์„ค์ • ๊ฐ€๋Šฅ', - 'profile.notifications.phonePlaceholder': '์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” (์˜ˆ: +821012345678)', - 'profile.notifications.phoneHint': '๊ด€๋ฆฌ์ž๊ฐ€ Twilio ์„œ๋น„์Šค๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค', - 'profile.notifications.discordWebhook': 'Discord Webhook', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'Discord ์„œ๋ฒ„ ์„ค์ •์—์„œ Webhook์„ ์ƒ์„ฑํ•˜์„ธ์š”', - 'profile.notifications.webhookUrl': 'Webhook URL', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': '์ปค์Šคํ…€ Webhook URL, POST JSON์œผ๋กœ ์•Œ๋ฆผ ์ „์†ก', - 'profile.notifications.webhookToken': 'Webhook Token (์„ ํƒ)', - 'profile.notifications.webhookTokenPlaceholder': '์š”์ฒญ ์ธ์ฆ์šฉ Bearer Token', - 'profile.notifications.webhookTokenHint': 'Authorization: Bearer Token์œผ๋กœ Webhook์— ์ „์†ก', - 'profile.notifications.testBtn': 'ํ…Œ์ŠคํŠธ ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ', - 'profile.notifications.saveSuccess': '์•Œ๋ฆผ ์„ค์ •์ด ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค', - 'profile.notifications.selectChannel': '์ตœ์†Œ ํ•˜๋‚˜์˜ ์•Œ๋ฆผ ์ฑ„๋„์„ ์„ ํƒํ•˜์„ธ์š”', - 'profile.notifications.fillTelegramToken': 'Telegram Bot Token์„ ์ž…๋ ฅํ•˜์„ธ์š”', - 'profile.notifications.fillTelegram': 'Telegram Chat ID๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”', - 'profile.notifications.fillEmail': '์•Œ๋ฆผ ์ด๋ฉ”์ผ์„ ์ž…๋ ฅํ•˜์„ธ์š”', - 'profile.notifications.testSent': 'ํ…Œ์ŠคํŠธ ์•Œ๋ฆผ์ด ์ „์†ก๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ฆผ ์ฑ„๋„์„ ํ™•์ธํ•˜์„ธ์š”' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/th-TH.js b/quantdinger_vue/src/locales/lang/th-TH.js deleted file mode 100644 index c1200b9..0000000 --- a/quantdinger_vue/src/locales/lang/th-TH.js +++ /dev/null @@ -1,1823 +0,0 @@ -import antdThTH from 'ant-design-vue/es/locale-provider/th_TH' -import momentTH from 'moment/locale/th' - -const components = { - antLocale: antdThTH, - momentName: 'th', - momentLocale: momentTH -} - -const locale = { - 'submit': 'เธชเนˆเธ‡', - 'save': 'เธšเธฑเธ™เธ—เธถเธ', - 'submit.ok': 'เธชเนˆเธ‡เธชเธณเน€เธฃเน‡เธˆ', - 'save.ok': 'เธšเธฑเธ™เธ—เธถเธเน€เธฃเธตเธขเธšเธฃเน‰เธญเธขเนเธฅเน‰เธง', - 'menu.welcome': 'เธขเธดเธ™เธ”เธตเธ•เน‰เธญเธ™เธฃเธฑเธš', - 'menu.home': 'เธซเธ™เน‰เธฒเนเธฃเธ', - 'menu.dashboard': 'เนเธ”เธŠเธšเธญเธฃเนŒเธ”', - 'menu.dashboard.indicator': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'menu.dashboard.community': 'เธŠเธธเธกเธŠเธ™เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'menu.dashboard.analysis': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเน€เธญเน„เธญ', - 'menu.dashboard.tradingAssistant': 'เธœเธนเน‰เธŠเนˆเธงเธขเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'menu.dashboard.aiTradingAssistant': 'เธœเธนเน‰เธŠเนˆเธงเธขเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข AI', - 'menu.dashboard.signalRobot': 'เธซเธธเนˆเธ™เธขเธ™เธ•เนŒเธชเธฑเธเธเธฒเธ“', - 'menu.dashboard.monitor': 'เธซเธ™เน‰เธฒเธ•เธดเธ”เธ•เธฒเธก', - 'menu.dashboard.workplace': 'เน‚เธ•เนŠเธฐเธ—เธณเธ‡เธฒเธ™', - 'menu.form': 'เธซเธ™เน‰เธฒเนเธšเธšเธŸเธญเธฃเนŒเธก', - 'menu.form.basic-form': 'เนเธšเธšเธŸเธญเธฃเนŒเธกเธžเธทเน‰เธ™เธเธฒเธ™', - 'menu.form.step-form': 'เนเธšเธšเธŸเธญเธฃเนŒเธกเธ—เธตเธฅเธฐเธ‚เธฑเน‰เธ™เธ•เธญเธ™', - 'menu.form.step-form.info': 'เนเธšเธšเธŸเธญเธฃเนŒเธกเธ—เธตเธฅเธฐเธ‚เธฑเน‰เธ™เธ•เธญเธ™ (เธเธฃเธญเธเธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเน‚เธญเธ™)', - 'menu.form.step-form.confirm': 'เนเธšเธšเธŸเธญเธฃเนŒเธกเธ—เธตเธฅเธฐเธ‚เธฑเน‰เธ™เธ•เธญเธ™ (เธขเธทเธ™เธขเธฑเธ™เธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเน‚เธญเธ™)', - 'menu.form.step-form.result': 'เนเธšเธšเธŸเธญเธฃเนŒเธกเธ—เธตเธฅเธฐเธ‚เธฑเน‰เธ™เธ•เธญเธ™ (เธชเธกเธšเธนเธฃเธ“เนŒ)', - 'menu.form.advanced-form': 'เนเธšเธšเธŸเธญเธฃเนŒเธกเธ‚เธฑเน‰เธ™เธชเธนเธ‡', - 'menu.list': 'เธซเธ™เน‰เธฒเธฃเธฒเธขเธเธฒเธฃ', - 'menu.list.table-list': 'เนเธšเธšเธŸเธญเธฃเนŒเธกเธชเธญเธšเธ–เธฒเธก', - 'menu.list.basic-list': 'เธฃเธฒเธขเธเธฒเธฃเธกเธฒเธ•เธฃเธเธฒเธ™', - 'menu.list.card-list': 'เธฃเธฒเธขเธเธฒเธฃเธเธฒเธฃเนŒเธ”', - 'menu.list.search-list': 'เธฃเธฒเธขเธเธฒเธฃเธ„เน‰เธ™เธซเธฒ', - 'menu.list.search-list.articles': 'เธฃเธฒเธขเธเธฒเธฃเธ„เน‰เธ™เธซเธฒ (เธšเธ—เธ„เธงเธฒเธก)', - 'menu.list.search-list.projects': 'เธฃเธฒเธขเธเธฒเธฃเธ„เน‰เธ™เธซเธฒ (เน‚เธ„เธฃเธ‡เธเธฒเธฃ)', - 'menu.list.search-list.applications': 'เธฃเธฒเธขเธเธฒเธฃเธ„เน‰เธ™เธซเธฒ (เนเธญเธ›)', - 'menu.profile': 'เธซเธ™เน‰เธฒเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”', - 'menu.profile.basic': 'เธซเธ™เน‰เธฒเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เน€เธšเธทเน‰เธญเธ‡เธ•เน‰เธ™', - 'menu.profile.advanced': 'เธซเธ™เน‰เธฒเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธ‚เธฑเน‰เธ™เธชเธนเธ‡', - 'menu.result': 'เธซเธ™เน‰เธฒเธœเธฅเธฅเธฑเธžเธ˜เนŒ', - 'menu.result.success': 'เธซเธ™เน‰เธฒเธ„เธงเธฒเธกเธชเธณเน€เธฃเน‡เธˆ', - 'menu.result.fail': 'เธซเธ™เน‰เธฒเธ„เธงเธฒเธกเธฅเน‰เธกเน€เธซเธฅเธง', - 'menu.exception': 'เธซเธ™เน‰เธฒเธ‚เน‰เธญเธขเธเน€เธงเน‰เธ™', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': 'เธ‚เน‰เธญเธœเธดเธ”เธžเธฅเธฒเธ”เธ‚เธญเธ‡เธ—เธฃเธดเธเน€เธเธญเธฃเนŒ', - 'menu.account': 'เธซเธ™เน‰เธฒเธชเนˆเธงเธ™เธ•เธฑเธง', - 'menu.account.center': 'เธจเธนเธ™เธขเนŒเธชเนˆเธงเธ™เธšเธธเธ„เธ„เธฅ', - 'menu.account.settings': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธชเนˆเธงเธ™เธšเธธเธ„เธ„เธฅ', - 'menu.account.trigger': 'เธ‚เน‰เธญเธœเธดเธ”เธžเธฅเธฒเธ”เธ‚เธญเธ‡เธ—เธฃเธดเธเน€เธเธญเธฃเนŒ', - 'menu.account.logout': 'เธญเธญเธเธˆเธฒเธเธฃเธฐเธšเธš', - 'menu.wallet': 'เธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™เธ‚เธญเธ‡เธ‰เธฑเธ™', - 'menu.docs': 'เธจเธนเธ™เธขเนŒเน€เธญเธเธชเธฒเธฃ', - 'menu.docs.detail': 'เธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เน€เธญเธเธชเธฒเธฃ', - 'menu.header.refreshPage': 'เธฃเธตเน€เธŸเธฃเธŠเธซเธ™เน‰เธฒ', - 'menu.invite.friends': 'เธŠเธงเธ™เน€เธžเธทเนˆเธญเธ™', - 'app.setting.pagestyle': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธชเน„เธ•เธฅเนŒเน‚เธ”เธขเธฃเธงเธก', - 'app.setting.pagestyle.light': 'เน€เธกเธ™เธนเธชเน„เธ•เธฅเนŒเธชเธ”เนƒเธช', - 'app.setting.pagestyle.dark': 'เธชเน„เธ•เธฅเนŒเน€เธกเธ™เธนเธชเธตเน€เธ‚เน‰เธก', - 'app.setting.pagestyle.realdark': 'เน‚เธซเธกเธ”เธกเธทเธ”', - 'app.setting.themecolor': 'เธชเธตเธ‚เธญเธ‡เธ˜เธตเธก', - 'app.setting.navigationmode': 'เน‚เธซเธกเธ”เธเธฒเธฃเธ™เธณเธ—เธฒเธ‡', - 'app.setting.sidemenu.nav': 'เธเธฒเธฃเธ™เธณเธ—เธฒเธ‡เนเธ–เธšเธ”เน‰เธฒเธ™เธ‚เน‰เธฒเธ‡', - 'app.setting.topmenu.nav': 'เธเธฒเธฃเธ™เธณเธ—เธฒเธ‡เนเธ–เธšเธ”เน‰เธฒเธ™เธšเธ™', - 'app.setting.content-width': 'เธ„เธงเธฒเธกเธเธงเน‰เธฒเธ‡เธ‚เธญเธ‡เธžเธทเน‰เธ™เธ—เธตเนˆเน€เธ™เธทเน‰เธญเธซเธฒ', - 'app.setting.content-width.tooltip': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ™เธตเน‰เธˆเธฐเธกเธตเธœเธฅเน€เธ‰เธžเธฒเธฐเน€เธกเธทเนˆเธญ [เธเธฒเธฃเธ™เธณเธ—เธฒเธ‡เนเธ–เธšเธ”เน‰เธฒเธ™เธšเธ™]', - 'app.setting.content-width.fixed': 'เธ—เธตเนˆเธ•เธฒเธขเธ•เธฑเธง', - 'app.setting.content-width.fluid': 'เธชเธ•เธฃเธตเธกเธกเธดเนˆเธ‡', - 'app.setting.fixedheader': 'เธชเนˆเธงเธ™เธซเธฑเธงเธ„เธ‡เธ—เธตเนˆ', - 'app.setting.fixedheader.tooltip': 'เธเธณเธซเธ™เธ”เธ„เนˆเธฒเน„เธ”เน‰เน€เธกเธทเนˆเธญเนเธเน‰เน„เธ‚เธชเนˆเธงเธ™เธซเธฑเธง', - 'app.setting.autoHideHeader': 'เธ‹เนˆเธญเธ™เธชเนˆเธงเธ™เธซเธฑเธงเน€เธกเธทเนˆเธญเน€เธฅเธทเนˆเธญเธ™', - 'app.setting.fixedsidebar': 'เน€เธกเธ™เธนเธ”เน‰เธฒเธ™เธ‚เน‰เธฒเธ‡เธ„เธ‡เธ—เธตเนˆ', - 'app.setting.sidemenu': 'เน€เธ„เน‰เธฒเน‚เธ„เธฃเธ‡เน€เธกเธ™เธนเธ”เน‰เธฒเธ™เธ‚เน‰เธฒเธ‡', - 'app.setting.topmenu': 'เน€เธ„เน‰เธฒเน‚เธ„เธฃเธ‡เน€เธกเธ™เธนเธ”เน‰เธฒเธ™เธšเธ™', - 'app.setting.othersettings': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธญเธทเนˆเธ™เน†', - 'app.setting.weakmode': 'เน‚เธซเธกเธ”เธ„เธงเธฒเธกเธญเนˆเธญเธ™เนเธญเธ‚เธญเธ‡เธชเธต', - 'app.setting.multitab': 'เน‚เธซเธกเธ”เธซเธฅเธฒเธขเนเธ—เน‡เธš', - 'app.setting.copy': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธเธฒเธฃเธ—เธณเธชเธณเน€เธ™เธฒ', - 'app.setting.loading': 'เธเธณเธฅเธฑเธ‡เน‚เธซเธฅเธ”เธ˜เธตเธก', - 'app.setting.copyinfo': 'เธ„เธฑเธ”เธฅเธญเธเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธชเธณเน€เธฃเน‡เธˆ src/config/defaultSettings.js', - 'app.setting.copy.success': 'เธ„เธฑเธ”เธฅเธญเธเน€เธชเธฃเน‡เธˆเนเธฅเน‰เธง', - 'app.setting.copy.fail': 'เธเธฒเธฃเธ„เธฑเธ”เธฅเธญเธเธฅเน‰เธกเน€เธซเธฅเธง', - 'app.setting.theme.switching': 'เน€เธ›เธฅเธตเนˆเธขเธ™เธ˜เธตเธก!', - 'app.setting.production.hint': 'เนเธ–เธšเธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒเนƒเธŠเน‰เธชเธณเธซเธฃเธฑเธšเธเธฒเธฃเธ”เธนเธ•เธฑเธงเธญเธขเนˆเธฒเธ‡เนƒเธ™เธชเธ เธฒเธžเนเธงเธ”เธฅเน‰เธญเธกเธเธฒเธฃเธžเธฑเธ’เธ™เธฒเน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™ เนเธฅเธฐเธˆเธฐเน„เธกเนˆเนเธชเธ”เธ‡เนƒเธ™เธชเธ เธฒเธžเนเธงเธ”เธฅเน‰เธญเธกเธเธฒเธฃเนƒเธŠเน‰เธ‡เธฒเธ™เธˆเธฃเธดเธ‡ เน‚เธ›เธฃเธ”เธ„เธฑเธ”เธฅเธญเธเนเธฅเธฐเนเธเน‰เน„เธ‚เน„เธŸเธฅเนŒเธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒเธ”เน‰เธงเธขเธ•เธ™เน€เธญเธ‡', - 'app.setting.themecolor.daybreak': 'เธฃเธธเนˆเธ‡เธญเธฃเธธเธ“เธชเธตเธŸเน‰เธฒ (เธ„เนˆเธฒเน€เธฃเธดเนˆเธกเธ•เน‰เธ™)', - 'app.setting.themecolor.dust': 'เธžเธฅเธšเธ„เนˆเธณ', - 'app.setting.themecolor.volcano': 'เธ เธนเน€เธ‚เธฒเน„เธŸ', - 'app.setting.themecolor.sunset': 'เธžเธฃเธฐเธญเธฒเธ—เธดเธ•เธขเนŒเธ•เธ', - 'app.setting.themecolor.cyan': 'เธซเธกเธดเธ‡เธŠเธดเธ‡', - 'app.setting.themecolor.green': 'เธญเธญเน‚เธฃเธฃเนˆเธฒเธชเธตเน€เธ‚เธตเธขเธง', - 'app.setting.themecolor.geekblue': 'เน€เธเธดเธ™เธšเธฃเธฃเธขเธฒเธขเธชเธตเธŸเน‰เธฒ', - 'app.setting.themecolor.purple': 'เน€เธˆเธตเธขเธ‡เธ‹เธต', - 'app.setting.tooltip': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธซเธ™เน‰เธฒ', - 'user.login.userName': 'เธŠเธทเนˆเธญเธœเธนเน‰เนƒเธŠเน‰', - 'user.login.password': 'เธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'user.login.username.placeholder': 'เธšเธฑเธเธŠเธต: เธœเธนเน‰เธ”เธนเนเธฅเธฃเธฐเธšเธš', - 'user.login.password.placeholder': 'เธฃเธซเธฑเธชเธœเนˆเธฒเธ™: admin เธซเธฃเธทเธญ ant.design', - 'user.login.message-invalid-credentials': 'เธเธฒเธฃเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธฅเน‰เธกเน€เธซเธฅเธง เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเธญเธตเน€เธกเธฅเนเธฅเธฐเธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™เธ‚เธญเธ‡เธ„เธธเธ“', - 'user.login.message-invalid-verification-code': 'เธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™เธœเธดเธ”เธžเธฅเธฒเธ”', - 'user.login.tab-login-credentials': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธšเธฑเธเธŠเธต', - 'user.login.tab-login-email': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธญเธตเน€เธกเธฅ', - 'user.login.tab-login-mobile': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒเธกเธทเธญเธ–เธทเธญ', - 'user.login.captcha.placeholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™เธเธฃเธฒเธŸเธดเธ', - 'user.login.mobile.placeholder': 'เธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒ', - 'user.login.mobile.verification-code.placeholder': 'เธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™', - 'user.login.email.placeholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅเธ‚เธญเธ‡เธ„เธธเธ“', - 'user.login.email.verification-code.placeholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™', - 'user.login.email.sending': 'เธเธณเธฅเธฑเธ‡เธชเนˆเธ‡เธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™...', - 'user.login.email.send-success-title': 'เธ„เธณเนƒเธšเน‰', - 'user.login.email.send-success': 'เธชเนˆเธ‡เธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™เธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเธญเธตเน€เธกเธฅเธ‚เธญเธ‡เธ„เธธเธ“', - 'user.login.sms.send-success': 'เธชเนˆเธ‡เธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™เธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเธ‚เน‰เธญเธ„เธงเธฒเธก', - 'user.login.remember-me': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด', - 'user.login.forgot-password': 'เธฅเธทเธกเธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'user.login.sign-in-with': 'เธงเธดเธ˜เธตเธเธฒเธฃเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธญเธทเนˆเธ™ เน†', - 'user.login.signup': 'เธฅเธ‡เธ—เธฐเน€เธšเธตเธขเธ™เธšเธฑเธเธŠเธต', - 'user.login.login': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธš', - 'user.register.register': 'เธฅเธ‡เธ—เธฐเน€เธšเธตเธขเธ™', - 'user.register.email.placeholder': 'เธˆเธ”เธซเธกเธฒเธข', - 'user.register.password.placeholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธญเธขเนˆเธฒเธ‡เธ™เน‰เธญเธข 6 เธ•เธฑเธงเธญเธฑเธเธฉเธฃ เธเธฃเธธเธ“เธฒเธญเธขเนˆเธฒเนƒเธŠเน‰เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ—เธตเนˆเธ„เธฒเธ”เน€เธ”เธฒเน„เธ”เน‰เธ‡เนˆเธฒเธข', - 'user.register.password.popover-message': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธญเธขเนˆเธฒเธ‡เธ™เน‰เธญเธข 6 เธ•เธฑเธงเธญเธฑเธเธฉเธฃ เธเธฃเธธเธ“เธฒเธญเธขเนˆเธฒเนƒเธŠเน‰เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ—เธตเนˆเธ„เธฒเธ”เน€เธ”เธฒเน„เธ”เน‰เธ‡เนˆเธฒเธข', - 'user.register.confirm-password.placeholder': 'เธขเธทเธ™เธขเธฑเธ™เธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'user.register.get-verification-code': 'เธฃเธฑเธšเธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™', - 'user.register.sign-in': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเน‚เธ”เธขเนƒเธŠเน‰เธšเธฑเธเธŠเธตเธ—เธตเนˆเธกเธตเธญเธขเธนเนˆ', - 'user.register-result.msg': 'เธšเธฑเธเธŠเธตเธ‚เธญเธ‡เธ„เธธเธ“: {email} เธเธฒเธฃเธฅเธ‡เธ—เธฐเน€เธšเธตเธขเธ™เธชเธณเน€เธฃเน‡เธˆ', - 'user.register-result.activation-email': 'เธญเธตเน€เธกเธฅเน€เธ›เธดเธ”เนƒเธŠเน‰เธ‡เธฒเธ™เน„เธ”เน‰เธ–เธนเธเธชเนˆเธ‡เน„เธ›เธขเธฑเธ‡เธเธฅเนˆเธญเธ‡เธˆเธ”เธซเธกเธฒเธขเธ‚เธญเธ‡เธ„เธธเธ“เนเธฅเน‰เธง เนเธฅเธฐเธกเธตเธญเธฒเธขเธธ 24 เธŠเธฑเนˆเธงเน‚เธกเธ‡ เน‚เธ›เธฃเธ”เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธญเธตเน€เธกเธฅเธ‚เธญเธ‡เธ„เธธเธ“เธ—เธฑเธ™เธ—เธตเนเธฅเธฐเธ„เธฅเธดเธเธฅเธดเธ‡เธเนŒเนƒเธ™เธญเธตเน€เธกเธฅเน€เธžเธทเนˆเธญเน€เธ›เธดเธ”เนƒเธŠเน‰เธ‡เธฒเธ™เธšเธฑเธเธŠเธตเธ‚เธญเธ‡เธ„เธธเธ“', - 'user.register-result.back-home': 'เธเธฅเธฑเธšเน„เธ›เธ—เธตเนˆเธซเธ™เน‰เธฒเนเธฃเธ', - 'user.register-result.view-mailbox': 'เธ•เธฃเธงเธˆเธชเธญเธšเธเธฅเนˆเธญเธ‡เธˆเธ”เธซเธกเธฒเธขเธ‚เธญเธ‡เธ„เธธเธ“', - 'user.email.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅเธ‚เธญเธ‡เธ„เธธเธ“!', - 'user.email.wrong-format': 'เธฃเธนเธ›เนเธšเธšเธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅเน„เธกเนˆเธ–เธนเธเธ•เน‰เธญเธ‡!', - 'user.userName.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธŠเธทเนˆเธญเธšเธฑเธเธŠเธตเธซเธฃเธทเธญเธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅเธ‚เธญเธ‡เธ„เธธเธ“', - 'user.password.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ‚เธญเธ‡เธ„เธธเธ“!', - 'user.password.twice.msg': 'เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ—เธตเนˆเธ›เน‰เธญเธ™เธชเธญเธ‡เธ„เธฃเธฑเน‰เธ‡เน„เธกเนˆเธ•เธฃเธ‡เธเธฑเธ™!', - 'user.password.strength.msg': 'เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เน„เธกเนˆเนเธ‚เน‡เธ‡เนเธเธฃเนˆเธ‡เธžเธญ', - 'user.password.strength.strong': 'เธ„เธงเธฒเธกเนเธ‚เน‡เธ‡เนเธเธฃเนˆเธ‡: เนเธ‚เน‡เธ‡เนเธเธฃเนˆเธ‡', - 'user.password.strength.medium': 'เธ„เธงเธฒเธกเนเธ‚เน‡เธ‡เนเธเธฃเนˆเธ‡: เธ›เธฒเธ™เธเธฅเธฒเธ‡', - 'user.password.strength.low': 'เธ„เธงเธฒเธกเนเธฃเธ‡: เธ•เนˆเธณ', - 'user.password.strength.short': 'เธ„เธงเธฒเธกเนเธฃเธ‡: เธชเธฑเน‰เธ™เน€เธเธดเธ™เน„เธ›', - 'user.confirm-password.required': 'เธเธฃเธธเธ“เธฒเธขเธทเธ™เธขเธฑเธ™เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ‚เธญเธ‡เธ„เธธเธ“!', - 'user.phone-number.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒเธกเธทเธญเธ–เธทเธญเธ—เธตเนˆเธ–เธนเธเธ•เน‰เธญเธ‡', - 'user.phone-number.wrong-format': 'เธฃเธนเธ›เนเธšเธšเธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒเธกเธทเธญเธ–เธทเธญเธœเธดเธ”!', - 'user.verification-code.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™!', - 'user.captcha.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™เธเธฃเธฒเธŸเธดเธ!', - 'user.login.infos': 'QuantDinger เน€เธ›เน‡เธ™เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญเน€เธชเธฃเธดเธกเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธซเธธเน‰เธ™เนเธšเธšเธซเธฅเธฒเธขเธ•เธฑเธงเนเธ—เธ™เธ”เน‰เธงเธข AI เนเธฅเธฐเน„เธกเนˆเธกเธตเธ„เธธเธ“เธชเธกเธšเธฑเธ•เธดเนƒเธ™เธเธฒเธฃเนƒเธซเน‰เธ„เธณเธ›เธฃเธถเธเธฉเธฒเธ”เน‰เธฒเธ™เธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เนƒเธ™เธซเธฅเธฑเธเธ—เธฃเธฑเธžเธขเนŒเธœเธฅเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ เธ„เธฐเนเธ™เธ™ เนเธฅเธฐเธ„เธงเธฒเธกเธ„เธดเธ”เน€เธซเน‡เธ™เธญเน‰เธฒเธ‡เธญเธดเธ‡เธ—เธฑเน‰เธ‡เธซเธกเธ”เนƒเธ™เนเธžเธฅเธ•เธŸเธญเธฃเนŒเธกเธ–เธนเธเธชเธฃเน‰เธฒเธ‡เธ‚เธถเน‰เธ™เน‚เธ”เธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธดเน‚เธ”เธข AI เธ•เธฒเธกเธ‚เน‰เธญเธกเธนเธฅเนƒเธ™เธญเธ”เธตเธ• เนเธฅเธฐเนƒเธŠเน‰เน€เธžเธทเนˆเธญเธเธฒเธฃเน€เธฃเธตเธขเธ™เธฃเธนเน‰ เธเธฒเธฃเธงเธดเธˆเธฑเธข เนเธฅเธฐเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„เน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™ เนเธฅเธฐเน„เธกเนˆเธ–เธทเธญเน€เธ›เน‡เธ™เธ„เธณเนเธ™เธฐเธ™เธณเนƒเธ™เธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เธซเธฃเธทเธญเธžเธทเน‰เธ™เธเธฒเธ™เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเนƒเธ”เน†เธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เนƒเธ™เธซเธธเน‰เธ™เน€เธเธตเนˆเธขเธงเธ‚เน‰เธญเธ‡เธเธฑเธšเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ•เนˆเธฒเธ‡เน† เน€เธŠเนˆเธ™ เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ”เน‰เธฒเธ™เธ•เธฅเธฒเธ” เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ”เน‰เธฒเธ™เธชเธ เธฒเธžเธ„เธฅเนˆเธญเธ‡ เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ”เน‰เธฒเธ™เธ™เน‚เธขเธšเธฒเธข เธฏเธฅเธฏ เธ‹เธถเนˆเธ‡เธญเธฒเธˆเธ™เธณเน„เธ›เธชเธนเนˆเธเธฒเธฃเธชเธนเธเน€เธชเธตเธขเน€เธ‡เธดเธ™เธ•เน‰เธ™เน„เธ”เน‰เธœเธนเน‰เนƒเธŠเน‰เธ„เธงเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธญเธขเนˆเธฒเธ‡เธญเธดเธชเธฃเธฐเน‚เธ”เธขเธžเธดเธˆเธฒเธฃเธ“เธฒเธˆเธฒเธเธเธฒเธฃเธขเธญเธกเธฃเธฑเธšเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ‚เธญเธ‡เธ•เธ™เน€เธญเธ‡ เนเธฅเธฐเธžเธคเธ•เธดเธเธฃเธฃเธกเธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เนเธฅเธฐเธœเธฅเธ—เธตเนˆเธ•เธฒเธกเธกเธฒเธ—เธตเนˆเน€เธเธดเธ”เธˆเธฒเธเธเธฒเธฃเนƒเธŠเน‰เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญเธ™เธตเน‰เธˆเธฐเธ•เน‰เธญเธ‡เธ•เธเน€เธ›เน‡เธ™เธ เธฒเธฃเธฐเธ‚เธญเธ‡เธœเธนเน‰เนƒเธŠเน‰เธ•เธฅเธฒเธ”เธกเธตเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เนเธฅเธฐเธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เธ•เน‰เธญเธ‡เธฃเธฐเธกเธฑเธ”เธฃเธฐเธงเธฑเธ‡', - 'user.login.tab-login-web3': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธš Web3', - 'user.login.web3.tip': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเน‚เธ”เธขเนƒเธŠเน‰เธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™', - 'user.login.web3.connect': 'เน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™เนเธฅเธฐเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธš', - 'user.login.web3.no-wallet': 'เธ•เธฃเธงเธˆเน„เธกเนˆเธžเธšเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™', - 'user.login.web3.no-address': 'เน„เธกเนˆเน„เธ”เน‰เธฃเธฑเธšเธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™', - 'user.login.web3.nonce-failed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเธซเธกเธฒเธขเน€เธฅเธ‚เธชเธธเนˆเธกเน„เธ”เน‰', - 'user.login.web3.verify-failed': 'เธเธฒเธฃเธ•เธฃเธงเธˆเธชเธญเธšเธฅเธฒเธขเน€เธ‹เน‡เธ™เธฅเน‰เธกเน€เธซเธฅเธง', - 'user.login.web3.success': 'เน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธชเธณเน€เธฃเน‡เธˆ', - 'user.login.web3.failed': 'เธเธฒเธฃเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธš Wallet เธฅเน‰เธกเน€เธซเธฅเธง', - 'nav.no_wallet': 'เธ•เธฃเธงเธˆเน„เธกเนˆเธžเธšเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™', - 'nav.copy': 'เธชเธณเน€เธ™เธฒ', - 'nav.copy_success': 'เธ„เธฑเธ”เธฅเธญเธเน€เธฃเธตเธขเธšเธฃเน‰เธญเธขเนเธฅเน‰เธง', - 'user.login.oauth.google': 'เธฅเธ‡เธŠเธทเนˆเธญเน€เธ‚เน‰เธฒเนƒเธŠเน‰เธ‡เธฒเธ™เธ”เน‰เธงเธข Google', - 'user.login.oauth.github': 'เธฅเธ‡เธŠเธทเนˆเธญเน€เธ‚เน‰เธฒเนƒเธŠเน‰เธ”เน‰เธงเธข GitHub', - 'user.login.oauth.loading': 'เธเธณเธฅเธฑเธ‡เน€เธ›เธฅเธตเนˆเธขเธ™เน€เธชเน‰เธ™เธ—เธฒเธ‡เน„เธ›เธขเธฑเธ‡เธซเธ™เน‰เธฒเธเธฒเธฃเธญเธ™เธธเธเธฒเธ•...', - 'user.login.oauth.failed': 'เธเธฒเธฃเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธš OAuth เธฅเน‰เธกเน€เธซเธฅเธง', - 'user.login.oauth.get-url-failed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเธฅเธดเธ‡เธเนŒเธเธฒเธฃเธญเธ™เธธเธเธฒเธ•เน„เธ”เน‰', - 'user.login.subtitle': 'เธ‚เธฑเธšเน€เธ„เธฅเธทเนˆเธญเธ™เธ‚เน‰เธญเธกเธนเธฅเน€เธŠเธดเธ‡เธฅเธถเธเน€เธŠเธดเธ‡เธ›เธฃเธดเธกเธฒเธ“เธชเธนเนˆเธ•เธฅเธฒเธ”เน‚เธฅเธ', - 'user.login.legal.title': 'เธ‚เน‰เธญเธชเธ‡เธงเธ™เธชเธดเธ—เธ˜เธดเนŒเธ—เธฒเธ‡เธเธŽเธซเธกเธฒเธข', - 'user.login.legal.view': 'เธ”เธนเธ‚เน‰เธญเธˆเธณเธเธฑเธ”เธ„เธงเธฒเธกเธฃเธฑเธšเธœเธดเธ”เธŠเธญเธšเธ—เธฒเธ‡เธเธŽเธซเธกเธฒเธข', - 'user.login.legal.collapse': 'เธขเธธเธšเธ‚เน‰เธญเธˆเธณเธเธฑเธ”เธ„เธงเธฒเธกเธฃเธฑเธšเธœเธดเธ”เธŠเธญเธšเธ—เธฒเธ‡เธเธŽเธซเธกเธฒเธข', - 'user.login.legal.agree': 'เธ‰เธฑเธ™เน„เธ”เน‰เธญเนˆเธฒเธ™เนเธฅเธฐเธขเธญเธกเธฃเธฑเธšเธ‚เน‰เธญเธˆเธณเธเธฑเธ”เธ„เธงเธฒเธกเธฃเธฑเธšเธœเธดเธ”เธŠเธญเธšเธ—เธฒเธ‡เธเธŽเธซเธกเธฒเธข', - 'user.login.legal.required': 'เน‚เธ›เธฃเธ”เธญเนˆเธฒเธ™เนเธฅเธฐเธ•เธฃเธงเธˆเธชเธญเธšเธ‚เน‰เธญเธˆเธณเธเธฑเธ”เธ„เธงเธฒเธกเธฃเธฑเธšเธœเธดเธ”เธŠเธญเธšเธ—เธฒเธ‡เธเธŽเธซเธกเธฒเธขเธเนˆเธญเธ™', - 'user.login.legal.content': 'QuantDinger เน€เธ›เน‡เธ™เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญเน€เธชเธฃเธดเธกเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธซเธธเน‰เธ™เนเธšเธšเธซเธฅเธฒเธขเธ•เธฑเธงเนเธ—เธ™เธ”เน‰เธงเธข AI เนเธฅเธฐเน„เธกเนˆเธกเธตเธ„เธธเธ“เธชเธกเธšเธฑเธ•เธดเนƒเธ™เธเธฒเธฃเนƒเธซเน‰เธ„เธณเธ›เธฃเธถเธเธฉเธฒเธ”เน‰เธฒเธ™เธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เนƒเธ™เธซเธฅเธฑเธเธ—เธฃเธฑเธžเธขเนŒเธœเธฅเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ เธเธฒเธฃเนƒเธซเน‰เธ„เธฐเนเธ™เธ™ เนเธฅเธฐเธ„เธงเธฒเธกเธ„เธดเธ”เน€เธซเน‡เธ™เธญเน‰เธฒเธ‡เธญเธดเธ‡เธ—เธฑเน‰เธ‡เธซเธกเธ”เนƒเธ™เนเธžเธฅเธ•เธŸเธญเธฃเนŒเธกเธ–เธนเธเธชเธฃเน‰เธฒเธ‡เธ‚เธถเน‰เธ™เน‚เธ”เธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธดเน‚เธ”เธข AI เธ•เธฒเธกเธ‚เน‰เธญเธกเธนเธฅเนƒเธ™เธญเธ”เธตเธ• เนเธฅเธฐเนƒเธŠเน‰เธชเธณเธซเธฃเธฑเธšเธเธฒเธฃเน€เธฃเธตเธขเธ™เธฃเธนเน‰ เธเธฒเธฃเธงเธดเธˆเธฑเธข เนเธฅเธฐเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„เน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™ เนเธฅเธฐเน„เธกเนˆเธ–เธทเธญเน€เธ›เน‡เธ™เธ„เธณเนเธ™เธฐเธ™เธณเนƒเธ™เธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เธซเธฃเธทเธญเธžเธทเน‰เธ™เธเธฒเธ™เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเนƒเธ”เน†เธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เนƒเธ™เธซเธธเน‰เธ™เน€เธเธตเนˆเธขเธงเธ‚เน‰เธญเธ‡เธเธฑเธšเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ•เนˆเธฒเธ‡เน† เน€เธŠเนˆเธ™ เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ”เน‰เธฒเธ™เธ•เธฅเธฒเธ” เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ”เน‰เธฒเธ™เธชเธ เธฒเธžเธ„เธฅเนˆเธญเธ‡ เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ”เน‰เธฒเธ™เธ™เน‚เธขเธšเธฒเธข เธฏเธฅเธฏ เธ‹เธถเนˆเธ‡เธญเธฒเธˆเธ™เธณเน„เธ›เธชเธนเนˆเธเธฒเธฃเธชเธนเธเน€เธชเธตเธขเน€เธ‡เธดเธ™เธ•เน‰เธ™เน„เธ”เน‰เธœเธนเน‰เนƒเธŠเน‰เธ„เธงเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธญเธขเนˆเธฒเธ‡เธญเธดเธชเธฃเธฐเน‚เธ”เธขเธžเธดเธˆเธฒเธฃเธ“เธฒเธˆเธฒเธเธเธฒเธฃเธขเธญเธกเธฃเธฑเธšเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เธ‚เธญเธ‡เธ•เธ™เน€เธญเธ‡ เนเธฅเธฐเธžเธคเธ•เธดเธเธฃเธฃเธกเธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เนเธฅเธฐเธœเธฅเธ—เธตเนˆเธ•เธฒเธกเธกเธฒเธ—เธตเนˆเน€เธเธดเธ”เธˆเธฒเธเธเธฒเธฃเนƒเธŠเน‰เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญเธ™เธตเน‰เธˆเธฐเธ•เน‰เธญเธ‡เธ•เธเน€เธ›เน‡เธ™เธ เธฒเธฃเธฐเธ‚เธญเธ‡เธœเธนเน‰เนƒเธŠเน‰เธ•เธฅเธฒเธ”เธกเธตเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เนเธฅเธฐเธเธฒเธฃเธฅเธ‡เธ—เธธเธ™เธ•เน‰เธญเธ‡เธฃเธฐเธกเธฑเธ”เธฃเธฐเธงเธฑเธ‡', - 'user.login.privacy.title': 'เธ™เน‚เธขเธšเธฒเธขเธ„เธงเธฒเธกเน€เธ›เน‡เธ™เธชเนˆเธงเธ™เธ•เธฑเธงเธ‚เธญเธ‡เธœเธนเน‰เนƒเธŠเน‰', - 'user.login.privacy.view': 'เธ”เธนเธ™เน‚เธขเธšเธฒเธขเธ„เธงเธฒเธกเน€เธ›เน‡เธ™เธชเนˆเธงเธ™เธ•เธฑเธงเธ‚เธญเธ‡เธœเธนเน‰เนƒเธŠเน‰', - 'user.login.privacy.collapse': 'เธ›เธดเธ”เธ‚เน‰เธญเธเธณเธซเธ™เธ”เธ„เธงเธฒเธกเน€เธ›เน‡เธ™เธชเนˆเธงเธ™เธ•เธฑเธงเธ‚เธญเธ‡เธœเธนเน‰เนƒเธŠเน‰', - 'user.login.privacy.content': 'เน€เธฃเธฒเนƒเธซเน‰เธ„เธงเธฒเธกเธชเธณเธ„เธฑเธเธเธฑเธšเธ„เธงเธฒเธกเน€เธ›เน‡เธ™เธชเนˆเธงเธ™เธ•เธฑเธงเนเธฅเธฐเธเธฒเธฃเธ›เธเธ›เน‰เธญเธ‡เธ‚เน‰เธญเธกเธนเธฅเธ‚เธญเธ‡เธ„เธธเธ“ 1) เธ‚เธญเธšเน€เธ‚เธ•เธ‚เธญเธ‡เธเธฒเธฃเธฃเธงเธšเธฃเธงเธก: เน€เธ‰เธžเธฒเธฐเธ‚เน‰เธญเธกเธนเธฅเธ—เธตเนˆเธˆเธณเน€เธ›เน‡เธ™เนƒเธ™เธเธฒเธฃเนƒเธŠเน‰เธ‡เธฒเธ™เธŸเธฑเธ‡เธเนŒเธŠเธฑเธ™ (เน€เธŠเนˆเธ™ เธญเธตเน€เธกเธฅ เธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒเธกเธทเธญเธ–เธทเธญ เธฃเธซเธฑเธชเธžเธทเน‰เธ™เธ—เธตเนˆ เธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเธชเธ•เธฒเธ‡เธ„เนŒเธ‚เธญเธ‡ Web3) เนเธฅเธฐเธšเธฑเธ™เธ—เธถเธเนเธฅเธฐเธ‚เน‰เธญเธกเธนเธฅเธญเธธเธ›เธเธฃเธ“เนŒเธ—เธตเนˆเธˆเธณเน€เธ›เน‡เธ™เน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™เธ—เธตเนˆเธˆเธฐเธ–เธนเธเธฃเธงเธšเธฃเธงเธก 2) เธงเธฑเธ•เธ–เธธเธ›เธฃเธฐเธชเธ‡เธ„เนŒเธเธฒเธฃเนƒเธŠเน‰เธ‡เธฒเธ™: เธชเธณเธซเธฃเธฑเธšเธเธฒเธฃเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธšเธฑเธเธŠเธตเนเธฅเธฐเธเธฒเธฃเธ•เธฃเธงเธˆเธชเธญเธšเธ„เธงเธฒเธกเธ›เธฅเธญเธ”เธ เธฑเธขเธเธฒเธฃเนƒเธซเน‰เธšเธฃเธดเธเธฒเธฃเธŸเธฑเธ‡เธเนŒเธŠเธฑเนˆเธ™ เธเธฒเธฃเนเธเน‰เน„เธ‚เธ›เธฑเธเธซเธฒเนเธฅเธฐเธ‚เน‰เธญเธเธณเธซเธ™เธ”เธเธฒเธฃเธ›เธเธดเธšเธฑเธ•เธดเธ•เธฒเธก 3) เธเธฒเธฃเธˆเธฑเธ”เน€เธเน‡เธšเนเธฅเธฐเธ„เธงเธฒเธกเธ›เธฅเธญเธ”เธ เธฑเธข: เธ‚เน‰เธญเธกเธนเธฅเน„เธ”เน‰เธฃเธฑเธšเธเธฒเธฃเน€เธ‚เน‰เธฒเธฃเธซเธฑเธชเนเธฅเธฐเธˆเธฑเธ”เน€เธเน‡เธšเนเธฅเธฐเธกเธตเธเธฒเธฃเนƒเธŠเน‰เธชเธดเธ—เธ˜เธดเนŒเธ—เธตเนˆเธˆเธณเน€เธ›เน‡เธ™เนเธฅเธฐเธกเธฒเธ•เธฃเธเธฒเธฃเธ„เธงเธšเธ„เธธเธกเธเธฒเธฃเน€เธ‚เน‰เธฒเธ–เธถเธ‡เน€เธžเธทเนˆเธญเธ›เน‰เธญเธ‡เธเธฑเธ™เธเธฒเธฃเน€เธ‚เน‰เธฒเธ–เธถเธ‡ เธเธฒเธฃเน€เธ›เธดเธ”เน€เธœเธข เธซเธฃเธทเธญเธเธฒเธฃเธชเธนเธเธซเธฒเธขเน‚เธ”เธขเน„เธกเนˆเน„เธ”เน‰เธฃเธฑเธšเธญเธ™เธธเธเธฒเธ• 4) เธเธฒเธฃเนเธšเนˆเธ‡เธ›เธฑเธ™เธเธฑเธšเธšเธธเธ„เธ„เธฅเธ—เธตเนˆเธชเธฒเธก: เน€เธงเน‰เธ™เนเธ•เนˆเธเธŽเธซเธกเธฒเธขเนเธฅเธฐเธ‚เน‰เธญเธšเธฑเธ‡เธ„เธฑเธšเธเธณเธซเธ™เธ”เน„เธงเน‰เธซเธฃเธทเธญเธˆเธณเน€เธ›เน‡เธ™เนƒเธ™เธเธฒเธฃเนƒเธซเน‰เธšเธฃเธดเธเธฒเธฃ เธ‚เน‰เธญเธกเธนเธฅเธชเนˆเธงเธ™เธšเธธเธ„เธ„เธฅเธ‚เธญเธ‡เธ„เธธเธ“เธˆเธฐเน„เธกเนˆเธ–เธนเธเนเธšเนˆเธ‡เธ›เธฑเธ™เธเธฑเธšเธšเธธเธ„เธ„เธฅเธ—เธตเนˆเธชเธฒเธกเธซเธฒเธเน€เธเธตเนˆเธขเธงเธ‚เน‰เธญเธ‡เธเธฑเธšเธšเธฃเธดเธเธฒเธฃเธ‚เธญเธ‡เธšเธธเธ„เธ„เธฅเธ—เธตเนˆเธชเธฒเธก (เน€เธŠเนˆเธ™ เธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™ เธœเธนเน‰เนƒเธซเน‰เธšเธฃเธดเธเธฒเธฃ SMS) เธˆเธฐเธ–เธนเธเธ›เธฃเธฐเธกเธงเธฅเธœเธฅเนƒเธ™เธ‚เธญเธšเน€เธ‚เธ•เธ‚เธฑเน‰เธ™เธ•เนˆเธณเธ—เธตเนˆเธˆเธณเน€เธ›เน‡เธ™เน€เธžเธทเนˆเธญเนƒเธŠเน‰เธ‡เธฒเธ™เธŸเธฑเธ‡เธเนŒเธŠเธฑเธ™เธ™เธตเน‰เน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™ 5) เธ„เธธเธเธเธตเน‰/เธ—เธตเนˆเน€เธเน‡เธšเธ‚เน‰เธญเธกเธนเธฅเนƒเธ™เน€เธ„เธฃเธทเนˆเธญเธ‡: เนƒเธŠเน‰เธชเธณเธซเธฃเธฑเธšเธชเธ–เธฒเธ™เธฐเธเธฒเธฃเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเนเธฅเธฐเธเธฒเธฃเธšเธณเธฃเธธเธ‡เธฃเธฑเธเธฉเธฒเน€เธ‹เธชเธŠเธฑเธ™เธ—เธตเนˆเธˆเธณเน€เธ›เน‡เธ™ (เน€เธŠเนˆเธ™ เน‚เธ—เน€เธ„เน‡เธ™ PHPSESSID) เธ„เธธเธ“เธชเธฒเธกเธฒเธฃเธ–เธฅเน‰เธฒเธ‡เธซเธฃเธทเธญเธˆเธณเธเธฑเธ”เน„เธ”เน‰เนƒเธ™เน€เธšเธฃเธฒเธงเนŒเน€เธ‹เธญเธฃเนŒ 6) เธชเธดเธ—เธ˜เธดเนŒเธชเนˆเธงเธ™เธšเธธเธ„เธ„เธฅ: เธ„เธธเธ“เธชเธฒเธกเธฒเธฃเธ–เนƒเธŠเน‰เธชเธดเธ—เธ˜เธดเนŒเธ‚เธญเธ‡เธ„เธธเธ“เนƒเธ™เธเธฒเธฃเธชเธญเธšเธ–เธฒเธก เนเธเน‰เน„เธ‚ เธฅเธš เน€เธžเธดเธเธ–เธญเธ™เธ„เธงเธฒเธกเธขเธดเธ™เธขเธญเธก เธฏเธฅเธฏ เธ•เธฒเธกเธเธŽเธซเธกเธฒเธขเนเธฅเธฐเธ‚เน‰เธญเธšเธฑเธ‡เธ„เธฑเธš 7) เธเธฒเธฃเน€เธ›เธฅเธตเนˆเธขเธ™เนเธ›เธฅเธ‡เนเธฅเธฐเธ›เธฃเธฐเธเธฒเธจ: เน€เธกเธทเนˆเธญเธกเธตเธเธฒเธฃเธญเธฑเธ›เน€เธ”เธ•เธ‚เน‰เธญเธเธณเธซเธ™เธ”เน€เธซเธฅเนˆเธฒเธ™เธตเน‰เธˆเธฐเนเธชเธ”เธ‡เธญเธขเนˆเธฒเธ‡เน€เธ”เนˆเธ™เธŠเธฑเธ”เธšเธ™เธซเธ™เน‰เธฒเน€เธงเน‡เธšเธเธฒเธฃเนƒเธŠเน‰เธšเธฃเธดเธเธฒเธฃเธ™เธตเน‰เธ•เนˆเธญเน„เธ›เธˆเธฐเธ–เธทเธญเธงเนˆเธฒเธ„เธธเธ“เน„เธ”เน‰เธญเนˆเธฒเธ™เนเธฅเธฐเธขเธญเธกเธฃเธฑเธšเน€เธ™เธทเน‰เธญเธซเธฒเธ—เธตเนˆเธญเธฑเธ›เน€เธ”เธ•เนเธฅเน‰เธงเธซเธฒเธเธ„เธธเธ“เน„เธกเนˆเธขเธญเธกเธฃเธฑเธšเธ‚เน‰เธญเธเธณเธซเธ™เธ”เน€เธซเธฅเนˆเธฒเธ™เธตเน‰เธซเธฃเธทเธญเธเธฒเธฃเธ›เธฃเธฑเธšเธ›เธฃเธธเธ‡เนƒเธ” เน† เน‚เธ›เธฃเธ”เธซเธขเธธเธ”เนƒเธŠเน‰เธšเธฃเธดเธเธฒเธฃเนเธฅเธฐเธ•เธดเธ”เธ•เนˆเธญเน€เธฃเธฒ', - 'account.basicInfo': 'เธ‚เน‰เธญเธกเธนเธฅเธžเธทเน‰เธ™เธเธฒเธ™', - 'account.id': 'เธฃเธซเธฑเธชเธœเธนเน‰เนƒเธŠเน‰', - 'account.username': 'เธŠเธทเนˆเธญเธœเธนเน‰เนƒเธŠเน‰', - 'account.nickname': 'เธŠเธทเนˆเธญเธ™เธดเธ„', - 'account.email': 'เธˆเธ”เธซเธกเธฒเธข', - 'account.mobile': 'เธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒ', - 'account.web3address': 'เธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™', - 'account.pid': 'เธฃเธซเธฑเธชเธœเธนเน‰เธญเน‰เธฒเธ‡เธญเธดเธ‡', - 'account.level': 'เธฃเธฐเธ”เธฑเธšเธœเธนเน‰เนƒเธŠเน‰', - 'account.money': 'เธชเธกเธ”เธธเธฅ', - 'account.qdtBalance': 'เธขเธญเธ”เธ„เธ‡เน€เธซเธฅเธทเธญ QDT', - 'account.score': 'เธšเธนเธฃเธ“เธฒเธเธฒเธฃ', - 'account.createtime': 'เน€เธงเธฅเธฒเธฅเธ‡เธ—เธฐเน€เธšเธตเธขเธ™', - 'account.inviteLink': 'เธฅเธดเธ‡เธ„เนŒเธ„เธณเน€เธŠเธดเธ', - 'account.recharge': 'เน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'account.rechargeTip': 'เน‚เธ›เธฃเธ”เนƒเธŠเน‰ WeChat เธซเธฃเธทเธญ Alipay เน€เธžเธทเนˆเธญเธชเนเธเธ™เน‚เธ„เน‰เธ” QR เธ”เน‰เธฒเธ™เธฅเนˆเธฒเธ‡เน€เธžเธทเนˆเธญเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'account.qrCodePlaceholder': 'เธ•เธฑเธงเธขเธถเธ”เธฃเธซเธฑเธช QR (เธเธฒเธฃเธˆเธณเธฅเธญเธ‡)', - 'account.rechargeAmount': 'เธˆเธณเธ™เธงเธ™เธเธฒเธฃเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'account.enterAmount': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธ—เธตเนˆเน€เธ•เธดเธก', - 'account.rechargeHint': 'เธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธเธฒเธเธ‚เธฑเน‰เธ™เธ•เนˆเธณ: 1 QDT', - 'account.confirmRecharge': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'account.enterValidAmount': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธ—เธตเนˆเน€เธ•เธดเธกเนƒเธซเน‰เธ–เธนเธเธ•เน‰เธญเธ‡', - 'account.rechargeSuccess': 'เน€เธ•เธดเธกเน€เธ‡เธดเธ™เธชเธณเน€เธฃเน‡เธˆ!เธเธฒเธเนเธฅเน‰เธง {amount} QDT', - 'account.settings.menuMap.basic': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธžเธทเน‰เธ™เธเธฒเธ™', - 'account.settings.menuMap.security': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ„เธงเธฒเธกเธ›เธฅเธญเธ”เธ เธฑเธข', - 'account.settings.menuMap.notification': 'เธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธซเธกเนˆ', - 'account.settings.menuMap.moneyLog': 'เธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธเธญเธ‡เธ—เธธเธ™', - 'account.moneyLog.empty': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธเธญเธ‡เธ—เธธเธ™', - 'account.moneyLog.total': 'เธฃเธงเธก {total} เธšเธฑเธ™เธ—เธถเธ', - 'account.moneyLog.type.purchase': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธเธฒเธฃเธ‹เธทเน‰เธญ', - 'account.moneyLog.type.recharge': 'เน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'account.moneyLog.type.refund': 'เธ„เธทเธ™เน€เธ‡เธดเธ™', - 'account.moneyLog.type.reward': 'เธฃเธฒเธ‡เธงเธฑเธฅ', - 'account.moneyLog.type.income': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธฃเธฒเธขเน„เธ”เน‰', - 'account.moneyLog.type.commission': 'เธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃเนเธžเธฅเธ•เธŸเธญเธฃเนŒเธก', - 'wallet.balance': 'เธขเธญเธ”เธ„เธ‡เน€เธซเธฅเธทเธญ QDT', - 'wallet.recharge': 'เน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'wallet.withdraw': 'เธ–เธญเธ™เน€เธ‡เธดเธ™เธชเธ”', - 'wallet.filter': 'เธเธฃเธญเธ‡', - 'wallet.reset': 'เธฃเธตเน€เธ‹เน‡เธ•', - 'wallet.totalRecharge': 'เธเธฒเธฃเน€เธ•เธดเธกเน€เธ‡เธดเธ™เธชเธฐเธชเธก', - 'wallet.totalWithdraw': 'เธเธฒเธฃเธ–เธญเธ™เน€เธ‡เธดเธ™เธชเธฐเธชเธก', - 'wallet.totalIncome': 'เธฃเธฒเธขเน„เธ”เน‰เธชเธฐเธชเธก', - 'wallet.records': 'เธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธกเนเธฅเธฐเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธเธญเธ‡เธ—เธธเธ™', - 'wallet.tradingRecords': 'เธ›เธฃเธฐเธงเธฑเธ•เธดเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธก', - 'wallet.moneyLog': 'เธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธเธญเธ‡เธ—เธธเธ™', - 'wallet.rechargeTip': 'เน‚เธ›เธฃเธ”เนƒเธŠเน‰ WeChat เธซเธฃเธทเธญ Alipay เน€เธžเธทเนˆเธญเธชเนเธเธ™เน‚เธ„เน‰เธ” QR เธ”เน‰เธฒเธ™เธฅเนˆเธฒเธ‡เน€เธžเธทเนˆเธญเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'wallet.qrCodePlaceholder': 'เธ•เธฑเธงเธขเธถเธ”เธฃเธซเธฑเธช QR (เธเธฒเธฃเธˆเธณเธฅเธญเธ‡)', - 'wallet.rechargeAmount': 'เธˆเธณเธ™เธงเธ™เธเธฒเธฃเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'wallet.enterAmount': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธ—เธตเนˆเน€เธ•เธดเธก', - 'wallet.rechargeHint': 'เธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธเธฒเธเธ‚เธฑเน‰เธ™เธ•เนˆเธณ: 1 QDT', - 'wallet.confirmRecharge': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'wallet.enterValidAmount': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธ—เธตเนˆเน€เธ•เธดเธกเนƒเธซเน‰เธ–เธนเธเธ•เน‰เธญเธ‡', - 'wallet.rechargeSuccess': 'เน€เธ•เธดเธกเน€เธ‡เธดเธ™เธชเธณเน€เธฃเน‡เธˆ!เธเธฒเธเนเธฅเน‰เธง {amount} QDT', - 'wallet.rechargeFailed': 'เธเธฒเธฃเน€เธ•เธดเธกเน€เธ‡เธดเธ™เธฅเน‰เธกเน€เธซเธฅเธง', - 'wallet.withdrawTip': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธ—เธตเนˆเธ–เธญเธ™เนเธฅเธฐเธ—เธตเนˆเธญเธขเธนเนˆเธเธฒเธฃเธ–เธญเธ™', - 'wallet.withdrawAmount': 'เธ–เธญเธ™เธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™', - 'wallet.enterWithdrawAmount': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธ—เธตเนˆเธ–เธญเธ™', - 'wallet.withdrawHint': 'เธˆเธณเธ™เธงเธ™เธ–เธญเธ™เธ‚เธฑเน‰เธ™เธ•เนˆเธณ: 1 QDT', - 'wallet.withdrawAddress': 'เธ—เธตเนˆเธญเธขเธนเนˆเธเธฒเธฃเธ–เธญเธ™เน€เธ‡เธดเธ™ (เน„เธกเนˆเธšเธฑเธ‡เธ„เธฑเธš)', - 'wallet.enterWithdrawAddress': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ—เธตเนˆเธญเธขเธนเนˆเธเธฒเธฃเธ–เธญเธ™เน€เธ‡เธดเธ™', - 'wallet.confirmWithdraw': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเธ–เธญเธ™เน€เธ‡เธดเธ™', - 'wallet.enterValidWithdrawAmount': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธ—เธตเนˆเธ–เธญเธ™เนƒเธซเน‰เธ–เธนเธเธ•เน‰เธญเธ‡', - 'wallet.insufficientBalance': 'เธขเธญเธ”เธ„เธ‡เน€เธซเธฅเธทเธญเน„เธกเนˆเน€เธžเธตเธขเธ‡เธžเธญ', - 'wallet.withdrawSuccess': 'เธเธฒเธฃเธ–เธญเธ™เน€เธ‡เธดเธ™เธชเธณเน€เธฃเน‡เธˆ!เธ–เธญเธ™เธญเธญเธ {amount} QDT', - 'wallet.withdrawFailed': 'เธเธฒเธฃเธ–เธญเธ™เน€เธ‡เธดเธ™เธฅเน‰เธกเน€เธซเธฅเธง', - 'wallet.noTradingRecords': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธก', - 'wallet.noMoneyLog': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธเธญเธ‡เธ—เธธเธ™', - 'wallet.loadTradingRecordsFailed': 'เน‚เธซเธฅเธ”เธšเธฑเธ™เธ—เธถเธเธ˜เธธเธฃเธเธฃเธฃเธกเน„เธกเนˆเธชเธณเน€เธฃเน‡เธˆ', - 'wallet.loadMoneyLogFailed': 'เน‚เธซเธฅเธ”เธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธเธญเธ‡เธ—เธธเธ™เน„เธกเนˆเธชเธณเน€เธฃเน‡เธˆ', - 'wallet.moneyLogTotal': 'เธฃเธงเธก {total} เธšเธฑเธ™เธ—เธถเธ', - 'wallet.moneyLogTypeTitle': 'เธžเธดเธกเธžเนŒ', - 'wallet.moneyLogType.all': 'เธ—เธธเธเธ›เธฃเธฐเน€เธ เธ—', - 'wallet.table.time': 'เน€เธงเธฅเธฒ', - 'wallet.table.type': 'เธžเธดเธกเธžเนŒ', - 'wallet.table.price': 'เธฃเธฒเธ„เธฒ', - 'wallet.table.amount': 'เธ›เธฃเธดเธกเธฒเธ“', - 'wallet.table.money': 'เธˆเธณเธ™เธงเธ™', - 'wallet.table.balance': 'เธชเธกเธ”เธธเธฅ', - 'wallet.table.memo': 'เธซเธกเธฒเธขเน€เธซเธ•เธธ', - 'wallet.table.value': 'เธ„เนˆเธฒ', - 'wallet.table.profit': 'เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™', - 'wallet.table.commission': 'เธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃ', - 'wallet.table.total': 'เธฃเธงเธก {total} เธšเธฑเธ™เธ—เธถเธ', - 'wallet.tradeType.buy': 'เธ‹เธทเน‰เธญ', - 'wallet.tradeType.sell': 'เธ‚เธฒเธข', - 'wallet.tradeType.liquidation': 'เธšเธฑเธ‡เธ„เธฑเธšเนƒเธซเน‰เน€เธฅเธดเธเธเธดเธˆเธเธฒเธฃ', - 'wallet.tradeType.openLong': 'เน€เธ›เธดเธ”เธขเธฒเธงเน†', - 'wallet.tradeType.addLong': 'เธเธฒเธ”เธญเธ•', - 'wallet.tradeType.closeLong': 'เธ›เธดเธ™เธ•เธฑเธง', - 'wallet.tradeType.closeLongStop': 'เธซเธขเธธเธ”เธ‚เธฒเธ”เธ—เธธเธ™เนเธฅเธฐเธขเธฒเธง', - 'wallet.tradeType.closeLongProfit': 'เธ‚เธฒเธขเธ—เธณเธเธณเน„เธฃเนเธฅเธฐเธฃเธฐเธ”เธฑเธšเธกเธฒเธเธ‚เธถเน‰เธ™', - 'wallet.tradeType.openShort': 'เน€เธ›เธดเธ”เธชเธฑเน‰เธ™', - 'wallet.tradeType.addShort': 'เน€เธžเธดเนˆเธกเธชเธฑเน‰เธ™', - 'wallet.tradeType.closeShort': 'เธงเนˆเธฒเธ‡เน€เธ›เธฅเนˆเธฒ', - 'wallet.tradeType.closeShortStop': 'เธซเธขเธธเธ”เธเธฒเธฃเธชเธนเธเน€เธชเธตเธข', - 'wallet.tradeType.closeShortProfit': 'เธ‚เธฒเธขเธ—เธณเธเธณเน„เธฃเนเธฅเธฐเธ›เธดเธ”เธเธฒเธฃเธ‚เธฒเธข', - 'wallet.moneyLogType.purchase': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธเธฒเธฃเธ‹เธทเน‰เธญ', - 'wallet.moneyLogType.recharge': 'เน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'wallet.moneyLogType.withdraw': 'เธ–เธญเธ™เน€เธ‡เธดเธ™เธชเธ”', - 'wallet.moneyLogType.refund': 'เธ„เธทเธ™เน€เธ‡เธดเธ™', - 'wallet.moneyLogType.reward': 'เธฃเธฒเธ‡เธงเธฑเธฅ', - 'wallet.moneyLogType.income': 'เธฃเธฒเธขเน„เธ”เน‰', - 'wallet.moneyLogType.commission': 'เธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃ', - 'wallet.web3Address.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™ Web3 เธเนˆเธญเธ™', - 'wallet.web3Address.requiredDescription': 'เธเนˆเธญเธ™เธ—เธตเนˆเธˆเธฐเน€เธ•เธดเธกเน€เธ‡เธดเธ™ เธ„เธธเธ“เธ•เน‰เธญเธ‡เธœเธนเธเธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™ Web3 เธ‚เธญเธ‡เธ„เธธเธ“เน€เธžเธทเนˆเธญเธฃเธฑเธšเธเธฒเธฃเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'wallet.web3Address.placeholder': 'เน‚เธ›เธฃเธ”เธ›เน‰เธญเธ™เธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™ Web3 เธ‚เธญเธ‡เธ„เธธเธ“ (เน€เธฃเธดเนˆเธกเธ•เน‰เธ™เธ”เน‰เธงเธข 0x)', - 'wallet.web3Address.save': 'เธšเธฑเธ™เธ—เธถเธเธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™', - 'wallet.web3Address.saveSuccess': 'เธšเธฑเธ™เธ—เธถเธเธ—เธตเนˆเธญเธขเธนเนˆ Wallet เน€เธฃเธตเธขเธšเธฃเน‰เธญเธขเนเธฅเน‰เธง', - 'wallet.web3Address.saveFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธšเธฑเธ™เธ—เธถเธเธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเธชเธ•เธฒเธ‡เธ„เนŒเน„เธ”เน‰', - 'wallet.web3Address.invalidFormat': 'เน‚เธ›เธฃเธ”เธ›เน‰เธญเธ™เธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™ Web3 เธ—เธตเนˆเธ–เธนเธเธ•เน‰เธญเธ‡ (เธฃเธนเธ›เนเธšเธš Ethereum: 42 เธ•เธฑเธงเธญเธฑเธเธฉเธฃเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เธ”เน‰เธงเธข 0x เธซเธฃเธทเธญเธฃเธนเธ›เนเธšเธš TRC20: 34 เธ•เธฑเธงเธญเธฑเธเธฉเธฃเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เธ”เน‰เธงเธข T)', - 'wallet.selectCoin': 'เน€เธฅเธทเธญเธเธชเธเธธเธฅเน€เธ‡เธดเธ™', - 'wallet.selectChain': 'เธซเนˆเธงเธ‡เน‚เธ‹เนˆเธเธฒเธฃเธ„เธฑเธ”เน€เธฅเธทเธญเธ', - 'wallet.chain.eth': 'เธœเธฅเธ›เธฃเธฐเน‚เธขเธŠเธ™เนŒเธ—เธฑเธšเธ‹เน‰เธญเธ™ (ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'เธšเธตเน€เธญเธชเธ‹เธต', - 'wallet.targetQdtAmount': 'เธˆเธณเธ™เธงเธ™ QDT เธ—เธตเนˆเธ„เธธเธ“เธ•เน‰เธญเธ‡เธเธฒเธฃเนเธฅเธ (เน„เธกเนˆเธšเธฑเธ‡เธ„เธฑเธš)', - 'wallet.targetQdtAmount.placeholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™ QDT เธ—เธตเนˆเธ„เธธเธ“เธ•เน‰เธญเธ‡เธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™ เธฃเธฒเธ„เธฒ QDT เธ›เธฑเธˆเธˆเธธเธšเธฑเธ™เธ„เธทเธญ: {price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': 'เธ•เน‰เธญเธ‡เน€เธ•เธดเธกเน€เธ‡เธดเธ™: {amount} USDT', - 'wallet.rechargeAddress': 'เธ—เธตเนˆเธญเธขเธนเนˆเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'wallet.copyAddress': 'เธชเธณเน€เธ™เธฒ', - 'wallet.copySuccess': 'เธ„เธฑเธ”เธฅเธญเธเธชเธณเน€เธฃเน‡เธˆ!', - 'wallet.copyFailed': 'เธเธฒเธฃเธ„เธฑเธ”เธฅเธญเธเธฅเน‰เธกเน€เธซเธฅเธง เน‚เธ›เธฃเธ”เธ„เธฑเธ”เธฅเธญเธเธ”เน‰เธงเธขเธ•เธ™เน€เธญเธ‡', - 'wallet.rechargeAddressHint': 'เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเนƒเธซเน‰เนเธ™เนˆเนƒเธˆเธงเนˆเธฒเน„เธ”เน‰เนƒเธŠเน‰เน€เธ„เธฃเธทเธญเธ‚เนˆเธฒเธข {chain} เน€เธžเธทเนˆเธญเธเธฒเธ {coin} เน„เธ›เธขเธฑเธ‡เธ—เธตเนˆเธญเธขเธนเนˆเธ™เธตเน‰', - 'wallet.qdtPrice.loading': 'เธเธณเธฅเธฑเธ‡เน‚เธซเธฅเธ”...', - 'wallet.rechargeTip.new': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธชเธเธธเธฅเน€เธ‡เธดเธ™เนเธฅเธฐเธซเนˆเธงเธ‡เน‚เธ‹เนˆ เธˆเธฒเธเธ™เธฑเน‰เธ™เธชเนเธเธ™เน‚เธ„เน‰เธ” QR เธ”เน‰เธฒเธ™เธฅเนˆเธฒเธ‡เน€เธžเธทเนˆเธญเน€เธ•เธดเธกเน€เธ‡เธดเธ™', - 'wallet.exchangeRate': '1 เธ„เธดเธงเธ”เธตเธ—เธต เธเธฅเธฑเธšเน„เธ›เธขเธฑเธ‡ {rate} เธ”เธญเธฅเธฅเธฒเธฃเนŒเธชเธซเธฃเธฑเธ', - 'wallet.withdrawableAmount': 'เธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธชเธ”เธ—เธตเนˆเธกเธตเธญเธขเธนเนˆ', - 'wallet.totalBalance': 'เธขเธญเธ”เธฃเธงเธก', - 'wallet.insufficientWithdrawable': 'เธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธชเธ”เธ—เธตเนˆเธชเธฒเธกเธฒเธฃเธ–เธ–เธญเธ™เธญเธญเธเน„เธ”เน‰เน„เธกเนˆเน€เธžเธตเธขเธ‡เธžเธญ เน€เธ‡เธดเธ™เธชเธ”เธ—เธตเนˆเธกเธตเธญเธขเธนเนˆเนƒเธ™เธ›เธฑเธˆเธˆเธธเธšเธฑเธ™เธ„เธทเธญ: {amount} QDT', - 'wallet.withdrawAddressRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ—เธตเนˆเธญเธขเธนเนˆเธเธฒเธฃเธ–เธญเธ™เน€เธ‡เธดเธ™', - 'wallet.withdrawAddressHint': 'เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเนƒเธซเน‰เนเธ™เนˆเนƒเธˆเธงเนˆเธฒเธ—เธตเนˆเธญเธขเธนเนˆเธ–เธนเธเธ•เน‰เธญเธ‡ เธซเธฅเธฑเธ‡เธˆเธฒเธเธ–เธญเธ™เนเธฅเน‰เธงเน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน€เธžเธดเธเธ–เธญเธ™เน„เธ”เน‰', - 'wallet.withdrawSubmitSuccess': 'เธชเนˆเธ‡เนƒเธšเธชเธกเธฑเธ„เธฃเธ–เธญเธ™เน€เธฃเธตเธขเธšเธฃเน‰เธญเธขเนเธฅเน‰เธง เน‚เธ›เธฃเธ”เธฃเธญเธเธฒเธฃเธ•เธฃเธงเธˆเธชเธญเธš', - 'menu.footer.contactUs': 'เธ•เธดเธ”เธ•เนˆเธญเน€เธฃเธฒ', - 'menu.footer.getSupport': 'เธฃเธฑเธšเธเธฒเธฃเธชเธ™เธฑเธšเธชเธ™เธธเธ™', - 'menu.footer.socialAccounts': 'เธšเธฑเธเธŠเธตเน‚เธ‹เน€เธŠเธตเธขเธฅ', - 'menu.footer.userAgreement': 'เธ‚เน‰เธญเธ•เธเธฅเธ‡เธœเธนเน‰เนƒเธŠเน‰', - 'menu.footer.privacyPolicy': 'เธ™เน‚เธขเธšเธฒเธขเธ„เธงเธฒเธกเน€เธ›เน‡เธ™เธชเนˆเธงเธ™เธ•เธฑเธง', - 'menu.footer.support': 'เธชเธ™เธฑเธšเธชเธ™เธธเธ™', - 'menu.footer.featureRequest': 'เธ„เธณเธ‚เธญเธ„เธธเธ“เธชเธกเธšเธฑเธ•เธด', - 'menu.footer.email': 'เธญเธตเน€เธกเธฅ', - 'menu.footer.liveChat': 'เนเธŠเธ—เธชเธ”เธ—เธธเธเธงเธฑเธ™เธ•เธฅเธญเธ” 24 เธŠเธฑเนˆเธงเน‚เธกเธ‡', - 'dashboard.analysis.title': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธซเธฅเธฒเธขเธกเธดเธ•เธด', - 'dashboard.analysis.subtitle': 'เนเธžเธฅเธ•เธŸเธญเธฃเนŒเธกเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธฒเธ‡เธเธฒเธฃเน€เธ‡เธดเธ™เธ—เธตเนˆเธ„เธฃเธญเธšเธ„เธฅเธธเธกเธ—เธตเนˆเธ‚เธฑเธšเน€เธ„เธฅเธทเนˆเธญเธ™เธ”เน‰เธงเธข AI', - 'dashboard.analysis.selectSymbol': 'เน€เธฅเธทเธญเธเธซเธฃเธทเธญเธ›เน‰เธญเธ™เธฃเธซเธฑเธชเธžเธทเน‰เธ™เธเธฒเธ™', - 'dashboard.analysis.selectModel': 'เน€เธฅเธทเธญเธเธฃเธธเนˆเธ™', - 'dashboard.analysis.startAnalysis': 'เน€เธฃเธดเนˆเธกเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ', - 'dashboard.analysis.history': 'เธ›เธฃเธฐเธงเธฑเธ•เธดเธจเธฒเธชเธ•เธฃเนŒ', - 'dashboard.analysis.tab.overview': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธตเนˆเธ„เธฃเธญเธšเธ„เธฅเธธเธก', - 'dashboard.analysis.tab.fundamental': 'เธ„เธงเธฒเธกเธฃเธนเน‰เธžเธทเน‰เธ™เธเธฒเธ™', - 'dashboard.analysis.tab.technical': 'เน€เธ—เธ„เน‚เธ™เน‚เธฅเธขเธต', - 'dashboard.analysis.tab.news': 'เธ‚เนˆเธฒเธง', - 'dashboard.analysis.tab.sentiment': 'เธญเธฒเธฃเธกเธ“เนŒ', - 'dashboard.analysis.tab.risk': 'เน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.tab.debate': 'เธเธฒเธฃเธญเธ เธดเธ›เธฃเธฒเธขเธฃเธฐเธขเธฐเธชเธฑเน‰เธ™เธขเธฒเธง', - 'dashboard.analysis.tab.decision': 'เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธ‚เธฑเน‰เธ™เธชเธธเธ”เธ—เน‰เธฒเธข', - 'dashboard.analysis.empty.selectSymbol': 'เน€เธฅเธทเธญเธเน€เธ›เน‰เธฒเธซเธกเธฒเธขเน€เธžเธทเนˆเธญเน€เธฃเธดเนˆเธกเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ', - 'dashboard.analysis.empty.selectSymbolDesc': 'เน€เธฅเธทเธญเธเธˆเธฒเธเธฃเธฒเธขเธเธฒเธฃเธซเธธเน‰เธ™เธ—เธตเนˆเน€เธฅเธทเธญเธเน€เธญเธ‡เธซเธฃเธทเธญเธ›เน‰เธญเธ™เธฃเธซเธฑเธชเธ—เธตเนˆเน€เธเธตเนˆเธขเธงเธ‚เน‰เธญเธ‡เน€เธžเธทเนˆเธญเธฃเธฑเธšเธฃเธฒเธขเธ‡เธฒเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ AI เธซเธฅเธฒเธขเธกเธดเธ•เธด', - 'dashboard.analysis.empty.startAnalysis': 'เธ„เธฅเธดเธเธ›เธธเนˆเธก "เน€เธฃเธดเนˆเธกเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ" เน€เธžเธทเนˆเธญเธ—เธณเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธซเธฅเธฒเธขเธกเธดเธ•เธด', - 'dashboard.analysis.empty.startAnalysisDesc': 'เน€เธฃเธฒเธˆเธฐเนƒเธซเน‰เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธตเนˆเธ„เธฃเธญเธšเธ„เธฅเธธเธกเธˆเธฒเธเธซเธฅเธฒเธขเธกเธดเธ•เธด เน€เธŠเนˆเธ™ เธ›เธฑเธˆเธˆเธฑเธขเธžเธทเน‰เธ™เธเธฒเธ™ เน€เธ—เธ„เน‚เธ™เน‚เธฅเธขเธต เธ‚เนˆเธฒเธงเธชเธฒเธฃ เธ„เธงเธฒเธกเธฃเธนเน‰เธชเธถเธ เนเธฅเธฐเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.empty.noData': 'เธ‚เธ“เธฐเธ™เธตเน‰เน„เธกเนˆเธกเธตเธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ {type} เน‚เธ›เธฃเธ”เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธตเนˆเธ„เธฃเธญเธšเธ„เธฅเธธเธกเธเนˆเธญเธ™', - 'dashboard.analysis.empty.noWatchlist': 'เธ‚เธ“เธฐเธ™เธตเน‰เน„เธกเนˆเธกเธตเธซเธธเน‰เธ™เธ—เธตเนˆเน€เธฅเธทเธญเธเน€เธญเธ‡', - 'dashboard.analysis.empty.noHistory': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ›เธฃเธฐเธงเธฑเธ•เธด', - 'dashboard.analysis.empty.watchlistHint': 'เธ‚เธ“เธฐเธ™เธตเน‰เน„เธกเนˆเธกเธตเธซเธธเน‰เธ™เธ—เธตเนˆเน€เธฅเธทเธญเธเน€เธญเธ‡เธเธฃเธธเธ“เธฒเธเนˆเธญเธ™', - 'dashboard.analysis.empty.noDebateData': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเธญเธ เธดเธ›เธฃเธฒเธข', - 'dashboard.analysis.empty.noDecisionData': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆ', - 'dashboard.analysis.empty.selectAgent': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธ•เธฑเธงเนเธ—เธ™เน€เธžเธทเนˆเธญเธ”เธนเธœเธฅเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ', - 'dashboard.analysis.loading.analyzing': 'เธเธณเธฅเธฑเธ‡เธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ เธเธฃเธธเธ“เธฒเธฃเธญเธชเธฑเธเธ„เธฃเธนเนˆ...', - 'dashboard.analysis.loading.fundamental': 'เธเธณเธฅเธฑเธ‡เธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ‚เน‰เธญเธกเธนเธฅเธžเธทเน‰เธ™เธเธฒเธ™...', - 'dashboard.analysis.loading.technical': 'เธเธณเธฅเธฑเธ‡เธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„...', - 'dashboard.analysis.loading.news': 'เธเธณเธฅเธฑเธ‡เธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ‚เน‰เธญเธกเธนเธฅเธ‚เนˆเธฒเธง...', - 'dashboard.analysis.loading.sentiment': 'เธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธญเธฒเธฃเธกเธ“เนŒเธ•เธฅเธฒเธ”...', - 'dashboard.analysis.loading.risk': 'เธเธณเธฅเธฑเธ‡เธ›เธฃเธฐเน€เธกเธดเธ™เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡...', - 'dashboard.analysis.loading.debate': 'เธเธฒเธฃเธญเธ เธดเธ›เธฃเธฒเธขเธฃเธฐเธขเธฐเธชเธฑเน‰เธ™เธฃเธฐเธขเธฐเธชเธฑเน‰เธ™เธเธณเธฅเธฑเธ‡เธ”เธณเน€เธ™เธดเธ™เธญเธขเธนเนˆ...', - 'dashboard.analysis.loading.decision': 'เธเธณเธฅเธฑเธ‡เธชเธฃเน‰เธฒเธ‡เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธ‚เธฑเน‰เธ™เธชเธธเธ”เธ—เน‰เธฒเธข...', - 'dashboard.analysis.score.overall': 'เธ„เธฐเนเธ™เธ™เน‚เธ”เธขเธฃเธงเธก', - 'dashboard.analysis.score.recommendation': 'เธ„เธณเนเธ™เธฐเธ™เธณเธเธฒเธฃเธฅเธ‡เธ—เธธเธ™', - 'dashboard.analysis.score.confidence': 'เธ„เธงเธฒเธกเธกเธฑเนˆเธ™เนƒเธˆ', - 'dashboard.analysis.dimension.fundamental': 'เธ„เธงเธฒเธกเธฃเธนเน‰เธžเธทเน‰เธ™เธเธฒเธ™', - 'dashboard.analysis.dimension.technical': 'เน€เธ—เธ„เน‚เธ™เน‚เธฅเธขเธต', - 'dashboard.analysis.dimension.news': 'เธ‚เนˆเธฒเธง', - 'dashboard.analysis.dimension.sentiment': 'เธญเธฒเธฃเธกเธ“เนŒ', - 'dashboard.analysis.dimension.risk': 'เน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.card.dimensionScores': 'เธเธฒเธฃเนƒเธซเน‰เธ„เธฐเนเธ™เธ™เธชเธณเธซเธฃเธฑเธšเนเธ•เนˆเธฅเธฐเธกเธดเธ•เธด', - 'dashboard.analysis.card.overviewReport': 'เธฃเธฒเธขเธ‡เธฒเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธตเนˆเธ„เธฃเธญเธšเธ„เธฅเธธเธก', - 'dashboard.analysis.card.financialMetrics': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ—เธฒเธ‡เธเธฒเธฃเน€เธ‡เธดเธ™', - 'dashboard.analysis.card.fundamentalReport': 'เธฃเธฒเธขเธ‡เธฒเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ›เธฑเธˆเธˆเธฑเธขเธžเธทเน‰เธ™เธเธฒเธ™', - 'dashboard.analysis.card.technicalIndicators': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'dashboard.analysis.card.technicalReport': 'เธฃเธฒเธขเธ‡เธฒเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'dashboard.analysis.card.newsList': 'เธ‚เนˆเธฒเธงเธ—เธตเนˆเน€เธเธตเนˆเธขเธงเธ‚เน‰เธญเธ‡', - 'dashboard.analysis.card.newsReport': 'เธฃเธฒเธขเธ‡เธฒเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ‚เนˆเธฒเธง', - 'dashboard.analysis.card.sentimentIndicators': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ„เธงเธฒเธกเธฃเธนเน‰เธชเธถเธ', - 'dashboard.analysis.card.sentimentReport': 'เธฃเธฒเธขเธ‡เธฒเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ„เธงเธฒเธกเธฃเธนเน‰เธชเธถเธ', - 'dashboard.analysis.card.riskMetrics': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.card.riskReport': 'เธฃเธฒเธขเธ‡เธฒเธ™เธเธฒเธฃเธ›เธฃเธฐเน€เธกเธดเธ™เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.card.bullView': 'เธกเธธเธกเธกเธญเธ‡เธฃเธฑเน‰เธ™ (เธเธฃเธฐเธ—เธดเธ‡)', - 'dashboard.analysis.card.bearView': 'เธกเธธเธกเธกเธญเธ‡เธซเธขเธฒเธšเธ„เธฒเธข (เธซเธกเธต)', - 'dashboard.analysis.card.researchConclusion': 'เธ‚เน‰เธญเธชเธฃเธธเธ›เธ‚เธญเธ‡เธœเธนเน‰เธงเธดเธˆเธฑเธข', - 'dashboard.analysis.card.traderPlan': 'เนเธœเธ™เธœเธนเน‰เธ„เน‰เธฒ', - 'dashboard.analysis.card.riskDebate': 'เธเธฒเธฃเธญเธ เธดเธ›เธฃเธฒเธขเธ„เธ“เธฐเธเธฃเธฃเธกเธเธฒเธฃเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.card.finalDecision': 'เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธ„เธฃเธฑเน‰เธ‡เธชเธธเธ”เธ—เน‰เธฒเธข', - 'dashboard.analysis.card.tradePlanDetail': 'เธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เนเธœเธ™เธเธฒเธฃเน€เธ—เธฃเธ”', - 'dashboard.analysis.tradingPlan.entry_price': 'เธฃเธฒเธ„เธฒเธ„เนˆเธฒเน€เธ‚เน‰เธฒเธŠเธก', - 'dashboard.analysis.tradingPlan.position_size': 'เธ‚เธ™เธฒเธ”เธ•เธณเนเธซเธ™เนˆเธ‡', - 'dashboard.analysis.tradingPlan.stop_loss': 'เธซเธขเธธเธ”เธเธฒเธฃเธชเธนเธเน€เธชเธตเธข', - 'dashboard.analysis.tradingPlan.take_profit': 'เธ‚เธฒเธขเธ—เธณเธเธณเน„เธฃ', - 'dashboard.analysis.label.confidence': 'เธ„เธงเธฒเธกเธกเธฑเนˆเธ™เนƒเธˆ', - 'dashboard.analysis.label.keyPoints': 'เธˆเธธเธ”เธซเธฅเธฑเธ', - 'dashboard.analysis.label.riskWarning': 'เธ„เธณเน€เธ•เธทเธญเธ™เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.risk.risky': 'เน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.risk.neutral': 'เธกเธธเธกเธกเธญเธ‡เธ—เธตเนˆเน€เธ›เน‡เธ™เธเธฅเธฒเธ‡ (เน€เธ›เน‡เธ™เธเธฅเธฒเธ‡)', - 'dashboard.analysis.risk.safe': 'เธกเธธเธกเธกเธญเธ‡เนเธšเธšเธญเธ™เธธเธฃเธฑเธเธฉเนŒเธ™เธดเธขเธก (เธ›เธฅเธญเธ”เธ เธฑเธข)', - 'dashboard.analysis.risk.conclusion': 'เธชเธฃเธธเธ›เนเธฅเน‰เธง', - 'dashboard.analysis.feature.fundamental': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธžเธทเน‰เธ™เธเธฒเธ™', - 'dashboard.analysis.feature.technical': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'dashboard.analysis.feature.news': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ‚เนˆเธฒเธง', - 'dashboard.analysis.feature.sentiment': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ„เธงเธฒเธกเธฃเธนเน‰เธชเธถเธ', - 'dashboard.analysis.feature.risk': 'เธเธฒเธฃเธ›เธฃเธฐเน€เธกเธดเธ™เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'dashboard.analysis.watchlist.title': 'เธเธฒเธฃเน€เธฅเธทเธญเธเธซเธธเน‰เธ™เธ‚เธญเธ‡เธ‰เธฑเธ™', - 'dashboard.analysis.watchlist.add': 'เน€เธžเธดเนˆเธกเน„เธ›เธ—เธตเนˆ', - 'dashboard.analysis.watchlist.addStock': 'เน€เธžเธดเนˆเธกเธชเธ•เน‡เธญเธ', - 'dashboard.analysis.modal.addStock.title': 'เน€เธžเธดเนˆเธกเธซเธธเน‰เธ™เน€เธชเธฃเธดเธก', - 'dashboard.analysis.modal.addStock.confirm': 'เนเธ™เนˆเธ™เธญเธ™', - 'dashboard.analysis.modal.addStock.cancel': 'เธขเธเน€เธฅเธดเธ', - 'dashboard.analysis.modal.addStock.market': 'เธ›เธฃเธฐเน€เธ เธ—เธ•เธฅเธฒเธ”', - 'dashboard.analysis.modal.addStock.marketPlaceholder': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธ•เธฅเธฒเธ”', - 'dashboard.analysis.modal.addStock.marketRequired': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธ›เธฃเธฐเน€เธ เธ—เธ•เธฅเธฒเธ”', - 'dashboard.analysis.modal.addStock.symbol': 'เธฃเธซเธฑเธชเธชเธ•เนŠเธญเธเธชเธดเธ™เธ„เน‰เธฒ', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'เธ•เธฑเธงเธญเธขเนˆเธฒเธ‡เน€เธŠเนˆเธ™: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธชเธ•เนŠเธญเธเธชเธดเธ™เธ„เน‰เธฒ', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'เธ„เน‰เธ™เธซเธฒเธฃเธซเธฑเธชเธซเธฃเธทเธญเธŠเธทเนˆเธญเน€เธ›เน‰เธฒเธซเธกเธฒเธข', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'เธ„เน‰เธ™เธซเธฒเธซเธฃเธทเธญเธ›เน‰เธญเธ™เธฃเธซเธฑเธชเธญเน‰เธฒเธ‡เธญเธดเธ‡ (เน€เธŠเนˆเธ™ AAPL, BTC/USDT, EUR/USD)', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'เธฃเธญเธ‡เธฃเธฑเธšเธเธฒเธฃเธ„เน‰เธ™เธซเธฒเธงเธฑเธ•เธ–เธธเนƒเธ™เธเธฒเธ™เธ‚เน‰เธญเธกเธนเธฅเธซเธฃเธทเธญเธ›เน‰เธญเธ™เธฃเธซเธฑเธชเน‚เธ”เธขเธ•เธฃเธ‡ (เธฃเธฐเธšเธšเธˆเธฐเธฃเธฑเธšเธŠเธทเนˆเธญเน‚เธ”เธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด)', - 'dashboard.analysis.modal.addStock.search': 'เธ„เน‰เธ™เธซเธฒ', - 'dashboard.analysis.modal.addStock.searchResults': 'เธœเธฅเธเธฒเธฃเธ„เน‰เธ™เธซเธฒ', - 'dashboard.analysis.modal.addStock.hotSymbols': 'เน€เธ›เน‰เธฒเธซเธกเธฒเธขเธขเธญเธ”เธ™เธดเธขเธก', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเน€เธ›เน‰เธฒเธซเธกเธฒเธขเธขเธญเธ”เธ™เธดเธขเธก', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'เน€เธฅเธทเธญเธเนเธฅเน‰เธง', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเน€เธ›เน‰เธฒเธซเธกเธฒเธขเธเนˆเธญเธ™', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเน€เธ›เน‰เธฒเธซเธกเธฒเธขเธซเธฃเธทเธญเธ›เน‰เธญเธ™เธฃเธซเธฑเธชเน€เธ›เน‰เธฒเธซเธกเธฒเธขเธเนˆเธญเธ™', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเน€เธ›เน‰เธฒเธซเธกเธฒเธข', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธ›เธฃเธฐเน€เธ เธ—เธ•เธฅเธฒเธ”เธเนˆเธญเธ™', - 'dashboard.analysis.modal.addStock.searchFailed': 'เธเธฒเธฃเธ„เน‰เธ™เธซเธฒเธฅเน‰เธกเน€เธซเธฅเธง เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'dashboard.analysis.modal.addStock.noSearchResults': 'เน„เธกเนˆเธžเธšเน€เธ›เน‰เธฒเธซเธกเธฒเธขเธ—เธตเนˆเธ•เธฃเธ‡เธเธฑเธ™', - 'dashboard.analysis.modal.addStock.willAutoFetchName': 'เธฃเธฐเธšเธšเธˆเธฐเธฃเธฑเธšเธŠเธทเนˆเธญเนƒเธซเน‰เธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด', - 'dashboard.analysis.modal.addStock.addDirectly': 'เน€เธžเธดเนˆเธกเน‚เธ”เธขเธ•เธฃเธ‡', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'เธŠเธทเนˆเธญเธˆเธฐเธ–เธนเธเธซเธขเธดเธšเธ‚เธถเน‰เธ™เธกเธฒเน‚เธ”เธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธดเน€เธกเธทเนˆเธญเน€เธžเธดเนˆเธก', - 'dashboard.analysis.market.USStock': 'เธซเธธเน‰เธ™เธชเธซเธฃเธฑเธ', - 'dashboard.analysis.market.Crypto': 'เธชเธเธธเธฅเน€เธ‡เธดเธ™เธ”เธดเธˆเธดเธ—เธฑเธฅ', - 'dashboard.analysis.market.Forex': 'เธŸเธญเน€เธฃเน‡เธเธ‹เนŒ', - 'dashboard.analysis.market.Futures': 'เธŸเธดเธงเน€เธˆเธญเธฃเนŒเธช', - 'dashboard.analysis.modal.history.title': 'เธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธฒเธ‡เธ›เธฃเธฐเธงเธฑเธ•เธดเธจเธฒเธชเธ•เธฃเนŒ', - 'dashboard.analysis.modal.history.viewResult': 'เธ”เธนเธœเธฅเธฅเธฑเธžเธ˜เนŒ', - 'dashboard.analysis.modal.history.completeTime': 'เน€เธงเธฅเธฒเน€เธชเธฃเน‡เธˆเธชเธดเน‰เธ™', - 'dashboard.analysis.modal.history.error': 'เธ„เธงเธฒเธกเธœเธดเธ”เธžเธฅเธฒเธ”', - 'dashboard.analysis.status.pending': 'เธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'dashboard.analysis.status.processing': 'เธเธณเธฅเธฑเธ‡เธ›เธฃเธฐเธกเธงเธฅเธœเธฅ', - 'dashboard.analysis.status.completed': 'เธชเธกเธšเธนเธฃเธ“เนŒ', - 'dashboard.analysis.status.failed': 'เธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.analysis.message.selectSymbol': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเน€เธ›เน‰เธฒเธซเธกเธฒเธขเธเนˆเธญเธ™', - 'dashboard.analysis.message.taskCreated': 'เธ‡เธฒเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเน„เธ”เน‰เธ–เธนเธเธชเธฃเน‰เธฒเธ‡เธ‚เธถเน‰เธ™เนเธฅเน‰เธงเนเธฅเธฐเธเธณเธฅเธฑเธ‡เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธญเธขเธนเนˆเน€เธšเธทเน‰เธญเธ‡เธซเธฅเธฑเธ‡...', - 'dashboard.analysis.message.analysisComplete': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ', - 'dashboard.analysis.message.analysisCompleteCache': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ (เนƒเธŠเน‰เธ‚เน‰เธญเธกเธนเธฅเธ—เธตเนˆเนเธ„เธŠเน„เธงเน‰)', - 'dashboard.analysis.message.analysisFailed': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธฅเน‰เธกเน€เธซเธฅเธง เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'dashboard.analysis.message.addStockSuccess': 'เน€เธžเธดเนˆเธกเน€เธฃเธตเธขเธšเธฃเน‰เธญเธขเนเธฅเน‰เธง', - 'dashboard.analysis.message.addStockFailed': 'เน€เธžเธดเนˆเธกเธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.analysis.message.removeStockSuccess': 'เธฅเธšเธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง', - 'dashboard.analysis.message.removeStockFailed': 'เธเธฒเธฃเธฅเธšเธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.analysis.message.resumingAnalysis': 'เธเธณเธฅเธฑเธ‡เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ‡เธฒเธ™เธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ•เนˆเธญ...', - 'dashboard.analysis.message.deleteSuccess': 'เธฅเธšเธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง', - 'dashboard.analysis.message.deleteFailed': 'เธเธฒเธฃเธฅเธšเธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.analysis.modal.history.delete': 'เธฅเธš', - 'dashboard.analysis.modal.history.deleteConfirm': 'เธ„เธธเธ“เนเธ™เนˆเนƒเธˆเธซเธฃเธทเธญเน„เธกเนˆเธงเนˆเธฒเธ•เน‰เธญเธ‡เธเธฒเธฃเธฅเธšเธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ™เธตเน‰?', - 'dashboard.analysis.test': 'เธฃเน‰เธฒเธ™เธ„เน‰เธฒเน€เธฅเธ‚เธ—เธตเนˆ {no} เธ–เธ™เธ™ Gongzhan', - 'dashboard.analysis.introduce': 'เธ„เธณเธญเธ˜เธดเธšเธฒเธขเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.analysis.total-sales': 'เธขเธญเธ”เธ‚เธฒเธขเธฃเธงเธก', - 'dashboard.analysis.day-sales': 'เธขเธญเธ”เธ‚เธฒเธขเน€เธ‰เธฅเธตเนˆเธขเธ•เนˆเธญเธงเธฑเธ™๏ฟฅ', - 'dashboard.analysis.visits': 'เธเธฒเธฃเน€เธ‚เน‰เธฒเธŠเธก', - 'dashboard.analysis.visits-trend': 'เนเธ™เธงเน‚เธ™เน‰เธกเธเธฒเธฃเน€เธ‚เน‰เธฒเธŠเธก', - 'dashboard.analysis.visits-ranking': 'เธญเธฑเธ™เธ”เธฑเธšเธเธฒเธฃเน€เธ‚เน‰เธฒเธŠเธกเธฃเน‰เธฒเธ™เธ„เน‰เธฒ', - 'dashboard.analysis.day-visits': 'เธเธฒเธฃเน€เธ‚เน‰เธฒเธŠเธกเธฃเธฒเธขเธงเธฑเธ™', - 'dashboard.analysis.week': 'เธฃเธฒเธขเธชเธฑเธ›เธ”เธฒเธซเนŒเธ›เธตเธ•เนˆเธญเธ›เธต', - 'dashboard.analysis.day': 'เธ›เธตเธ•เนˆเธญเธ›เธต', - 'dashboard.analysis.payments': 'เธˆเธณเธ™เธงเธ™เธเธฒเธฃเธŠเธณเธฃเธฐเน€เธ‡เธดเธ™', - 'dashboard.analysis.conversion-rate': 'เธญเธฑเธ•เธฃเธฒเธเธฒเธฃเนเธ›เธฅเธ‡', - 'dashboard.analysis.operational-effect': 'เธœเธฅเธเธฃเธฐเธ—เธšเธˆเธฒเธเธเธดเธˆเธเธฃเธฃเธกเธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธ‡เธฒเธ™', - 'dashboard.analysis.sales-trend': 'เนเธ™เธงเน‚เธ™เน‰เธกเธเธฒเธฃเธ‚เธฒเธข', - 'dashboard.analysis.sales-ranking': 'เธญเธฑเธ™เธ”เธฑเธšเธขเธญเธ”เธ‚เธฒเธขเธ‚เธญเธ‡เธฃเน‰เธฒเธ™', - 'dashboard.analysis.all-year': 'เธ›เธฃเธฐเธˆเธณเธ›เธต', - 'dashboard.analysis.all-month': 'เน€เธ”เธทเธญเธ™เธ™เธตเน‰', - 'dashboard.analysis.all-week': 'เธชเธฑเธ›เธ”เธฒเธซเนŒเธ™เธตเน‰', - 'dashboard.analysis.all-day': 'เธงเธฑเธ™เธ™เธตเน‰', - 'dashboard.analysis.search-users': 'เธˆเธณเธ™เธงเธ™เธœเธนเน‰เนƒเธŠเน‰เธเธฒเธฃเธ„เน‰เธ™เธซเธฒ', - 'dashboard.analysis.per-capita-search': 'เธเธฒเธฃเธ„เน‰เธ™เธซเธฒเธ•เนˆเธญเธซเธฑเธง', - 'dashboard.analysis.online-top-search': 'เธเธฒเธฃเธ„เน‰เธ™เธซเธฒเธขเธญเธ”เธ™เธดเธขเธกเธญเธญเธ™เน„เธฅเธ™เนŒ', - 'dashboard.analysis.the-proportion-of-sales': 'เธชเธฑเธ”เธชเนˆเธงเธ™เธ›เธฃเธฐเน€เธ เธ—เธเธฒเธฃเธ‚เธฒเธข', - 'dashboard.analysis.dropdown-option-one': 'เธ›เธเธดเธšเธฑเธ•เธดเธเธฒเธฃเธ—เธตเนˆเธซเธ™เธถเนˆเธ‡', - 'dashboard.analysis.dropdown-option-two': 'เธ›เธเธดเธšเธฑเธ•เธดเธเธฒเธฃ 2', - 'dashboard.analysis.channel.all': 'เธ—เธธเธเธŠเนˆเธญเธ‡', - 'dashboard.analysis.channel.online': 'เธญเธญเธ™เน„เธฅเธ™เนŒ', - 'dashboard.analysis.channel.stores': 'เน€เธเน‡เธš', - 'dashboard.analysis.sales': 'เธเนˆเธฒเธขเธ‚เธฒเธข', - 'dashboard.analysis.traffic': 'เธเธฒเธฃเน„เธซเธฅเธ‚เธญเธ‡เธœเธนเน‰เน‚เธ”เธขเธชเธฒเธฃ', - 'dashboard.analysis.table.rank': 'เธเธฒเธฃเธˆเธฑเธ”เธญเธฑเธ™เธ”เธฑเธš', - 'dashboard.analysis.table.search-keyword': 'เธ„เน‰เธ™เธซเธฒเธ„เธณเธชเธณเธ„เธฑเธ', - 'dashboard.analysis.table.users': 'เธˆเธณเธ™เธงเธ™เธœเธนเน‰เนƒเธŠเน‰', - 'dashboard.analysis.table.weekly-range': 'เน€เธžเธดเนˆเธกเธ‚เธถเน‰เธ™เธฃเธฒเธขเธชเธฑเธ›เธ”เธฒเธซเนŒ', - 'dashboard.indicator.selectSymbol': 'เน€เธฅเธทเธญเธเธซเธฃเธทเธญเธ›เน‰เธญเธ™เธฃเธซเธฑเธชเธžเธทเน‰เธ™เธเธฒเธ™', - 'dashboard.indicator.emptyWatchlistHint': 'เธ‚เธ“เธฐเธ™เธตเน‰เน„เธกเนˆเธกเธตเธซเธธเน‰เธ™เธ—เธตเนˆเน€เธฅเธทเธญเธเน€เธญเธ‡ เธเธฃเธธเธ“เธฒเน€เธžเธดเนˆเธกเธเนˆเธญเธ™', - 'dashboard.indicator.hint.selectSymbol': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเน€เธ›เน‰เธฒเธซเธกเธฒเธขเน€เธžเธทเนˆเธญเน€เธฃเธดเนˆเธกเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ', - 'dashboard.indicator.hint.selectSymbolDesc': 'เน€เธฅเธทเธญเธเธซเธฃเธทเธญเธ›เน‰เธญเธ™เธฃเธซเธฑเธชเธซเธธเน‰เธ™เนƒเธ™เธŠเนˆเธญเธ‡เธ„เน‰เธ™เธซเธฒเธ”เน‰เธฒเธ™เธšเธ™เน€เธžเธทเนˆเธญเธ”เธนเธเธฃเธฒเธŸ K-line เนเธฅเธฐเธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'dashboard.indicator.retry': 'เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡', - 'dashboard.indicator.panel.title': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'dashboard.indicator.panel.realtimeOn': 'เธ›เธดเธ”เธเธฒเธฃเธญเธฑเธžเน€เธ”เธ•เนเธšเธšเน€เธฃเธตเธขเธฅเน„เธ—เธกเนŒ', - 'dashboard.indicator.panel.realtimeOff': 'เน€เธ›เธดเธ”เนƒเธŠเน‰เธ‡เธฒเธ™เธเธฒเธฃเธญเธฑเธ›เน€เธ”เธ•เนเธšเธšเน€เธฃเธตเธขเธฅเน„เธ—เธกเนŒ', - 'dashboard.indicator.panel.themeLight': 'เน€เธ›เธฅเธตเนˆเธขเธ™เน€เธ›เน‡เธ™เธ˜เธตเธกเธชเธตเน€เธ‚เน‰เธก', - 'dashboard.indicator.panel.themeDark': 'เน€เธ›เธฅเธตเนˆเธขเธ™เน€เธ›เน‡เธ™เธ˜เธตเธกเธชเธงเนˆเธฒเธ‡', - 'dashboard.indicator.section.enabled': 'เน€เธ›เธดเธ”เนƒเธŠเน‰เธ‡เธฒเธ™เนเธฅเน‰เธง', - 'dashboard.indicator.section.added': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธตเนˆเธ‰เธฑเธ™เน€เธžเธดเนˆเธก', - 'dashboard.indicator.section.custom': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ—เธตเนˆเธชเธฃเน‰เธฒเธ‡เธ‚เธถเน‰เธ™เธ”เน‰เธงเธขเธ•เธฑเธงเน€เธญเธ‡', - 'dashboard.indicator.section.bought': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธตเนˆเธ‰เธฑเธ™เธ‹เธทเน‰เธญ', - 'dashboard.indicator.section.myCreated': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธตเนˆเธ‰เธฑเธ™เธชเธฃเน‰เธฒเธ‡เธ‚เธถเน‰เธ™', - 'dashboard.indicator.empty': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰ เน‚เธ›เธฃเธ”เน€เธžเธดเนˆเธกเธซเธฃเธทเธญเธชเธฃเน‰เธฒเธ‡เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธเนˆเธญเธ™', - 'dashboard.indicator.buy': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธเธฒเธฃเธ‹เธทเน‰เธญ', - 'dashboard.indicator.action.start': 'เน€เธฃเธดเนˆเธกเธ•เน‰เธ™เธ‚เธถเน‰เธ™', - 'dashboard.indicator.action.stop': 'เธ›เธดเธ”', - 'dashboard.indicator.action.edit': 'เนเธเน‰เน„เธ‚', - 'dashboard.indicator.action.delete': 'เธฅเธš', - 'dashboard.indicator.action.backtest': 'เธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡', - 'dashboard.indicator.status.normal': 'เธ›เธเธ•เธด', - 'dashboard.indicator.status.normalPermanent': 'เธ›เธเธ•เธด (เนƒเธŠเน‰เน„เธ”เน‰เธ–เธฒเธงเธฃ)', - 'dashboard.indicator.status.expired': 'เธซเธกเธ”เธญเธฒเธขเธธเนเธฅเน‰เธง', - 'dashboard.indicator.expiry.permanent': 'เธกเธตเธœเธฅเธ–เธฒเธงเธฃ', - 'dashboard.indicator.expiry.noExpiry': 'เน„เธกเนˆเธกเธตเน€เธงเธฅเธฒเธซเธกเธ”เธญเธฒเธขเธธ', - 'dashboard.indicator.expiry.expired': 'เธซเธกเธ”เธญเธฒเธขเธธ: {date}', - 'dashboard.indicator.expiry.expiresOn': 'เน€เธงเธฅเธฒเธซเธกเธ”เธญเธฒเธขเธธ: {date}', - 'dashboard.indicator.delete.confirmTitle': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเธฅเธš', - 'dashboard.indicator.delete.confirmContent': 'เธ„เธธเธ“เนเธ™เนˆเนƒเธˆเธซเธฃเธทเธญเน„เธกเนˆเธงเนˆเธฒเธ•เน‰เธญเธ‡เธเธฒเธฃเธฅเธšเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰ "{name}"?เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ™เธตเน‰เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธขเน‰เธญเธ™เธเธฅเธฑเธšเน„เธ”เน‰', - 'dashboard.indicator.delete.confirmOk': 'เธฅเธš', - 'dashboard.indicator.delete.confirmCancel': 'เธขเธเน€เธฅเธดเธ', - 'dashboard.indicator.delete.success': 'เธฅเธšเธชเธณเน€เธฃเน‡เธˆ', - 'dashboard.indicator.delete.failed': 'เธฅเธšเน„เธกเนˆเธชเธณเน€เธฃเน‡เธˆ', - 'dashboard.indicator.save.success': 'เธšเธฑเธ™เธ—เธถเธเน€เธฃเธตเธขเธšเธฃเน‰เธญเธขเนเธฅเน‰เธง', - 'dashboard.indicator.save.failed': 'เธšเธฑเธ™เธ—เธถเธเธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.indicator.error.loadWatchlistFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน‚เธซเธฅเธ”เธซเธธเน‰เธ™เน€เธชเธฃเธดเธกเน„เธ”เน‰', - 'dashboard.indicator.error.chartNotReady': 'เธชเนˆเธงเธ™เธ›เธฃเธฐเธเธญเธšเนเธœเธ™เธ เธนเธกเธดเน„เธกเนˆเน„เธ”เน‰เน€เธ•เธฃเธตเธขเธกเนƒเธŠเน‰เธ‡เธฒเธ™ เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเน€เธ›เน‰เธฒเธซเธกเธฒเธขเธเนˆเธญเธ™เนเธฅเน‰เธงเธฃเธญเนƒเธซเน‰เนเธœเธ™เธ เธนเธกเธดเน‚เธซเธฅเธ”', - 'dashboard.indicator.error.chartMethodNotReady': 'เธงเธดเธ˜เธตเธชเนˆเธงเธ™เธ›เธฃเธฐเธเธญเธšเนเธœเธ™เธ เธนเธกเธดเน„เธกเนˆเธžเธฃเน‰เธญเธก เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'dashboard.indicator.error.chartExecuteNotReady': 'เธงเธดเธ˜เธตเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธชเนˆเธงเธ™เธ›เธฃเธฐเธเธญเธšเนเธœเธ™เธ เธนเธกเธดเน„เธกเนˆเธžเธฃเน‰เธญเธก เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'dashboard.indicator.error.parseFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เนเธขเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเน‚เธ„เน‰เธ” Python', - 'dashboard.indicator.error.parseFailedCheck': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เนเธขเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเน‚เธ„เน‰เธ” Python เน„เธ”เน‰ เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเธฃเธนเธ›เนเธšเธšเน‚เธ„เน‰เธ”', - 'dashboard.indicator.error.addIndicatorFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน€เธžเธดเนˆเธกเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เน„เธ”เน‰', - 'dashboard.indicator.error.runIndicatorFailed': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธเธฒเธฃเธ—เธณเธ‡เธฒเธ™เธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.indicator.error.pleaseLogin': 'เธเธฃเธธเธ“เธฒเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธเนˆเธญเธ™', - 'dashboard.indicator.error.loadDataFailed': 'เธเธฒเธฃเน‚เธซเธฅเธ”เธ‚เน‰เธญเธกเธนเธฅเธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.indicator.error.loadDataFailedDesc': 'เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเน€เธ„เธฃเธทเธญเธ‚เนˆเธฒเธข', - 'dashboard.indicator.error.pythonEngineFailed': 'เน‚เธซเธฅเธ”เธเธฅเน„เธ Python เธฅเน‰เธกเน€เธซเธฅเธงเนเธฅเธฐเธŸเธฑเธ‡เธเนŒเธŠเธฑเธ™เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธญเธฒเธˆเน„เธกเนˆเธžเธฃเน‰เธญเธกเนƒเธŠเน‰เธ‡เธฒเธ™', - 'dashboard.indicator.error.chartInitFailed': 'เธเธฒเธฃเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เนเธœเธ™เธ เธนเธกเธดเธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.indicator.warning.enterCode': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธเนˆเธญเธ™', - 'dashboard.indicator.warning.pyodideLoadFailed': 'เน‚เธ›เธฃเนเธเธฃเธก Python เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน‚เธซเธฅเธ”เน„เธ”เน‰', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'เธ„เธธเธ“เธชเธกเธšเธฑเธ•เธดเธ™เธตเน‰เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เนƒเธŠเน‰เน„เธ”เน‰เนƒเธ™เธ เธนเธกเธดเธ เธฒเธ„เธซเธฃเธทเธญเธชเธ เธฒเธžเนเธงเธ”เธฅเน‰เธญเธกเน€เธ„เธฃเธทเธญเธ‚เนˆเธฒเธขเธ›เธฑเธˆเธˆเธธเธšเธฑเธ™เธ‚เธญเธ‡เธ„เธธเธ“', - 'dashboard.indicator.warning.chartNotInitialized': 'เนเธœเธ™เธ เธนเธกเธดเน„เธกเนˆเน„เธ”เน‰เน€เธ•เธฃเธตเธขเธกเนƒเธŠเน‰เธ‡เธฒเธ™เนเธฅเธฐเน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เนƒเธŠเน‰เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญเธงเธฒเธ”เน€เธชเน‰เธ™เน„เธ”เน‰', - 'dashboard.indicator.success.runIndicator': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธณเธ‡เธฒเธ™เธชเธณเน€เธฃเน‡เธˆ', - 'dashboard.indicator.success.clearDrawings': 'เธฅเน‰เธฒเธ‡เธ เธฒเธžเธงเธฒเธ”เน€เธชเน‰เธ™เธ—เธฑเน‰เธ‡เธซเธกเธ”เนเธฅเน‰เธง', - 'dashboard.indicator.sma': 'SMA (เธŠเธธเธ”เธ„เนˆเธฒเธœเธชเธกเธ„เนˆเธฒเน€เธ‰เธฅเธตเนˆเธขเน€เธ„เธฅเธทเนˆเธญเธ™เธ—เธตเนˆ)', - 'dashboard.indicator.ema': 'EMA (เธŠเธธเธ”เธ„เนˆเธฒเธœเธชเธกเธ„เนˆเธฒเน€เธ‰เธฅเธตเนˆเธขเน€เธ„เธฅเธทเนˆเธญเธ™เธ—เธตเนˆเน€เธญเน‡เธเธ‹เนŒเน‚เธ›เน€เธ™เธ™เน€เธŠเธตเธขเธฅ)', - 'dashboard.indicator.rsi': 'RSI (เธ„เธงเธฒเธกเนเธฃเธ‡เธชเธฑเธกเธžเธฑเธ—เธ˜เนŒ)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'เน‚เธšเธฅเธดเธ™เน€เธˆเธญเธฃเนŒ เนเธšเธ™เธ”เนŒ', - 'dashboard.indicator.atr': 'ATR (เธŠเนˆเธงเธ‡เธ—เธตเนˆเนเธ—เน‰เธˆเธฃเธดเธ‡เน€เธ‰เธฅเธตเนˆเธข)', - 'dashboard.indicator.cci': 'CCI (เธ”เธฑเธŠเธ™เธตเธŠเนˆเธญเธ‡เธชเธดเธ™เธ„เน‰เธฒเน‚เธ เธ„เธ เธฑเธ“เธ‘เนŒ)', - 'dashboard.indicator.williams': 'เธงเธดเธฅเน€เธฅเธตเธขเธกเธชเนŒ %R (เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธงเธดเธฅเน€เธฅเธตเธขเธกเธชเนŒ)', - 'dashboard.indicator.mfi': 'MFI (เธ”เธฑเธŠเธ™เธตเธเธฒเธฃเน„เธซเธฅเธ‚เธญเธ‡เน€เธ‡เธดเธ™)', - 'dashboard.indicator.adx': 'ADX (เธ”เธฑเธŠเธ™เธตเนเธ™เธงเน‚เธ™เน‰เธกเน€เธ‰เธฅเธตเนˆเธข)', - 'dashboard.indicator.obv': 'OBV (เธ„เธฅเธทเนˆเธ™เธžเธฅเธฑเธ‡เธ‡เธฒเธ™)', - 'dashboard.indicator.adosc': 'ADOSC (เธญเธญเธชเธ‹เธดเธฅเน€เธฅเน€เธ•เธญเธฃเนŒเธชเธฐเธชเธก/เธชเนˆเธ‡)', - 'dashboard.indicator.ad': 'AD (เน€เธชเน‰เธ™เธเธฒเธฃเธชเธฐเธชเธก/เธเธฒเธฃเธเธฃเธฐเธˆเธฒเธข)', - 'dashboard.indicator.kdj': 'KDJ (เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธชเธธเนˆเธก)', - 'dashboard.indicator.signal.buy': 'เธ‹เธทเน‰เธญ', - 'dashboard.indicator.signal.sell': 'เธ‚เธฒเธข', - 'dashboard.indicator.signal.supertrendBuy': 'เธ‹เธทเน‰เธญ SuperTrend', - 'dashboard.indicator.signal.supertrendSell': 'เธ‚เธฒเธข SuperTrend', - 'dashboard.indicator.chart.kline': 'เน€เธ„เน„เธฅเธ™เนŒ', - 'dashboard.indicator.chart.volume': 'เธ›เธฃเธดเธกเธฒเธ“', - 'dashboard.indicator.chart.uptrend': 'เธญเธฑเธžเน€เธ—เธฃเธ™เธ”เนŒ', - 'dashboard.indicator.chart.downtrend': 'เน€เธ—เธฃเธ™เธ”เนŒเธ‚เธฒเธฅเธ‡', - 'dashboard.indicator.tooltip.time': 'เน€เธงเธฅเธฒ', - 'dashboard.indicator.tooltip.open': 'เน€เธ›เธดเธ”', - 'dashboard.indicator.tooltip.close': 'เธฃเธฑเธš', - 'dashboard.indicator.tooltip.high': 'เธชเธนเธ‡', - 'dashboard.indicator.tooltip.low': 'เธ•เนˆเธณ', - 'dashboard.indicator.tooltip.volume': 'เธ›เธฃเธดเธกเธฒเธ“', - 'dashboard.indicator.drawing.line': 'เธชเนˆเธงเธ™เธ‚เธญเธ‡เน€เธชเน‰เธ™', - 'dashboard.indicator.drawing.horizontalLine': 'เน€เธชเน‰เธ™เนเธ™เธงเธ™เธญเธ™', - 'dashboard.indicator.drawing.verticalLine': 'เน€เธชเน‰เธ™เนเธ™เธงเธ•เธฑเน‰เธ‡', - 'dashboard.indicator.drawing.ray': 'เธฃเธฑเธ‡เธชเธต', - 'dashboard.indicator.drawing.straightLine': 'เน€เธชเน‰เธ™เธ•เธฃเธ‡', - 'dashboard.indicator.drawing.parallelLine': 'เน€เธชเน‰เธ™เธ‚เธ™เธฒเธ™', - 'dashboard.indicator.drawing.priceLine': 'เน€เธชเน‰เธ™เธฃเธฒเธ„เธฒ', - 'dashboard.indicator.drawing.priceChannel': 'เธŠเนˆเธญเธ‡เธฃเธฒเธ„เธฒ', - 'dashboard.indicator.drawing.fibonacciLine': 'เน€เธชเน‰เธ™เธŸเธตเน‚เธšเธ™เธฑเธเธŠเธต', - 'dashboard.indicator.drawing.clearAll': 'เธฅเน‰เธฒเธ‡เธ เธฒเธžเธงเธฒเธ”เน€เธชเน‰เธ™เธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'dashboard.indicator.market.USStock': 'เธซเธธเน‰เธ™เธชเธซเธฃเธฑเธ', - 'dashboard.indicator.market.Crypto': 'เธชเธเธธเธฅเน€เธ‡เธดเธ™เธ”เธดเธˆเธดเธ—เธฑเธฅ', - 'dashboard.indicator.market.Forex': 'เธŸเธญเน€เธฃเน‡เธเธ‹เนŒ', - 'dashboard.indicator.market.Futures': 'เธŸเธดเธงเน€เธˆเธญเธฃเนŒเธช', - 'dashboard.indicator.create': 'เธชเธฃเน‰เธฒเธ‡เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.title': 'เธชเธฃเน‰เธฒเธ‡/เนเธเน‰เน„เธ‚เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.name': 'เธŠเธทเนˆเธญเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.nameRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธŠเธทเนˆเธญเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.namePlaceholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธŠเธทเนˆเธญเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.description': 'เธ„เธณเธญเธ˜เธดเธšเธฒเธขเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.descriptionPlaceholder': 'เน‚เธ›เธฃเธ”เธ›เน‰เธญเธ™เธ„เธณเธญเธ˜เธดเธšเธฒเธขเธ‚เธญเธ‡เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰ (เธ•เธฑเธงเน€เธฅเธทเธญเธ)', - 'dashboard.indicator.editor.code': 'เธฃเธซเธฑเธชเธซเธฅเธฒเธก', - 'dashboard.indicator.editor.codeRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.codePlaceholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเน„เธžเธ˜เธญเธ™', - 'dashboard.indicator.editor.run': 'เธงเธดเนˆเธ‡', - 'dashboard.indicator.editor.runHint': 'เธ„เธฅเธดเธเธ›เธธเนˆเธกเน€เธฃเธตเธขเธเนƒเธŠเน‰เน€เธžเธทเนˆเธญเธ”เธนเธ•เธฑเธงเธญเธขเนˆเธฒเธ‡เน€เธญเธŸเน€เธŸเธเธ•เนŒเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธšเธ™เนเธœเธ™เธ เธนเธกเธดเน€เธชเน‰เธ™ K', - 'dashboard.indicator.editor.guide': 'เธ„เธนเนˆเธกเธทเธญเธเธฒเธฃเธžเธฑเธ’เธ™เธฒ', - 'dashboard.indicator.editor.guideTitle': 'เธ„เธนเนˆเธกเธทเธญเธเธฒเธฃเธžเธฑเธ’เธ™เธฒเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰ Python', - 'dashboard.indicator.editor.save': 'เธšเธฑเธ™เธ—เธถเธ', - 'dashboard.indicator.editor.cancel': 'เธขเธเน€เธฅเธดเธ', - 'dashboard.indicator.editor.unnamed': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธตเนˆเน„เธกเนˆเธกเธตเธŠเธทเนˆเธญ', - 'dashboard.indicator.editor.publishToCommunity': 'เน‚เธžเธชเธ•เนŒเน„เธ›เธ—เธตเนˆเธŠเธธเธกเธŠเธ™', - 'dashboard.indicator.editor.publishToCommunityHint': 'เน€เธกเธทเนˆเธญเน€เธœเธขเนเธžเธฃเนˆเนเธฅเน‰เธง เธœเธนเน‰เนƒเธŠเน‰เธฃเธฒเธขเธญเธทเนˆเธ™เธˆเธฐเธชเธฒเธกเธฒเธฃเธ–เธ”เธนเนเธฅเธฐเนƒเธŠเน‰เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ‚เธญเธ‡เธ„เธธเธ“เนƒเธ™เธŠเธธเธกเธŠเธ™เน„เธ”เน‰', - 'dashboard.indicator.editor.indicatorType': 'เธ›เธฃเธฐเน€เธ เธ—เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.indicatorTypeRequired': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธ›เธฃเธฐเน€เธ เธ—เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.indicatorTypePlaceholder': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธ›เธฃเธฐเน€เธ เธ—เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.indicator.editor.previewImage': 'เธ”เธนเธ•เธฑเธงเธญเธขเนˆเธฒเธ‡', - 'dashboard.indicator.editor.uploadImage': 'เธญเธฑเธžเน‚เธซเธฅเธ”เธฃเธนเธ›เธ เธฒเธž', - 'dashboard.indicator.editor.previewImageHint': 'เธ‚เธ™เธฒเธ”เธ—เธตเนˆเนเธ™เธฐเธ™เธณ: 800x400 เน„เธกเนˆเน€เธเธดเธ™ 2MB', - 'dashboard.indicator.editor.pricing': 'เธฃเธฒเธ„เธฒเธ‚เธฒเธข (QDT)', - 'dashboard.indicator.editor.pricingType.free': 'เธŸเธฃเธต', - 'dashboard.indicator.editor.pricingType.permanent': 'เธ–เธฒเธงเธฃ', - 'dashboard.indicator.editor.pricingType.monthly': 'เธเธฒเธฃเธŠเธณเธฃเธฐเน€เธ‡เธดเธ™เธฃเธฒเธขเน€เธ”เธทเธญเธ™', - 'dashboard.indicator.editor.price': 'เธฃเธฒเธ„เธฒ', - 'dashboard.indicator.editor.priceRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธฒเธ„เธฒ', - 'dashboard.indicator.editor.pricePlaceholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธฒเธ„เธฒ', - 'dashboard.indicator.editor.pricingHint': 'เนเธกเน‰เธงเนˆเธฒเธฃเธฒเธ„เธฒเธ‚เธญเธ‡เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธŸเธฃเธตเธˆเธฐเน€เธ›เน‡เธ™ 0 เนเธ•เนˆเนเธžเธฅเธ•เธŸเธญเธฃเนŒเธกเธˆเธฐเนƒเธซเน‰เธฃเธฒเธ‡เธงเธฑเธฅเนเธเนˆเธ„เธธเธ“ (QDT) เธ•เธฒเธกเธเธฒเธฃเนƒเธŠเน‰เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เนเธฅเธฐเธญเธฑเธ•เธฃเธฒเธเธฒเธฃเธŠเธกเน€เธŠเธขเธ‚เธญเธ‡เธ„เธธเธ“', - 'dashboard.indicator.editor.aiGenerate': 'เธฃเธธเนˆเธ™เธญเธฑเธˆเธ‰เธฃเธดเธขเธฐ', - 'dashboard.indicator.editor.aiPromptPlaceholder': 'เธšเธญเธเธ„เธงเธฒเธกเธ„เธดเธ”เธ‚เธญเธ‡เธ„เธธเธ“เธกเธฒเนƒเธซเน‰เธ‰เธฑเธ™ เนเธฅเน‰เธงเธ‰เธฑเธ™เธˆเธฐเธชเธฃเน‰เธฒเธ‡เน‚เธ„เน‰เธ”เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰ Python เนƒเธซเน‰เธเธฑเธšเธ„เธธเธ“', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI เธชเธฃเน‰เธฒเธ‡เน‚เธ„เน‰เธ”', - 'dashboard.indicator.editor.aiPromptRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ„เธงเธฒเธกเธ„เธดเธ”เธ‚เธญเธ‡เธ„เธธเธ“', - 'dashboard.indicator.editor.aiGenerateSuccess': 'เธเธฒเธฃเธชเธฃเน‰เธฒเธ‡เธฃเธซเธฑเธชเธชเธณเน€เธฃเน‡เธˆ', - 'dashboard.indicator.editor.aiGenerateError': 'เธเธฒเธฃเธชเธฃเน‰เธฒเธ‡เน‚เธ„เน‰เธ”เธฅเน‰เธกเน€เธซเธฅเธง เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'dashboard.indicator.backtest.title': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธขเน‰เธญเธ™เธเธฅเธฑเธš', - 'dashboard.indicator.backtest.config': 'เธžเธฒเธฃเธฒเธกเธดเน€เธ•เธญเธฃเนŒเธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธเธฅเธฑเธš', - 'dashboard.indicator.backtest.startDate': 'เธงเธฑเธ™เธ—เธตเนˆเน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'dashboard.indicator.backtest.endDate': 'เธงเธฑเธ™เธ—เธตเนˆเธชเธดเน‰เธ™เธชเธธเธ”', - 'dashboard.indicator.backtest.selectStartDate': 'เน€เธฅเธทเธญเธเธงเธฑเธ™เธ—เธตเนˆเน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'dashboard.indicator.backtest.selectEndDate': 'เน€เธฅเธทเธญเธเธงเธฑเธ™เธ—เธตเนˆเธชเธดเน‰เธ™เธชเธธเธ”', - 'dashboard.indicator.backtest.startDateRequired': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธงเธฑเธ™เธ—เธตเนˆเน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'dashboard.indicator.backtest.endDateRequired': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธงเธฑเธ™เธ—เธตเนˆเธชเธดเน‰เธ™เธชเธธเธ”', - 'dashboard.indicator.backtest.initialCapital': 'เธ—เธธเธ™เน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'dashboard.indicator.backtest.initialCapitalRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเน€เธ‡เธดเธ™เธ—เธธเธ™เน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'dashboard.indicator.backtest.commission': 'เธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃ', - 'dashboard.indicator.backtest.leverage': 'เธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เน€เธฅเน€เธงเธญเน€เธฃเธˆ', - 'dashboard.indicator.backtest.tradeDirection': 'เธ—เธดเธจเธ—เธฒเธ‡เธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'dashboard.indicator.backtest.longOnly': 'เธขเธฒเธงเน„เธ›', - 'dashboard.indicator.backtest.shortOnly': 'เธชเธฑเน‰เธ™', - 'dashboard.indicator.backtest.both': 'เธชเธญเธ‡เธ—เธฒเธ‡', - 'dashboard.indicator.backtest.run': 'เน€เธฃเธดเนˆเธกเธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡', - 'dashboard.indicator.backtest.rerun': 'เธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡', - 'dashboard.indicator.backtest.close': 'เธ›เธดเธ”', - 'dashboard.indicator.backtest.running': 'เธญเธขเธนเนˆเธฃเธฐเธซเธงเนˆเธฒเธ‡เธเธฒเธฃเธ—เธ”เธชเธญเธšเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธขเน‰เธญเธ™เธเธฅเธฑเธš...', - 'dashboard.indicator.backtest.results': 'เธœเธฅเธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡', - 'dashboard.indicator.backtest.totalReturn': 'เธœเธฅเธ•เธญเธšเนเธ—เธ™เธฃเธงเธก', - 'dashboard.indicator.backtest.annualReturn': 'เธฃเธฒเธขเน„เธ”เน‰เธ•เนˆเธญเธ›เธต', - 'dashboard.indicator.backtest.maxDrawdown': 'เธเธฒเธฃเน€เธšเธดเธเธ–เธญเธ™เธชเธนเธ‡เธชเธธเธ”', - 'dashboard.indicator.backtest.sharpeRatio': 'เธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เธ„เธงเธฒเธกเธ„เธกเธŠเธฑเธ”', - 'dashboard.indicator.backtest.winRate': 'เธญเธฑเธ•เธฃเธฒเธเธฒเธฃเธŠเธ™เธฐ', - 'dashboard.indicator.backtest.profitFactor': 'เธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เธเธณเน„เธฃ-เธ‚เธฒเธ”เธ—เธธเธ™', - 'dashboard.indicator.backtest.totalTrades': 'เธˆเธณเธ™เธงเธ™เธ˜เธธเธฃเธเธฃเธฃเธก', - 'dashboard.indicator.totalReturn': 'เธœเธฅเธ•เธญเธšเนเธ—เธ™เธฃเธงเธก', - 'dashboard.indicator.annualReturn': 'เธญเธฑเธ•เธฃเธฒเธœเธฅเธ•เธญเธšเนเธ—เธ™เธ•เนˆเธญเธ›เธต', - 'dashboard.indicator.maxDrawdown': 'เธเธฒเธฃเน€เธšเธดเธเธ–เธญเธ™เธชเธนเธ‡เธชเธธเธ”', - 'dashboard.indicator.sharpeRatio': 'เธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เธ„เธงเธฒเธกเธ„เธกเธŠเธฑเธ”', - 'dashboard.indicator.winRate': 'เธญเธฑเธ•เธฃเธฒเธเธฒเธฃเธŠเธ™เธฐ', - 'dashboard.indicator.profitFactor': 'เธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เธเธณเน„เธฃ-เธ‚เธฒเธ”เธ—เธธเธ™', - 'dashboard.indicator.totalTrades': 'เธˆเธณเธ™เธงเธ™เธ˜เธธเธฃเธเธฃเธฃเธกเธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'dashboard.indicator.backtest.totalCommission': 'เธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃเธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'dashboard.indicator.backtest.equityCurve': 'เน€เธชเน‰เธ™เธญเธฑเธ•เธฃเธฒเธœเธฅเธ•เธญเธšเนเธ—เธ™', - 'dashboard.indicator.backtest.strategy': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธฃเธฒเธขเน„เธ”เน‰', - 'dashboard.indicator.backtest.benchmark': 'เธœเธฅเธ•เธญเธšเนเธ—เธ™เธกเธฒเธ•เธฃเธเธฒเธ™', - 'dashboard.indicator.backtest.tradeHistory': 'เธ›เธฃเธฐเธงเธฑเธ•เธดเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธก', - 'dashboard.indicator.backtest.tradeTime': 'เน€เธงเธฅเธฒ', - 'dashboard.indicator.backtest.tradeType': 'เธžเธดเธกเธžเนŒ', - 'dashboard.indicator.backtest.buy': 'เธ‹เธทเน‰เธญ', - 'dashboard.indicator.backtest.sell': 'เธ‚เธฒเธข', - 'dashboard.indicator.backtest.liquidation': 'เธเธฒเธฃเธŠเธณเธฃเธฐเธšเธฑเธเธŠเธต', - 'dashboard.indicator.backtest.openLong': 'เน€เธ›เธดเธ”เธขเธฒเธงเน†', - 'dashboard.indicator.backtest.closeLong': 'เธ›เธดเธ™เธ•เธฑเธง', - 'dashboard.indicator.backtest.closeLongStop': 'เนƒเธเธฅเน‰เธ–เธถเธ‡เธฃเธฐเธขเธฐเธขเธฒเธง (เธซเธขเธธเธ”เธเธฒเธฃเธชเธนเธเน€เธชเธตเธข)', - 'dashboard.indicator.backtest.closeLongProfit': 'เธ›เธดเธ”เธกเธฒเธเธ‚เธถเน‰เธ™ (เธ—เธณเธเธณเน„เธฃ)', - 'dashboard.indicator.backtest.addLong': 'เน€เธžเธดเนˆเธกเธ•เธณเนเธซเธ™เนˆเธ‡เธขเธฒเธง', - 'dashboard.indicator.backtest.openShort': 'เน€เธ›เธดเธ”เธชเธฑเน‰เธ™', - 'dashboard.indicator.backtest.closeShort': 'เธงเนˆเธฒเธ‡เน€เธ›เธฅเนˆเธฒ', - 'dashboard.indicator.backtest.closeShortStop': 'เธ›เธดเธ” (เธซเธขเธธเธ”เธเธฒเธฃเธชเธนเธเน€เธชเธตเธข)', - 'dashboard.indicator.backtest.closeShortProfit': 'เธ›เธดเธ” (เธ—เธณเธเธณเน„เธฃ)', - 'dashboard.indicator.backtest.addShort': 'เน€เธžเธดเนˆเธกเธ•เธณเนเธซเธ™เนˆเธ‡เธชเธฑเน‰เธ™', - 'dashboard.indicator.backtest.price': 'เธฃเธฒเธ„เธฒ', - 'dashboard.indicator.backtest.amount': 'เธ›เธฃเธดเธกเธฒเธ“', - 'dashboard.indicator.backtest.balance': 'เธขเธญเธ”เน€เธ‡เธดเธ™เนƒเธ™เธšเธฑเธเธŠเธต', - 'dashboard.indicator.backtest.profit': 'เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™', - 'dashboard.indicator.backtest.success': 'เธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธเธฅเธฑเธšเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ', - 'dashboard.indicator.backtest.failed': 'เธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธเธฅเธฑเธšเธฅเน‰เธกเน€เธซเธฅเธง เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'dashboard.indicator.backtest.noIndicatorCode': 'เน„เธกเนˆเธกเธตเธฃเธซเธฑเธชเธ—เธตเนˆเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธเธฅเธฑเธšเน„เธ”เน‰เธชเธณเธซเธฃเธฑเธšเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ™เธตเน‰', - 'dashboard.indicator.backtest.noSymbol': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเน€เธ›เน‰เธฒเธซเธกเธฒเธขเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธกเธเนˆเธญเธ™', - 'dashboard.indicator.backtest.dateRangeExceeded': 'เธŠเนˆเธงเธ‡เน€เธงเธฅเธฒเธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡เน€เธเธดเธ™เธ‚เธตเธ”เธˆเธณเธเธฑเธ”: {timeframe} เธฃเธญเธšเธชเธฒเธกเธฒเธฃเธ–เธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡เน„เธ”เน‰เธชเธนเธ‡เธชเธธเธ” {maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', - 'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', - 'dashboard.indicator.backtest.prev': 'Previous', - 'dashboard.indicator.backtest.next': 'Next', - 'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', - 'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', - 'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', - 'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', - 'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', - 'dashboard.indicator.backtest.steps.results.title': 'Results', - 'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', - 'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', - 'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', - 'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', - 'dashboard.indicator.backtest.panel.position': 'Position sizing', - 'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', - 'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', - 'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', - 'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', - 'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', - 'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', - 'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', - 'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion scale-in', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'Scale-in trigger (%)', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'Scale-in size (% of capital)', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max scale-in times', - 'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', - 'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', - 'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', - 'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', - 'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', - 'dashboard.indicator.backtest.reduceLong': 'Reduce Long', - 'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', - 'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - 'dashboard.docs.title': 'เธจเธนเธ™เธขเนŒเน€เธญเธเธชเธฒเธฃ', - 'dashboard.docs.search.placeholder': 'เธ„เน‰เธ™เธซเธฒเน€เธญเธเธชเธฒเธฃ...', - 'dashboard.docs.category.all': 'เธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'dashboard.docs.category.guide': 'เธ„เธนเนˆเธกเธทเธญเธเธฒเธฃเธžเธฑเธ’เธ™เธฒ', - 'dashboard.docs.category.api': 'เน€เธญเธเธชเธฒเธฃเธ›เธฃเธฐเธเธญเธš API', - 'dashboard.docs.category.tutorial': 'เธšเธ—เธŠเนˆเธงเธขเธชเธญเธ™', - 'dashboard.docs.category.faq': 'เธ„เธณเธ–เธฒเธกเธ—เธตเนˆเธžเธšเธšเนˆเธญเธข', - 'dashboard.docs.featured.title': 'เน€เธญเธเธชเธฒเธฃเนเธ™เธฐเธ™เธณ', - 'dashboard.docs.featured.tag': 'เนเธ™เธฐเธ™เธณ', - 'dashboard.docs.list.views': 'เน€เธฃเธตเธขเธเธ”เธน', - 'dashboard.docs.list.author': 'เธœเธนเน‰เน€เธ‚เธตเธขเธ™', - 'dashboard.docs.list.empty': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเน€เธญเธเธชเธฒเธฃ', - 'dashboard.docs.list.backToAll': 'เธเธฅเธฑเธšเน„เธ›เธ—เธตเนˆเน€เธญเธเธชเธฒเธฃเธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'dashboard.docs.list.total': 'เน€เธญเธเธชเธฒเธฃเธ—เธฑเน‰เธ‡เธซเธกเธ” {count}', - 'dashboard.docs.detail.back': 'เธเธฅเธฑเธšเน„เธ›เธขเธฑเธ‡เธฃเธฒเธขเธเธฒเธฃเน€เธญเธเธชเธฒเธฃ', - 'dashboard.docs.detail.updatedAt': 'เธญเธฑเธ›เน€เธ”เธ•เน€เธกเธทเนˆเธญ', - 'dashboard.docs.detail.related': 'เน€เธญเธเธชเธฒเธฃเธ—เธตเนˆเน€เธเธตเนˆเธขเธงเธ‚เน‰เธญเธ‡', - 'dashboard.docs.detail.notFound': 'เน„เธกเนˆเธกเธตเน€เธญเธเธชเธฒเธฃเธญเธขเธนเนˆ', - 'dashboard.docs.detail.error': 'เน€เธญเธเธชเธฒเธฃเน„เธกเนˆเธกเธตเธญเธขเธนเนˆเธซเธฃเธทเธญเธ–เธนเธเธฅเธšเน„เธ›เนเธฅเน‰เธง', - 'dashboard.docs.search.result': 'เธœเธฅเธเธฒเธฃเธ„เน‰เธ™เธซเธฒ', - 'dashboard.docs.search.keyword': 'เธ„เธณเธซเธฅเธฑเธ', - 'community.filter.indicatorType': 'เธ›เธฃเธฐเน€เธ เธ—เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'community.filter.all': 'เธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'community.filter.other': 'เธ•เธฑเธงเน€เธฅเธทเธญเธเธญเธทเนˆเธ™เน†', - 'community.filter.pricing': 'เธ›เธฃเธฐเน€เธ เธ—เธเธฒเธฃเธเธณเธซเธ™เธ”เธฃเธฒเธ„เธฒ', - 'community.filter.allPricing': 'เธฃเธฒเธ„เธฒเธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'community.filter.sortBy': 'เธˆเธฑเธ”เน€เธฃเธตเธขเธ‡เธ•เธฒเธก', - 'community.filter.search': 'เธ„เน‰เธ™เธซเธฒ', - 'community.filter.searchPlaceholder': 'เธ„เน‰เธ™เธซเธฒเธŠเธทเนˆเธญเน€เธกเธ•เธฃเธดเธ', - 'community.indicatorType.trend': 'เธ›เธฃเธฐเน€เธ เธ—เน€เธ—เธฃเธ™เธ”เนŒ', - 'community.indicatorType.momentum': 'เธ›เธฃเธฐเน€เธ เธ—เน‚เธกเน€เธกเธ™เธ•เธฑเธก', - 'community.indicatorType.volatility': 'เธ„เธงเธฒเธกเธœเธฑเธ™เธœเธงเธ™', - 'community.indicatorType.volume': 'เธ›เธฃเธดเธกเธฒเธ“', - 'community.indicatorType.custom': 'เธ›เธฃเธฑเธšเนเธ•เนˆเธ‡', - 'community.pricing.free': 'เธŸเธฃเธต', - 'community.pricing.paid': 'เธˆเนˆเธฒเธข', - 'community.sort.downloads': 'เธ”เธฒเธงเธ™เนŒเน‚เธซเธฅเธ”', - 'community.sort.rating': 'เธ„เธฐเนเธ™เธ™', - 'community.sort.newest': 'เธฃเธธเนˆเธ™เธฅเนˆเธฒเธชเธธเธ”', - 'community.pagination.total': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ—เธฑเน‰เธ‡เธซเธกเธ” {total}', - 'community.noDescription': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ„เธณเธญเธ˜เธดเธšเธฒเธข', - 'community.detail.type': 'เธžเธดเธกเธžเนŒ', - 'community.detail.pricing': 'เธฃเธฒเธ„เธฒ', - 'community.detail.rating': 'เธ„เธฐเนเธ™เธ™', - 'community.detail.downloads': 'เธ”เธฒเธงเธ™เนŒเน‚เธซเธฅเธ”', - 'community.detail.author': 'เธœเธนเน‰เน€เธ‚เธตเธขเธ™', - 'community.detail.description': 'เธเธฒเธฃเนเธ™เธฐเธ™เธณ', - 'community.detail.detailContent': 'เธ„เธณเธญเธ˜เธดเธšเธฒเธขเน‚เธ”เธขเธฅเธฐเน€เธญเธตเธขเธ”', - 'community.detail.backtestStats': 'เธชเธ–เธดเธ•เธดเธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡', - 'community.action.purchase': 'เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธเธฒเธฃเธ‹เธทเน‰เธญ', - 'community.action.addToMyIndicators': 'เน€เธžเธดเนˆเธกเน„เธ›เธขเธฑเธ‡เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ‚เธญเธ‡เธ‰เธฑเธ™', - 'community.action.favorite': 'เน€เธเน‡เธšเธฃเธงเธšเธฃเธงเธก', - 'community.action.unfavorite': 'เธขเธเน€เธฅเธดเธเธฃเธฒเธขเธเธฒเธฃเน‚เธ›เธฃเธ”', - 'community.action.buyNow': 'เธ‹เธทเน‰เธญเน€เธฅเธข', - 'community.action.renew': 'เธ•เนˆเธญเธญเธฒเธขเธธ', - 'community.purchase.price': 'เธฃเธฒเธ„เธฒ', - 'community.purchase.permanent': 'เธ–เธฒเธงเธฃ', - 'community.purchase.monthly': 'เธ”เธงเธ‡เธˆเธฑเธ™เธ—เธฃเนŒ', - 'community.purchase.confirmBuy': 'เธขเธทเธ™เธขเธฑเธ™เธ—เธตเนˆเธˆเธฐเธ‹เธทเน‰เธญเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ™เธตเน‰ ({price} QDT)?', - 'community.purchase.confirmRenew': 'เธขเธทเธ™เธขเธฑเธ™เธ—เธตเนˆเธˆเธฐเธ•เนˆเธญเธญเธฒเธขเธธเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ™เธตเน‰ ({price} QDT/เน€เธ”เธทเธญเธ™) เธซเธฃเธทเธญเน„เธกเนˆ', - 'community.purchase.confirmFree': 'เธขเธทเธ™เธขเธฑเธ™เน€เธžเธทเนˆเธญเน€เธžเธดเนˆเธกเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธŸเธฃเธตเธ™เธตเน‰เธซเธฃเธทเธญเน„เธกเนˆ', - 'community.purchase.confirmTitle': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'community.purchase.owned': 'เธ„เธธเธ“เน„เธ”เน‰เธ‹เธทเน‰เธญเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ™เธตเน‰ (เนƒเธŠเน‰เน„เธ”เน‰เธ–เธฒเธงเธฃ)', - 'community.purchase.ownIndicator': 'เธ™เธตเนˆเธ„เธทเธญเน€เธกเธ•เธฃเธดเธเธ—เธตเนˆเธ„เธธเธ“เน€เธœเธขเนเธžเธฃเนˆ', - 'community.purchase.expired': 'เธเธฒเธฃเธชเธกเธฑเธ„เธฃเธ‚เธญเธ‡เธ„เธธเธ“เธซเธกเธ”เธญเธฒเธขเธธเนเธฅเน‰เธง', - 'community.purchase.expiresOn': 'เน€เธงเธฅเธฒเธซเธกเธ”เธญเธฒเธขเธธ: {date}', - 'community.tabs.detail': 'เธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'community.tabs.backtest': 'เธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡', - 'community.tabs.ratings': 'เธ„เธงเธฒเธกเธ„เธดเธ”เน€เธซเน‡เธ™เธ‚เธญเธ‡เธœเธนเน‰เนƒเธŠเน‰', - 'community.rating.myRating': 'เธ„เธฐเนเธ™เธ™เธ‚เธญเธ‡เธ‰เธฑเธ™', - 'community.rating.stars': '{count} เธ”เธฒเธง', - 'community.rating.commentPlaceholder': 'เนเธšเนˆเธ‡เธ›เธฑเธ™เธ›เธฃเธฐเธชเธšเธเธฒเธฃเธ“เนŒเธ‚เธญเธ‡เธ„เธธเธ“...', - 'community.rating.submit': 'เธชเนˆเธ‡เน€เธฃเธ•เธ•เธดเน‰เธ‡.', - 'community.rating.modify': 'เธ›เธฃเธฑเธšเธ›เธฃเธธเธ‡เนƒเธซเธกเนˆ', - 'community.rating.saveModify': 'เธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเน€เธ›เธฅเธตเนˆเธขเธ™เนเธ›เธฅเธ‡', - 'community.rating.cancel': 'เธขเธเน€เธฅเธดเธ', - 'community.rating.selectRating': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธเธฒเธฃเนƒเธซเน‰เธ„เธฐเนเธ™เธ™', - 'community.rating.success': 'เน€เธฃเธ•เธ•เธดเน‰เธ‡เธชเธณเน€เธฃเน‡เธˆ', - 'community.rating.modifySuccess': 'เนเธเน‰เน„เธ‚เธเธฒเธฃเธ•เธฃเธงเธˆเธชเธญเธšเน€เธฃเธตเธขเธšเธฃเน‰เธญเธขเนเธฅเน‰เธง', - 'community.rating.failed': 'เธเธฒเธฃเนƒเธซเน‰เธ„เธฐเนเธ™เธ™เธฅเน‰เธกเน€เธซเธฅเธง', - 'community.rating.noRatings': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ„เธงเธฒเธกเธ„เธดเธ”เน€เธซเน‡เธ™', - 'community.backtest.note': 'เธ‚เน‰เธญเธกเธนเธฅเธ‚เน‰เธฒเธ‡เธ•เน‰เธ™เน€เธ›เน‡เธ™เธœเธฅเธเธฒเธฃเธ—เธ”เธชเธญเธšเธขเน‰เธญเธ™เธเธฅเธฑเธšเนƒเธ™เธญเธ”เธตเธ•เนเธฅเธฐเธกเธตเน„เธงเน‰เน€เธžเธทเนˆเธญเธเธฒเธฃเธญเน‰เธฒเธ‡เธญเธดเธ‡เน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™ เนเธฅเธฐเน„เธกเนˆเน„เธ”เน‰เนเธชเธ”เธ‡เธ–เธถเธ‡เธฃเธฒเธขเน„เธ”เน‰เนƒเธ™เธญเธ™เธฒเธ„เธ•', - 'community.backtest.noData': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ‚เน‰เธญเธกเธนเธฅเธขเน‰เธญเธ™เธซเธฅเธฑเธ‡', - 'community.backtest.uploadHint': 'เธœเธนเน‰เน€เธ‚เธตเธขเธ™เธขเธฑเธ‡เน„เธกเนˆเน„เธ”เน‰เธญเธฑเธžเน‚เธซเธฅเธ”เธ‚เน‰เธญเธกเธนเธฅ backtest', - 'community.message.loadFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน‚เธซเธฅเธ”เธฃเธฒเธขเธเธฒเธฃเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'community.message.purchaseProcessing': 'เธเธณเธฅเธฑเธ‡เธ›เธฃเธฐเธกเธงเธฅเธœเธฅเธ„เธณเธ‚เธญเธ‹เธทเน‰เธญ...', - 'community.message.downloadSuccess': 'เน€เธžเธดเนˆเธกเน€เธกเธ•เธฃเธดเธเธฅเธ‡เนƒเธ™เธฃเธฒเธขเธเธฒเธฃเน€เธกเธ•เธฃเธดเธเธ‚เธญเธ‡เธ‰เธฑเธ™เนเธฅเน‰เธง', - 'community.message.favoriteSuccess': 'เธฃเธงเธšเธฃเธงเธกเธชเธณเน€เธฃเน‡เธˆ', - 'community.message.unfavoriteSuccess': 'เธขเธเน€เธฅเธดเธเธเธฒเธฃเธฃเธงเธšเธฃเธงเธกเน€เธฃเธตเธขเธšเธฃเน‰เธญเธขเนเธฅเน‰เธง', - 'community.message.operationSuccess': 'เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธ‡เธฒเธ™เธ›เธฃเธฐเธชเธšเธ„เธงเธฒเธกเธชเธณเน€เธฃเน‡เธˆ', - 'community.message.operationFailed': 'เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธฅเน‰เธกเน€เธซเธฅเธง', - 'community.banner.readOnly': 'เธญเนˆเธฒเธ™เธญเธขเนˆเธฒเธ‡เน€เธ”เธตเธขเธง', - 'community.banner.loginHint': 'เธชเธณเธซเธฃเธฑเธšเธเธฒเธฃเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธšเธซเธฃเธทเธญเธเธฒเธฃเธฅเธ‡เธ—เธฐเน€เธšเธตเธขเธ™ เธเธฃเธธเธ“เธฒเธ„เธฅเธดเธเธ›เธธเนˆเธกเน€เธžเธทเนˆเธญเน„เธ›เธขเธฑเธ‡เธซเธ™เน‰เธฒเธญเธดเธชเธฃเธฐเน€เธžเธทเนˆเธญเธซเธฅเธตเธเน€เธฅเธตเนˆเธขเธ‡เธ›เธฑเธเธซเธฒ CSRF', - 'community.banner.jumpButton': 'เน„เธ›เธ—เธตเนˆเน€เธ‚เน‰เธฒเธชเธนเนˆเธฃเธฐเธšเธš/เธฅเธ‡เธ—เธฐเน€เธšเธตเธขเธ™', - 'dashboard.totalEquity': 'เธชเนˆเธงเธ™เธ‚เธญเธ‡เธœเธนเน‰เธ–เธทเธญเธซเธธเน‰เธ™เธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'dashboard.totalPnL': 'เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™เธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'dashboard.aiStrategies': 'เธเธฅเธขเธธเธ—เธ˜เนŒเน€เธญเน„เธญ', - 'dashboard.indicatorStrategies': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'dashboard.running': 'เธงเธดเนˆเธ‡', - 'dashboard.pnlHistory': 'เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™เนƒเธ™เธญเธ”เธตเธ•', - 'dashboard.strategyPerformance': 'เธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™เธ‚เธญเธ‡เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'dashboard.recentTrades': 'เธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธกเธฅเนˆเธฒเธชเธธเธ”', - 'dashboard.currentPositions': 'เธ•เธณเนเธซเธ™เนˆเธ‡เธ›เธฑเธˆเธˆเธธเธšเธฑเธ™', - 'dashboard.table.time': 'เน€เธงเธฅเธฒ', - 'dashboard.table.strategy': 'เธŠเธทเนˆเธญเธเธฃเธกเธ˜เธฃเธฃเธกเนŒ', - 'dashboard.table.symbol': 'เน€เธ›เน‰เธฒ', - 'dashboard.table.type': 'เธžเธดเธกเธžเนŒ', - 'dashboard.table.side': 'เธ—เธดเธจเธ—เธฒเธ‡', - 'dashboard.table.size': 'เน€เธ›เธดเธ”เธ”เธญเธเน€เธšเธตเน‰เธข', - 'dashboard.table.entryPrice': 'เธฃเธฒเธ„เธฒเน€เธ›เธดเธ”เน€เธ‰เธฅเธตเนˆเธข', - 'dashboard.table.price': 'เธฃเธฒเธ„เธฒ', - 'dashboard.table.amount': 'เธ›เธฃเธดเธกเธฒเธ“', - 'dashboard.table.profit': 'เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™', - 'dashboard.pendingOrders': 'เธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญ', - 'dashboard.totalOrders': 'เธฃเธงเธก {total} เธฃเธฒเธขเธเธฒเธฃ', - 'dashboard.viewError': 'เธ”เธนเธ‚เน‰เธญเธœเธดเธ”เธžเธฅเธฒเธ”', - 'dashboard.filled': 'เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเนเธฅเน‰เธง', - 'dashboard.orderTable.time': 'เน€เธงเธฅเธฒเธ—เธตเนˆเธชเธฃเน‰เธฒเธ‡', - 'dashboard.orderTable.strategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'dashboard.orderTable.symbol': 'เธ„เธนเนˆเน€เธ—เธฃเธ”', - 'dashboard.orderTable.signalType': 'เธ›เธฃเธฐเน€เธ เธ—เธชเธฑเธเธเธฒเธ“', - 'dashboard.orderTable.amount': 'เธˆเธณเธ™เธงเธ™', - 'dashboard.orderTable.price': 'เธฃเธฒเธ„เธฒเธ—เธตเนˆเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'dashboard.orderTable.status': 'เธชเธ–เธฒเธ™เธฐ', - 'dashboard.orderTable.executedAt': 'เน€เธงเธฅเธฒเธ—เธตเนˆเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'dashboard.signalType.openLong': 'เน€เธ›เธดเธ” Long', - 'dashboard.signalType.openShort': 'เน€เธ›เธดเธ” Short', - 'dashboard.signalType.closeLong': 'เธ›เธดเธ” Long', - 'dashboard.signalType.closeShort': 'เธ›เธดเธ” Short', - 'dashboard.signalType.addLong': 'เน€เธžเธดเนˆเธก Long', - 'dashboard.signalType.addShort': 'เน€เธžเธดเนˆเธก Short', - 'dashboard.status.pending': 'เธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'dashboard.status.processing': 'เธเธณเธฅเธฑเธ‡เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'dashboard.status.completed': 'เน€เธชเธฃเน‡เธˆเธชเธดเน‰เธ™', - 'dashboard.status.failed': 'เธฅเน‰เธกเน€เธซเธฅเธง', - 'dashboard.status.cancelled': 'เธขเธเน€เธฅเธดเธเนเธฅเน‰เธง', - 'dashboard.table.pnl': 'เธเธณเน„เธฃเธซเธฃเธทเธญเธ‚เธฒเธ”เธ—เธธเธ™เธ—เธตเนˆเธขเธฑเธ‡เน„เธกเนˆเน€เธเธดเธ”เธ‚เธถเน‰เธ™เธˆเธฃเธดเธ‡', - 'form.basic-form.basic.title': 'เนเธšเธšเธŸเธญเธฃเนŒเธกเธžเธทเน‰เธ™เธเธฒเธ™', - 'form.basic-form.basic.description': 'เธซเธ™เน‰เธฒเนเธšเธšเธŸเธญเธฃเนŒเธกเนƒเธŠเน‰เน€เธžเธทเนˆเธญเธฃเธงเธšเธฃเธงเธกเธซเธฃเธทเธญเธ•เธฃเธงเธˆเธชเธญเธšเธ‚เน‰เธญเธกเธนเธฅเธˆเธฒเธเธœเธนเน‰เนƒเธŠเน‰ เน‚เธ”เธขเธ—เธฑเนˆเธงเน„เธ›เธˆเธฐเนƒเธŠเน‰เนเธšเธšเธŸเธญเธฃเนŒเธกเธžเธทเน‰เธ™เธเธฒเธ™เนƒเธ™เธชเธ–เธฒเธ™เธเธฒเธฃเธ“เนŒเธˆเธณเธฅเธญเธ‡เธ—เธตเนˆเธกเธตเธฃเธฒเธขเธเธฒเธฃเธ‚เน‰เธญเธกเธนเธฅเธ™เน‰เธญเธข', - 'form.basic-form.title.label': 'เธŠเธทเนˆเธญ', - 'form.basic-form.title.placeholder': 'เธ•เธฑเน‰เธ‡เธŠเธทเนˆเธญเนƒเธซเน‰เน€เธ›เน‰เธฒเธซเธกเธฒเธข', - 'form.basic-form.title.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธŠเธทเนˆเธญ', - 'form.basic-form.date.label': 'เธงเธฑเธ™เธ—เธตเนˆเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เนเธฅเธฐเธชเธดเน‰เธ™เธชเธธเธ”', - 'form.basic-form.placeholder.start': 'เธงเธฑเธ™เธ—เธตเนˆเน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'form.basic-form.placeholder.end': 'เธงเธฑเธ™เธ—เธตเนˆเธชเธดเน‰เธ™เธชเธธเธ”', - 'form.basic-form.date.required': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธงเธฑเธ™เธ—เธตเนˆเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เนเธฅเธฐเธชเธดเน‰เธ™เธชเธธเธ”', - 'form.basic-form.goal.label': 'เธ„เธณเธญเธ˜เธดเธšเธฒเธขเน€เธ›เน‰เธฒเธซเธกเธฒเธข', - 'form.basic-form.goal.placeholder': 'เธเธฃเธธเธ“เธฒเธ›เน‰เธญเธ™เน€เธ›เน‰เธฒเธซเธกเธฒเธขเธเธฒเธฃเธ—เธณเธ‡เธฒเธ™เนเธšเธšเน€เธ›เน‡เธ™เธ‚เธฑเน‰เธ™เธ•เธญเธ™เธ‚เธญเธ‡เธ„เธธเธ“', - 'form.basic-form.goal.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ„เธณเธญเธ˜เธดเธšเธฒเธขเน€เธ›เน‰เธฒเธซเธกเธฒเธข', - 'form.basic-form.standard.label': 'เธงเธฑเธ”', - 'form.basic-form.standard.placeholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”', - 'form.basic-form.standard.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”', - 'form.basic-form.client.label': 'เธฅเธนเธเธ„เน‰เธฒ', - 'form.basic-form.client.required': 'เน‚เธ›เธฃเธ”เธญเธ˜เธดเธšเธฒเธขเธฅเธนเธเธ„เน‰เธฒเธ—เธตเนˆเธ„เธธเธ“เนƒเธซเน‰เธšเธฃเธดเธเธฒเธฃ', - 'form.basic-form.label.tooltip': 'เธœเธนเน‰เธฃเธฑเธšเธšเธฃเธดเธเธฒเธฃเน€เธ›เน‰เธฒเธซเธกเธฒเธข', - 'form.basic-form.client.placeholder': 'เน‚เธ›เธฃเธ”เธญเธ˜เธดเธšเธฒเธขเธฅเธนเธเธ„เน‰เธฒเธ—เธตเนˆเธ„เธธเธ“เนƒเธซเน‰เธšเธฃเธดเธเธฒเธฃ เธฅเธนเธเธ„เน‰เธฒเธ เธฒเธขเนƒเธ™เน‚เธ”เธขเธ•เธฃเธ‡ @เธŠเธทเนˆเธญ/เธซเธกเธฒเธขเน€เธฅเธ‚เธ‡เธฒเธ™', - 'form.basic-form.invites.label': 'เน€เธŠเธดเธเธœเธนเน‰เธงเธดเธˆเธฒเธฃเธ“เนŒ', - 'form.basic-form.invites.placeholder': 'เธเธฃเธธเธ“เธฒ @name/เธซเธกเธฒเธขเน€เธฅเธ‚เธžเธ™เธฑเธเธ‡เธฒเธ™ เน‚เธ”เธขเธ•เธฃเธ‡ เธ„เธธเธ“เธชเธฒเธกเธฒเธฃเธ–เน€เธŠเธดเธเน„เธ”เน‰เธชเธนเธ‡เธชเธธเธ” 5 เธ„เธ™', - 'form.basic-form.weight.label': 'เธ™เน‰เธณเธซเธ™เธฑเธ', - 'form.basic-form.weight.placeholder': 'เธเธฃเธธเธ“เธฒเน€เธ‚เน‰เธฒ', - 'form.basic-form.public.label': 'เธเธณเธซเธ™เธ”เน€เธ›เน‰เธฒเธซเธกเธฒเธขเธชเธฒเธ˜เธฒเธฃเธ“เธฐ', - 'form.basic-form.label.help': 'เธฅเธนเธเธ„เน‰เธฒเนเธฅเธฐเธœเธนเน‰เธ•เธฃเธงเธˆเธชเธญเธšเธˆเธฐเธ–เธนเธเนเธŠเธฃเนŒเน‚เธ”เธขเธ„เนˆเธฒเน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'form.basic-form.radio.public': 'เธชเธฒเธ˜เธฒเธฃเธ“เธฐ', - 'form.basic-form.radio.partially-public': 'เน€เธ›เธดเธ”เน€เธœเธขเธ•เนˆเธญเธชเธฒเธ˜เธฒเธฃเธ“เธฐเธšเธฒเธ‡เธชเนˆเธงเธ™', - 'form.basic-form.radio.private': 'เธชเนˆเธงเธ™เธ•เธฑเธง', - 'form.basic-form.publicUsers.placeholder': 'เน€เธ›เธดเธ”เนƒเธซเน‰', - 'form.basic-form.option.A': 'เน€เธžเธทเนˆเธญเธ™เธฃเนˆเธงเธกเธ‡เธฒเธ™ 1', - 'form.basic-form.option.B': 'เน€เธžเธทเนˆเธญเธ™เธฃเนˆเธงเธกเธ‡เธฒเธ™ 2', - 'form.basic-form.option.C': 'เน€เธžเธทเนˆเธญเธ™เธฃเนˆเธงเธกเธ‡เธฒเธ™เธชเธฒเธกเธ„เธ™', - 'form.basic-form.email.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅเธ‚เธญเธ‡เธ„เธธเธ“!', - 'form.basic-form.email.wrong-format': 'เธฃเธนเธ›เนเธšเธšเธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅเน„เธกเนˆเธ–เธนเธเธ•เน‰เธญเธ‡!', - 'form.basic-form.userName.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธŠเธทเนˆเธญเธœเธนเน‰เนƒเธŠเน‰!', - 'form.basic-form.password.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ‚เธญเธ‡เธ„เธธเธ“!', - 'form.basic-form.password.twice': 'เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ—เธตเนˆเธ›เน‰เธญเธ™เธชเธญเธ‡เธ„เธฃเธฑเน‰เธ‡เน„เธกเนˆเธ•เธฃเธ‡เธเธฑเธ™!', - 'form.basic-form.strength.msg': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธญเธขเนˆเธฒเธ‡เธ™เน‰เธญเธข 6 เธ•เธฑเธงเธญเธฑเธเธฉเธฃ เธเธฃเธธเธ“เธฒเธญเธขเนˆเธฒเนƒเธŠเน‰เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ—เธตเนˆเธ„เธฒเธ”เน€เธ”เธฒเน„เธ”เน‰เธ‡เนˆเธฒเธข', - 'form.basic-form.strength.strong': 'เธ„เธงเธฒเธกเนเธ‚เน‡เธ‡เนเธเธฃเนˆเธ‡: เนเธ‚เน‡เธ‡เนเธเธฃเนˆเธ‡', - 'form.basic-form.strength.medium': 'เธ„เธงเธฒเธกเนเธ‚เน‡เธ‡เนเธเธฃเนˆเธ‡: เธ›เธฒเธ™เธเธฅเธฒเธ‡', - 'form.basic-form.strength.short': 'เธ„เธงเธฒเธกเนเธฃเธ‡: เธชเธฑเน‰เธ™เน€เธเธดเธ™เน„เธ›', - 'form.basic-form.confirm-password.required': 'เธเธฃเธธเธ“เธฒเธขเธทเธ™เธขเธฑเธ™เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ‚เธญเธ‡เธ„เธธเธ“!', - 'form.basic-form.phone-number.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒเธกเธทเธญเธ–เธทเธญเธ‚เธญเธ‡เธ„เธธเธ“!', - 'form.basic-form.phone-number.wrong-format': 'เธฃเธนเธ›เนเธšเธšเธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒเธกเธทเธญเธ–เธทเธญเธœเธดเธ”!', - 'form.basic-form.verification-code.required': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™!', - 'form.basic-form.form.get-captcha': 'เธฃเธฑเธšเธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™', - 'form.basic-form.captcha.second': 'เธ—เธตเนˆเธชเธญเธ‡', - 'form.basic-form.form.optional': '(เน„เธกเนˆเธˆเธณเน€เธ›เน‡เธ™)', - 'form.basic-form.form.submit': 'เธชเนˆเธ‡', - 'form.basic-form.form.save': 'เธšเธฑเธ™เธ—เธถเธ', - 'form.basic-form.email.placeholder': 'เธˆเธ”เธซเธกเธฒเธข', - 'form.basic-form.password.placeholder': 'เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธญเธขเนˆเธฒเธ‡เธ™เน‰เธญเธข 6 เธ•เธฑเธงเธญเธฑเธเธฉเธฃ เธ„เธณเธ™เธถเธ‡เธ–เธถเธ‡เธ•เธฑเธงเธžเธดเธกเธžเนŒเน€เธฅเน‡เธเนเธฅเธฐเธ•เธฑเธงเธžเธดเธกเธžเนŒเนƒเธซเธเนˆ', - 'form.basic-form.confirm-password.placeholder': 'เธขเธทเธ™เธขเธฑเธ™เธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'form.basic-form.phone-number.placeholder': 'เธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒ', - 'form.basic-form.verification-code.placeholder': 'เธฃเธซเธฑเธชเธขเธทเธ™เธขเธฑเธ™', - 'result.success.title': 'เธชเนˆเธ‡เธชเธณเน€เธฃเน‡เธˆ', - 'result.success.description': 'เธซเธ™เน‰เธฒเธœเธฅเธฅเธฑเธžเธ˜เนŒเธเธฒเธฃเธชเนˆเธ‡เนƒเธŠเน‰เน€เธžเธทเนˆเธญเธ•เธญเธšเธเธฅเธฑเธšเธœเธฅเธเธฒเธฃเธ›เธฃเธฐเธกเธงเธฅเธœเธฅเธ‚เธญเธ‡เธŠเธธเธ”เธ‡เธฒเธ™เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธ‡เธฒเธ™ เธซเธฒเธเน€เธ›เน‡เธ™เน€เธžเธตเธขเธ‡เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ‡เนˆเธฒเธขเน† เนƒเธซเน‰เนƒเธŠเน‰เธ‚เน‰เธญเธ„เธงเธฒเธกเธ•เธญเธšเธฃเธฑเธšเธžเธฃเน‰เธญเธกเธ—เนŒเธ—เธฑเนˆเธงเน‚เธฅเธเธžเธทเน‰เธ™เธ—เธตเนˆเธ‚เน‰เธญเธ„เธงเธฒเธกเธ™เธตเน‰เธชเธฒเธกเธฒเธฃเธ–เนเธชเธ”เธ‡เธ„เธณเนเธ™เธฐเธ™เธณเน€เธชเธฃเธดเธกเธ‡เนˆเธฒเธขเน† เธซเธฒเธเธˆเธณเน€เธ›เน‡เธ™เธ•เน‰เธญเธ‡เนเธชเธ”เธ‡ "เน€เธญเธเธชเธฒเธฃ" เธžเธทเน‰เธ™เธ—เธตเนˆเธชเธตเน€เธ—เธฒเธ”เน‰เธฒเธ™เธฅเนˆเธฒเธ‡เธชเธฒเธกเธฒเธฃเธ–เนเธชเธ”เธ‡เน€เธ™เธทเน‰เธญเธซเธฒเธ—เธตเนˆเธ‹เธฑเธšเธ‹เน‰เธญเธ™เธกเธฒเธเธ‚เธถเน‰เธ™เน„เธ”เน‰', - 'result.success.operate-title': 'เธŠเธทเนˆเธญเน‚เธ„เธฃเธ‡เธเธฒเธฃ', - 'result.success.operate-id': 'เธฃเธซเธฑเธชเน‚เธ„เธฃเธ‡เธเธฒเธฃ', - 'result.success.principal': 'เธšเธธเธ„เธ„เธฅเธ—เธตเนˆเธฃเธฑเธšเธœเธดเธ”เธŠเธญเธš', - 'result.success.operate-time': 'เน€เธงเธฅเธฒเธ—เธตเนˆเธกเธตเธ›เธฃเธฐเธชเธดเธ—เธ˜เธดเธ เธฒเธž', - 'result.success.step1-title': 'เธชเธฃเน‰เธฒเธ‡เน‚เธ„เธฃเธ‡เธเธฒเธฃ', - 'result.success.step1-operator': 'เธ„เธน เธฅเธดเธฅเธตเนˆ', - 'result.success.step2-title': 'เธเธฒเธฃเธ—เธšเธ—เธงเธ™เน€เธšเธทเน‰เธญเธ‡เธ•เน‰เธ™เธ‚เธญเธ‡เนเธœเธ™เธ', - 'result.success.step2-operator': 'เน‚เธˆเธง เน€เธซเธกเธฒเน€เธซเธกเธฒ', - 'result.success.step2-extra': 'เธ”เนˆเธงเธ™', - 'result.success.step3-title': 'เธเธฒเธฃเธ•เธฃเธงเธˆเธชเธญเธšเธ—เธฒเธ‡เธเธฒเธฃเน€เธ‡เธดเธ™', - 'result.success.step4-title': 'เน€เธชเธฃเน‡เธˆ', - 'result.success.btn-return': 'เธเธฅเธฑเธšเน„เธ›เธ—เธตเนˆเธฃเธฒเธขเธเธฒเธฃ', - 'result.success.btn-project': 'เธ”เธนเธฃเธฒเธขเธเธฒเธฃ', - 'result.success.btn-print': 'เธžเธดเธกเธžเนŒ', - 'result.fail.error.title': 'เธเธฒเธฃเธชเนˆเธ‡เธฅเน‰เธกเน€เธซเธฅเธง', - 'result.fail.error.description': 'เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเนเธฅเธฐเนเธเน‰เน„เธ‚เธ‚เน‰เธญเธกเธนเธฅเธ•เนˆเธญเน„เธ›เธ™เธตเน‰เธเนˆเธญเธ™เธ—เธตเนˆเธˆเธฐเธชเนˆเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡', - 'result.fail.error.hint-title': 'เน€เธ™เธทเน‰เธญเธซเธฒเธ—เธตเนˆเธ„เธธเธ“เธชเนˆเธ‡เธกเธตเธ‚เน‰เธญเธœเธดเธ”เธžเธฅเธฒเธ”เธ•เนˆเธญเน„เธ›เธ™เธตเน‰:', - 'result.fail.error.hint-text1': 'เธšเธฑเธเธŠเธตเธ‚เธญเธ‡เธ„เธธเธ“เธ–เธนเธเธฃเธฐเธ‡เธฑเธš', - 'result.fail.error.hint-btn1': 'เธฅเธฐเธฅเธฒเธขเธ—เธฑเธ™เธ—เธต', - 'result.fail.error.hint-text2': 'เธšเธฑเธเธŠเธตเธ‚เธญเธ‡เธ„เธธเธ“เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธชเธดเธ—เธ˜เธดเนŒเธชเธกเธฑเธ„เธฃ', - 'result.fail.error.hint-btn2': 'เธญเธฑเธžเน€เธเธฃเธ”เธ•เธญเธ™เธ™เธตเน‰', - 'result.fail.error.btn-text': 'เธเธฅเธฑเธšเน„เธ›เนเธเน‰เน„เธ‚', - 'account.settings.menuMap.custom': 'เธเธฒเธฃเธ›เธฃเธฑเธšเน€เธ›เธฅเธตเนˆเธขเธ™เนƒเธ™เนเธšเธšเธ‚เธญเธ‡เธ„เธธเธ“', - 'account.settings.menuMap.binding': 'เธเธฒเธฃเธœเธนเธเธšเธฑเธเธŠเธต', - 'account.settings.basic.avatar': 'เธญเธงเธ•เธฒเธฃ', - 'account.settings.basic.change-avatar': 'เน€เธ›เธฅเธตเนˆเธขเธ™เธญเธงเธ•เธฒเธฃ', - 'account.settings.basic.email': 'เธˆเธ”เธซเธกเธฒเธข', - 'account.settings.basic.email-message': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธญเธตเน€เธกเธฅเนŒเธ‚เธญเธ‡เธ„เธธเธ“!', - 'account.settings.basic.nickname': 'เธŠเธทเนˆเธญเธ™เธดเธ„', - 'account.settings.basic.nickname-message': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธŠเธทเนˆเธญเน€เธฅเนˆเธ™เธ‚เธญเธ‡เธ„เธธเธ“!', - 'account.settings.basic.profile': 'เธ›เธฃเธฐเธงเธฑเธ•เธดเน‚เธ”เธขเธขเนˆเธญ', - 'account.settings.basic.profile-message': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธชเนˆเธงเธ™เธ•เธฑเธงเธ‚เธญเธ‡เธ„เธธเธ“!', - 'account.settings.basic.profile-placeholder': 'เธ›เธฃเธฐเธงเธฑเธ•เธดเน‚เธ”เธขเธขเนˆเธญ', - 'account.settings.basic.country': 'เธ›เธฃเธฐเน€เธ—เธจ/เธ เธนเธกเธดเธ เธฒเธ„', - 'account.settings.basic.country-message': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ›เธฃเธฐเน€เธ—เธจเธซเธฃเธทเธญเธ เธนเธกเธดเธ เธฒเธ„เธ‚เธญเธ‡เธ„เธธเธ“!', - 'account.settings.basic.geographic': 'เธˆเธฑเธ‡เธซเธงเธฑเธ”เนเธฅเธฐเน€เธกเธทเธญเธ‡', - 'account.settings.basic.geographic-message': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธฑเธ‡เธซเธงเธฑเธ”เนเธฅเธฐเน€เธกเธทเธญเธ‡เธ‚เธญเธ‡เธ„เธธเธ“!', - 'account.settings.basic.address': 'เธ—เธตเนˆเธญเธขเธนเนˆเธ–เธ™เธ™', - 'account.settings.basic.address-message': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ—เธตเนˆเธญเธขเธนเนˆเธ‚เธญเธ‡เธ„เธธเธ“!', - 'account.settings.basic.phone': 'เน€เธšเธญเธฃเนŒเธ•เธดเธ”เธ•เนˆเธญ', - 'account.settings.basic.phone-message': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธซเธกเธฒเธขเน€เธฅเธ‚เธ•เธดเธ”เธ•เนˆเธญเธ‚เธญเธ‡เธ„เธธเธ“!', - 'account.settings.basic.update': 'เธญเธฑเธžเน€เธ”เธ•เธ‚เน‰เธญเธกเธนเธฅเธžเธทเน‰เธ™เธเธฒเธ™', - 'account.settings.basic.update.success': 'เธญเธฑเธ›เน€เธ”เธ•เธ‚เน‰เธญเธกเธนเธฅเธžเธทเน‰เธ™เธเธฒเธ™เธชเธณเน€เธฃเน‡เธˆ', - 'account.settings.security.strong': 'เธ—เธฃเธ‡เธžเธฅเธฑเธ‡', - 'account.settings.security.medium': 'เธเธฅเธฒเธ‡', - 'account.settings.security.weak': 'เธญเนˆเธญเธ™เนเธญ', - 'account.settings.security.password': 'เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธšเธฑเธเธŠเธต', - 'account.settings.security.password-description': 'เธ„เธงเธฒเธกเธขเธฒเธเธ‚เธญเธ‡เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธ›เธฑเธˆเธˆเธธเธšเธฑเธ™:', - 'account.settings.security.phone': 'เธเธฒเธฃเธฃเธฑเธเธฉเธฒเธ„เธงเธฒเธกเธ›เธฅเธญเธ”เธ เธฑเธขเน‚เธ—เธฃเธจเธฑเธžเธ—เนŒเธกเธทเธญเธ–เธทเธญ', - 'account.settings.security.phone-description': 'เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒเธกเธทเธญเธ–เธทเธญเธ—เธตเนˆเธœเธนเธเน„เธงเน‰เนเธฅเน‰เธง:', - 'account.settings.security.question': 'เธ›เธฑเธเธซเธฒเธ”เน‰เธฒเธ™เธ„เธงเธฒเธกเธ›เธฅเธญเธ”เธ เธฑเธข', - 'account.settings.security.question-description': 'เน„เธกเนˆเธกเธตเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ„เธณเธ–เธฒเธกเน€เธžเธทเนˆเธญเธ„เธงเธฒเธกเธ›เธฅเธญเธ”เธ เธฑเธข เธ‹เธถเนˆเธ‡เธชเธฒเธกเธฒเธฃเธ–เธ›เธเธ›เน‰เธญเธ‡เธ„เธงเธฒเธกเธ›เธฅเธญเธ”เธ เธฑเธขเธ‚เธญเธ‡เธšเธฑเธเธŠเธตเน„เธ”เน‰เธญเธขเนˆเธฒเธ‡เธกเธตเธ›เธฃเธฐเธชเธดเธ—เธ˜เธดเธ เธฒเธž', - 'account.settings.security.email': 'เธœเธนเธเธญเธตเน€เธกเธฅ', - 'account.settings.security.email-description': 'เธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅเธ—เธตเนˆเธ–เธนเธเธœเธนเธเน„เธงเน‰เนเธฅเน‰เธง:', - 'account.settings.security.mfa': 'เธญเธธเธ›เธเธฃเธ“เนŒเน€เธญเน‡เธกเน€เธญเธŸเน€เธญ', - 'account.settings.security.mfa-description': 'เธญเธธเธ›เธเธฃเธ“เนŒ MFA เน„เธกเนˆเน„เธ”เน‰เธ–เธนเธเธœเธนเธเน„เธงเน‰ เธซเธฅเธฑเธ‡เธˆเธฒเธเธœเธนเธเนเธฅเน‰เธงเธชเธฒเธกเธฒเธฃเธ–เธขเธทเธ™เธขเธฑเธ™เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เน„เธ”เน‰', - 'account.settings.security.modify': 'เธ›เธฃเธฑเธšเธ›เธฃเธธเธ‡เนƒเธซเธกเนˆ', - 'account.settings.security.set': 'เธ•เธฑเน‰เธ‡เธ„เนˆเธฒ', - 'account.settings.security.bind': 'เธœเธนเธเธžเธฑเธ™', - 'account.settings.binding.taobao': 'เธœเธนเธ Taobao', - 'account.settings.binding.taobao-description': 'เธšเธฑเธเธŠเธต Taobao เน„เธกเนˆเน„เธ”เน‰เธ–เธนเธเธœเธนเธเน„เธงเน‰เนƒเธ™เธ‚เธ“เธฐเธ™เธตเน‰', - 'account.settings.binding.alipay': 'เธœเธนเธเธญเธฒเธฅเธตเน€เธžเธขเนŒ', - 'account.settings.binding.alipay-description': 'เธšเธฑเธเธŠเธต Alipay เน„เธกเนˆเน„เธ”เน‰เธ–เธนเธเธœเธนเธเน„เธงเน‰เนƒเธ™เธ‚เธ“เธฐเธ™เธตเน‰', - 'account.settings.binding.dingding': 'เธเธฒเธฃเธœเธนเธเธกเธฑเธ” DingTalk', - 'account.settings.binding.dingding-description': 'เธ‚เธ“เธฐเธ™เธตเน‰เน„เธกเนˆเธกเธตเธšเธฑเธเธŠเธต DingTalk เธ–เธนเธเธœเธนเธเน„เธงเน‰', - 'account.settings.binding.bind': 'เธœเธนเธเธžเธฑเธ™', - 'account.settings.notification.password': 'เธฃเธซเธฑเธชเธœเนˆเธฒเธ™เธšเธฑเธเธŠเธต', - 'account.settings.notification.password-description': 'เธ‚เน‰เธญเธ„เธงเธฒเธกเธˆเธฒเธเธœเธนเน‰เนƒเธŠเน‰เธฃเธฒเธขเธญเธทเนˆเธ™เธˆเธฐเน„เธ”เน‰เธฃเธฑเธšเนเธˆเน‰เธ‡เนƒเธ™เธฃเธนเธ›เนเธšเธšเธ‚เธญเธ‡เธ‚เน‰เธญเธ„เธงเธฒเธกเน„เธ‹เธ•เนŒ', - 'account.settings.notification.messages': 'เธ‚เน‰เธญเธ„เธงเธฒเธกเธ‚เธญเธ‡เธฃเธฐเธšเธš', - 'account.settings.notification.messages-description': 'เธ‚เน‰เธญเธ„เธงเธฒเธกเธ‚เธญเธ‡เธฃเธฐเธšเธšเธˆเธฐเน„เธ”เน‰เธฃเธฑเธšเนเธˆเน‰เธ‡เนƒเธ™เธฃเธนเธ›เนเธšเธšเธ‚เธญเธ‡เธ‚เน‰เธญเธ„เธงเธฒเธกเน„เธ‹เธ•เนŒ', - 'account.settings.notification.todo': 'เธ‡เธฒเธ™เธ—เธตเนˆเธ•เน‰เธญเธ‡เธ—เธณ', - 'account.settings.notification.todo-description': 'เธ‡เธฒเธ™เธ—เธตเนˆเธ•เน‰เธญเธ‡เธ—เธณเธˆเธฐเน„เธ”เน‰เธฃเธฑเธšเนเธˆเน‰เธ‡เนƒเธ™เธฃเธนเธ›เนเธšเธšเธ‚เธญเธ‡เธ‚เน‰เธญเธ„เธงเธฒเธกเนƒเธ™เน„เธ‹เธ•เนŒ', - 'account.settings.settings.open': 'เน€เธ›เธดเธ”', - 'account.settings.settings.close': 'เธ›เธดเธ”', - 'trading-assistant.title': 'เธœเธนเน‰เธŠเนˆเธงเธขเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.strategyList': 'เธฃเธฒเธขเธเธฒเธฃเธเธฅเธขเธธเธ—เธ˜เนŒ', - 'trading-assistant.createStrategy': 'เธชเธฃเน‰เธฒเธ‡เธ™เน‚เธขเธšเธฒเธข', - 'trading-assistant.noStrategy': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธเธฅเธขเธธเธ—เธ˜เนŒ', - 'trading-assistant.selectStrategy': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธเธฅเธขเธธเธ—เธ˜เนŒเธˆเธฒเธเธ”เน‰เธฒเธ™เธ‹เน‰เธฒเธขเน€เธžเธทเนˆเธญเธ”เธนเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”', - 'trading-assistant.startStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเน€เธ›เธดเธ”เธ•เธฑเธง', - 'trading-assistant.stopStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเธซเธขเธธเธ”', - 'trading-assistant.editStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธ”เน‰เธฒเธ™เธšเธฃเธฃเธ“เธฒเธ˜เธดเธเธฒเธฃ', - 'trading-assistant.deleteStrategy': 'เธฅเธšเธ™เน‚เธขเธšเธฒเธข', - 'trading-assistant.status.running': 'เธงเธดเนˆเธ‡', - 'trading-assistant.status.stopped': 'เธซเธขเธธเธ”เนเธฅเน‰เธง', - 'trading-assistant.status.error': 'เธ„เธงเธฒเธกเธœเธดเธ”เธžเธฅเธฒเธ”', - 'trading-assistant.strategyType.IndicatorStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'trading-assistant.strategyType.PromptBasedStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธ„เธณเธ„เธดเธง', - 'trading-assistant.strategyType.GridStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฃเธดเธ”', - 'trading-assistant.tabs.tradingRecords': 'เธ›เธฃเธฐเธงเธฑเธ•เธดเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธก', - 'trading-assistant.tabs.positions': 'เธšเธฑเธ™เธ—เธถเธเธ•เธณเนเธซเธ™เนˆเธ‡', - 'trading-assistant.tabs.equityCurve': 'เน€เธชเน‰เธ™เธชเนˆเธงเธ™เธ‚เธญเธ‡เธœเธนเน‰เธ–เธทเธญเธซเธธเน‰เธ™', - 'trading-assistant.form.step1': 'เน€เธฅเธทเธญเธเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'trading-assistant.form.step2': 'เธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'trading-assistant.form.step3': 'เธžเธฒเธฃเธฒเธกเธดเน€เธ•เธญเธฃเนŒเธเธฅเธขเธธเธ—เธ˜เนŒ', - 'trading-assistant.form.indicator': 'เน€เธฅเธทเธญเธเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'trading-assistant.form.indicatorHint': 'เธ„เธธเธ“เธชเธฒเธกเธฒเธฃเธ–เน€เธฅเธทเธญเธเน„เธ”เน‰เน€เธ‰เธžเธฒเธฐเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„เธ—เธตเนˆเธ„เธธเธ“เธ‹เธทเน‰เธญเธซเธฃเธทเธญเธชเธฃเน‰เธฒเธ‡เธ‚เธถเน‰เธ™เน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™', - 'trading-assistant.form.qdtCostHints': 'เธเธฒเธฃเนƒเธŠเน‰เธเธฅเธขเธธเธ—เธ˜เนŒเธˆเธฐเนƒเธŠเน‰ QDT เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเนƒเธซเน‰เนเธ™เนˆเนƒเธˆเธงเนˆเธฒเธšเธฑเธเธŠเธตเธกเธตเธขเธญเธ”เธ„เธ‡เน€เธซเธฅเธทเธญ QDT เน€เธžเธตเธขเธ‡เธžเธญ', - 'trading-assistant.form.indicatorDescription': 'เธ„เธณเธญเธ˜เธดเธšเธฒเธขเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'trading-assistant.form.noDescription': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ„เธณเธญเธ˜เธดเธšเธฒเธข', - 'trading-assistant.form.exchange': 'เน€เธฅเธทเธญเธเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'trading-assistant.form.apiKey': 'เธ„เธตเธขเนŒ API', - 'trading-assistant.form.secretKey': 'เธฃเธซเธฑเธชเธฅเธฑเธš', - 'trading-assistant.form.passphrase': 'เธ‚เน‰เธญเธ„เธงเธฒเธกเธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'trading-assistant.form.testConnection': 'เธ—เธ”เธชเธญเธšเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญ', - 'trading-assistant.form.strategyName': 'เธŠเธทเนˆเธญเธเธฃเธกเธ˜เธฃเธฃเธกเนŒ', - 'trading-assistant.form.symbol': 'เธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.form.symbolHint': 'เธ‚เธ“เธฐเธ™เธตเน‰เธฃเธญเธ‡เธฃเธฑเธšเน€เธ‰เธžเธฒเธฐเธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธชเธเธธเธฅเน€เธ‡เธดเธ™เธ”เธดเธˆเธดเธ—เธฑเธฅเน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™', - 'trading-assistant.form.initialCapital': 'เธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธฅเธ‡เธ—เธธเธ™', - 'trading-assistant.form.marketType': 'เธ›เธฃเธฐเน€เธ เธ—เธ•เธฅเธฒเธ”', - 'trading-assistant.form.marketTypeFutures': 'เธชเธฑเธเธเธฒ', - 'trading-assistant.form.marketTypeSpot': 'เธˆเธธเธ”เธชเธดเธ™เธ„เน‰เธฒ', - 'trading-assistant.form.marketTypeHint': 'เธชเธฑเธเธเธฒเธฃเธญเธ‡เธฃเธฑเธšเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธชเธญเธ‡เธ—เธฒเธ‡เนเธฅเธฐเน€เธฅเน€เธงเธญเน€เธฃเธˆ เนƒเธ™เธ‚เธ“เธฐเธ—เธตเนˆเธชเธ›เธญเธ•เธฃเธญเธ‡เธฃเธฑเธšเน€เธ‰เธžเธฒเธฐเธ•เธณเนเธซเธ™เนˆเธ‡เธ‹เธทเน‰เธญเนเธฅเธฐเน€เธฅเน€เธงเธญเน€เธฃเธˆเธ„เธ‡เธ—เธตเนˆเธ—เธตเนˆ 1x', - 'trading-assistant.form.leverage': 'เนƒเธŠเน‰เธ›เธฃเธฐเน‚เธขเธŠเธ™เนŒเธซเธฅเธฒเธขเธญเธขเนˆเธฒเธ‡', - 'trading-assistant.form.leverageHint': 'เธชเธฑเธเธเธฒ: 1-125 เธ„เธฃเธฑเน‰เธ‡, เธˆเธธเธ”: เนเธเน‰เน„เธ‚ 1 เธ„เธฃเธฑเน‰เธ‡', - 'trading-assistant.form.spotLeverageFixed': 'เน€เธฅเน€เธงเธญเน€เธฃเธˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธชเธ›เธญเธ•เธ„เธ‡เธ—เธตเนˆเธ—เธตเนˆ 1x', - 'trading-assistant.form.spotOnlyLongHint': 'เธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเนเธšเธšเธชเธ›เธญเธ•เธฃเธญเธ‡เธฃเธฑเธšเน€เธ‰เธžเธฒเธฐเธ•เธณเนเธซเธ™เนˆเธ‡เธ‹เธทเน‰เธญเน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™', - 'trading-assistant.form.tradeDirection': 'เธ—เธดเธจเธ—เธฒเธ‡เธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.form.tradeDirectionLong': 'เธขเธฒเธงเน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™', - 'trading-assistant.form.tradeDirectionShort': 'เธชเธฑเน‰เธ™เน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™', - 'trading-assistant.form.tradeDirectionBoth': 'เธ˜เธธเธฃเธเธฃเธฃเธกเธชเธญเธ‡เธ—เธฒเธ‡', - 'trading-assistant.form.timeframe': 'เธŠเนˆเธงเธ‡เน€เธงเธฅเธฒ', - 'trading-assistant.form.klinePeriod': 'เธŠเนˆเธงเธ‡เน€เธงเธฅเธฒ K-Line', - 'trading-assistant.form.timeframe1m': '1 เธ™เธฒเธ—เธต', - 'trading-assistant.form.timeframe5m': '5 เธ™เธฒเธ—เธต', - 'trading-assistant.form.timeframe15m': '15 เธ™เธฒเธ—เธต', - 'trading-assistant.form.timeframe30m': '30 เธ™เธฒเธ—เธต', - 'trading-assistant.form.timeframe1H': '1 เธŠเธฑเนˆเธงเน‚เธกเธ‡', - 'trading-assistant.form.timeframe4H': '4 เธŠเธฑเนˆเธงเน‚เธกเธ‡', - 'trading-assistant.form.timeframe1D': '1 เธงเธฑเธ™', - 'trading-assistant.form.selectStrategyType': 'เน€เธฅเธทเธญเธเธ›เธฃเธฐเน€เธ เธ—เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'trading-assistant.form.indicatorStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'trading-assistant.form.indicatorStrategyDesc': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธดเธ•เธฒเธกเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'trading-assistant.form.aiStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒ AI', - 'trading-assistant.form.aiStrategyDesc': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธดเธ•เธฒเธกเธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธญเธฑเธˆเธ‰เธฃเธดเธขเธฐเธ‚เธญเธ‡ AI', - 'trading-assistant.form.enableAiFilter': 'เน€เธ›เธดเธ”เนƒเธŠเน‰เธ‡เธฒเธ™เธ•เธฑเธงเธเธฃเธญเธ‡เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธญเธฑเธˆเธ‰เธฃเธดเธขเธฐ AI', - 'trading-assistant.form.enableAiFilterHint': 'เน€เธกเธทเนˆเธญเน€เธ›เธดเธ”เนƒเธŠเน‰เธ‡เธฒเธ™ เธชเธฑเธเธเธฒเธ“เธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธˆเธฐเธ–เธนเธเธเธฃเธญเธ‡เน‚เธ”เธข AI เน€เธžเธทเนˆเธญเธ›เธฃเธฑเธšเธ›เธฃเธธเธ‡เธ„เธธเธ“เธ เธฒเธžเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.form.aiFilterPrompt': 'เธ‚เน‰เธญเธ„เธงเธฒเธกเนเธˆเน‰เธ‡เนเธšเธšเธเธณเธซเธ™เธ”เน€เธญเธ‡', - 'trading-assistant.form.aiFilterPromptHint': 'เนƒเธซเน‰เธ„เธณเนเธ™เธฐเธ™เธณเนเธšเธšเธเธณเธซเธ™เธ”เน€เธญเธ‡เธชเธณเธซเธฃเธฑเธšเธเธฒเธฃเธเธฃเธญเธ‡ AI เน€เธงเน‰เธ™เธงเนˆเธฒเธ‡เน„เธงเน‰เน€เธžเธทเนˆเธญเนƒเธŠเน‰เธ„เนˆเธฒเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เธ‚เธญเธ‡เธฃเธฐเธšเธš', - 'trading-assistant.validation.strategyTypeRequired': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธ›เธฃเธฐเน€เธ เธ—เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'trading-assistant.form.advancedSettings': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ‚เธฑเน‰เธ™เธชเธนเธ‡', - 'trading-assistant.form.orderMode': 'เน‚เธซเธกเธ”เธเธฒเธฃเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญ', - 'trading-assistant.form.orderModeMaker': 'เธœเธนเน‰เธชเธฃเน‰เธฒเธ‡', - 'trading-assistant.form.orderModeTaker': 'เธฃเธฒเธ„เธฒเธ•เธฅเธฒเธ” (เน€เธ—เธ„เน€เธเธญเธฃเนŒ)', - 'trading-assistant.form.orderModeHint': 'เน‚เธซเธกเธ”เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเนƒเธŠเน‰เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเนเธšเธšเธˆเธณเธเธฑเธ”เนเธฅเธฐเธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃเธ•เนˆเธณเธเธงเนˆเธฒ เน‚เธซเธกเธ”เธฃเธฒเธ„เธฒเธ•เธฅเธฒเธ”เธˆเธฐเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ—เธฑเธ™เธ—เธตเนเธฅเธฐเธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃเธˆเธฐเธชเธนเธ‡เธ‚เธถเน‰เธ™', - 'trading-assistant.form.makerWaitSec': 'เน€เธงเธฅเธฒเธฃเธญเธชเธณเธซเธฃเธฑเธšเธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ (เธงเธดเธ™เธฒเธ—เธต)', - 'trading-assistant.form.makerWaitSecHint': 'เน€เธงเธฅเธฒเธ—เธตเนˆเธ•เน‰เธญเธ‡เธฃเธญเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธกเธซเธฅเธฑเธ‡เธˆเธฒเธเธ—เธณเธเธฒเธฃเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญ เธขเธเน€เธฅเธดเธเนเธฅเธฐเธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เธซเธฅเธฑเธ‡เธˆเธฒเธเธซเธกเธ”เน€เธงเธฅเธฒ', - 'trading-assistant.form.makerRetries': 'เธˆเธณเธ™เธงเธ™เธเธฒเธฃเธฅเธญเธ‡เนƒเธซเธกเนˆเธชเธณเธซเธฃเธฑเธšเธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'trading-assistant.form.makerRetriesHint': 'เธˆเธณเธ™เธงเธ™เธ„เธฃเธฑเน‰เธ‡เธชเธนเธ‡เธชเธธเธ”เนƒเธ™เธเธฒเธฃเธฅเธญเธ‡เนƒเธซเธกเนˆเน€เธกเธทเนˆเธญเน„เธกเนˆเน„เธ”เน‰เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'trading-assistant.form.fallbackToMarket': 'เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธฅเน‰เธกเน€เธซเธฅเธงเนเธฅเธฐเธฃเธฒเธ„เธฒเธ•เธฅเธฒเธ”เธ–เธนเธเธฅเธ”เธฃเธฐเธ”เธฑเธšเธฅเธ‡', - 'trading-assistant.form.fallbackToMarketHint': 'เน€เธกเธทเนˆเธญเธเธฒเธฃเน€เธ›เธดเธ”/เธ›เธดเธ”เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเน„เธกเนˆเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ เธ„เธงเธฃเธ”เธฒเธงเธ™เนŒเน€เธเธฃเธ”เน€เธ›เน‡เธ™เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเนƒเธ™เธ•เธฅเธฒเธ”เน€เธžเธทเนˆเธญเนƒเธซเน‰เนเธ™เนˆเนƒเธˆเธงเนˆเธฒเธ˜เธธเธฃเธเธฃเธฃเธกเธˆเธฐเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒเธซเธฃเธทเธญเน„เธกเนˆ', - 'trading-assistant.form.marginMode': 'เน‚เธซเธกเธ”เธฃเธฐเธขเธฐเธ‚เธญเธš', - 'trading-assistant.form.marginModeCross': 'เน‚เธเธ”เธฑเธ‡เน€เธ•เน‡เธก', - 'trading-assistant.form.marginModeIsolated': 'เธ•เธณเนเธซเธ™เนˆเธ‡เธ—เธตเนˆเน‚เธ”เธ”เน€เธ”เธตเนˆเธขเธง', - 'trading-assistant.form.stopLossPct': 'เธญเธฑเธ•เธฃเธฒเธเธฒเธฃเธชเธนเธเน€เธชเธตเธขเธซเธขเธธเธ” (%)', - 'trading-assistant.form.stopLossPctHint': 'เธ•เธฑเน‰เธ‡เธ„เนˆเธฒเน€เธ›เธญเธฃเนŒเน€เธ‹เน‡เธ™เธ•เนŒเธเธฒเธฃเธซเธขเธธเธ”เธเธฒเธฃเธ‚เธฒเธ”เธ—เธธเธ™ 0 เธซเธกเธฒเธขเธ–เธถเธ‡เน„เธกเนˆเน„เธ”เน‰เน€เธ›เธดเธ”เนƒเธŠเน‰เธ‡เธฒเธ™เธเธฒเธฃเธซเธขเธธเธ”เธเธฒเธฃเธ‚เธฒเธ”เธ—เธธเธ™', - 'trading-assistant.form.takeProfitPct': 'เธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เธเธฒเธฃเธ—เธณเธเธณเน„เธฃ (%)', - 'trading-assistant.form.takeProfitPctHint': 'เธ•เธฑเน‰เธ‡เธ„เนˆเธฒเน€เธ›เธญเธฃเนŒเน€เธ‹เน‡เธ™เธ•เนŒเธเธฒเธฃเธ—เธณเธเธณเน„เธฃ 0 เธซเธกเธฒเธขเธ–เธถเธ‡เธ›เธดเธ”เธเธฒเธฃเนƒเธŠเน‰เธ‡เธฒเธ™เธเธฒเธฃเธ—เธณเธเธณเน„เธฃ', - 'trading-assistant.form.signalMode': 'เน‚เธซเธกเธ”เธชเธฑเธเธเธฒเธ“', - 'trading-assistant.form.signalModeConfirmed': 'เธขเธทเธ™เธขเธฑเธ™เน‚เธซเธกเธ”', - 'trading-assistant.form.signalModeAggressive': 'เน‚เธซเธกเธ”เธเน‰เธฒเธงเธฃเน‰เธฒเธง', - 'trading-assistant.form.signalModeHint': 'เน‚เธซเธกเธ”เธเธฒเธฃเธขเธทเธ™เธขเธฑเธ™: เธ•เธฃเธงเธˆเธชเธญเธšเน€เธ‰เธžเธฒเธฐเน€เธชเน‰เธ™ K เธ—เธตเนˆเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒเน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™ เน‚เธซเธกเธ”เธเน‰เธฒเธงเธฃเน‰เธฒเธง: เธ•เธฃเธงเธˆเธชเธญเธšเธเธฒเธฃเธชเธฃเน‰เธฒเธ‡เน€เธชเน‰เธ™ K เธ”เน‰เธงเธข', - 'trading-assistant.form.cancel': 'เธขเธเน€เธฅเธดเธ', - 'trading-assistant.form.prev': 'เธ‚เธฑเน‰เธ™เธ•เธญเธ™เธเนˆเธญเธ™เธซเธ™เน‰เธฒ', - 'trading-assistant.form.next': 'เธ‚เธฑเน‰เธ™เธ•เธญเธ™เธ•เนˆเธญเน„เธ›', - 'trading-assistant.form.confirmCreate': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเธชเธฃเน‰เธฒเธ‡', - 'trading-assistant.form.confirmEdit': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเน€เธ›เธฅเธตเนˆเธขเธ™เนเธ›เธฅเธ‡', - 'trading-assistant.messages.createSuccess': 'เธชเธฃเน‰เธฒเธ‡เธเธฅเธขเธธเธ—เธ˜เนŒเธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง', - 'trading-assistant.messages.createFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธชเธฃเน‰เธฒเธ‡เธ™เน‚เธขเธšเธฒเธขเน„เธ”เน‰', - 'trading-assistant.messages.updateSuccess': 'เธญเธฑเธ›เน€เธ”เธ•เธ™เน‚เธขเธšเธฒเธขเธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง', - 'trading-assistant.messages.updateFailed': 'เธญเธฑเธ›เน€เธ”เธ•เธ™เน‚เธขเธšเธฒเธขเน„เธกเนˆเธชเธณเน€เธฃเน‡เธˆ', - 'trading-assistant.messages.deleteSuccess': 'เธฅเธšเธ™เน‚เธขเธšเธฒเธขเธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง', - 'trading-assistant.messages.deleteFailed': 'เธฅเธšเธ™เน‚เธขเธšเธฒเธขเธฅเน‰เธกเน€เธซเธฅเธง', - 'trading-assistant.messages.startSuccess': 'เธเธฅเธขเธธเธ—เธ˜เนŒเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เน„เธ”เน‰เธชเธณเน€เธฃเน‡เธˆ', - 'trading-assistant.messages.startFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน€เธฃเธดเนˆเธกเธ™เน‚เธขเธšเธฒเธขเน„เธ”เน‰', - 'trading-assistant.messages.stopSuccess': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธซเธขเธธเธ”เธชเธณเน€เธฃเน‡เธˆ', - 'trading-assistant.messages.stopFailed': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธซเธขเธธเธ”เธฅเน‰เธกเน€เธซเธฅเธง', - 'trading-assistant.messages.loadFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเธฃเธฒเธขเธเธฒเธฃเธ™เน‚เธขเธšเธฒเธข', - 'trading-assistant.messages.runningWarning': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธณเธฅเธฑเธ‡เธ—เธณเธ‡เธฒเธ™เธญเธขเธนเนˆ เน‚เธ›เธฃเธ”เธซเธขเธธเธ”เธเธฅเธขเธธเธ—เธ˜เนŒเธเนˆเธญเธ™เธ—เธตเนˆเธˆเธฐเนเธเน‰เน„เธ‚', - 'trading-assistant.messages.deleteConfirmWithName': 'เธ„เธธเธ“เนเธ™เนˆเนƒเธˆเธซเธฃเธทเธญเน„เธกเนˆเธงเนˆเธฒเธ•เน‰เธญเธ‡เธเธฒเธฃเธฅเธšเธ™เน‚เธขเธšเธฒเธข "{name}" เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ™เธตเน‰เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธขเน‰เธญเธ™เธเธฅเธฑเธšเน„เธ”เน‰', - 'trading-assistant.messages.deleteConfirm': 'เธ„เธธเธ“เนเธ™เนˆเนƒเธˆเธซเธฃเธทเธญเน„เธกเนˆเธงเนˆเธฒเธ•เน‰เธญเธ‡เธเธฒเธฃเธฅเธšเธ™เน‚เธขเธšเธฒเธขเธ™เธตเน‰เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ™เธตเน‰เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธขเน‰เธญเธ™เธเธฅเธฑเธšเน„เธ”เน‰', - 'trading-assistant.messages.loadTradesFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเธšเธฑเธ™เธ—เธถเธเธ˜เธธเธฃเธเธฃเธฃเธกเน„เธ”เน‰', - 'trading-assistant.messages.loadPositionsFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเธšเธฑเธ™เธ—เธถเธเธ•เธณเนเธซเธ™เนˆเธ‡เน„เธ”เน‰', - 'trading-assistant.messages.loadEquityFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเน€เธชเน‰เธ™เน‚เธ„เน‰เธ‡เธชเนˆเธงเธ™เธ‚เธญเธ‡เธœเธนเน‰เธ–เธทเธญเธซเธธเน‰เธ™เน„เธ”เน‰', - 'trading-assistant.messages.loadIndicatorsFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน‚เธซเธฅเธ”เธฃเธฒเธขเธเธฒเธฃเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰ เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'trading-assistant.messages.spotLimitations': 'เธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเนเธšเธšเธชเธ›เธญเธ•เน„เธ”เน‰เธฃเธฑเธšเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเน‚เธ”เธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธดเน€เธ›เน‡เธ™เธฃเธฐเธขเธฐเธขเธฒเธงเน€เธ—เนˆเธฒเธ™เธฑเน‰เธ™ เน€เธฅเน€เธงเธญเน€เธฃเธˆ 1 เน€เธ—เนˆเธฒ', - 'trading-assistant.messages.autoFillApiConfig': 'เธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒ API เนƒเธ™เธญเธ”เธตเธ•เธ‚เธญเธ‡เธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™เน„เธ”เน‰เธฃเธฑเธšเธเธฒเธฃเน€เธ•เธดเธกเธ‚เน‰เธญเธกเธนเธฅเน‚เธ”เธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด', - 'trading-assistant.placeholders.selectIndicator': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'trading-assistant.placeholders.selectExchange': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'trading-assistant.placeholders.inputApiKey': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ„เธตเธขเนŒ API', - 'trading-assistant.placeholders.inputSecretKey': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธฅเธฑเธš', - 'trading-assistant.placeholders.inputPassphrase': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'trading-assistant.placeholders.inputStrategyName': 'เน‚เธ›เธฃเธ”เธ›เน‰เธญเธ™เธŠเธทเนˆเธญเธ™เน‚เธขเธšเธฒเธข', - 'trading-assistant.placeholders.selectSymbol': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.placeholders.selectTimeframe': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธŠเนˆเธงเธ‡เน€เธงเธฅเธฒ', - 'trading-assistant.placeholders.selectKlinePeriod': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธŠเนˆเธงเธ‡เน€เธงเธฅเธฒ K-Line', - 'trading-assistant.placeholders.inputAiFilterPrompt': 'เธเธฃเธธเธ“เธฒเนƒเธชเนˆเธ‚เน‰เธญเธ„เธงเธฒเธกเนเธˆเน‰เธ‡เนเธšเธšเธเธณเธซเธ™เธ”เน€เธญเธ‡ (เน„เธกเนˆเธšเธฑเธ‡เธ„เธฑเธš)', - 'trading-assistant.validation.indicatorRequired': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'trading-assistant.validation.exchangeRequired': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'trading-assistant.validation.apiKeyRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ„เธตเธขเนŒ API', - 'trading-assistant.validation.secretKeyRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธฅเธฑเธš', - 'trading-assistant.validation.passphraseRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'trading-assistant.validation.exchangeConfigIncomplete': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™เนƒเธซเน‰เธ„เธฃเธšเธ–เน‰เธงเธ™', - 'trading-assistant.validation.testConnectionRequired': 'เธเธฃเธธเธ“เธฒเธ„เธฅเธดเธเธ›เธธเนˆเธก "เธ—เธ”เธชเธญเธšเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญ" เนเธฅเธฐเธ•เธฃเธงเธˆเธชเธญเธšเนƒเธซเน‰เนเธ™เนˆเนƒเธˆเธงเนˆเธฒเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธชเธณเน€เธฃเน‡เธˆ', - 'trading-assistant.validation.testConnectionFailed': 'เธเธฒเธฃเธ—เธ”เธชเธญเธšเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธฅเน‰เธกเน€เธซเธฅเธง เธเธฃเธธเธ“เธฒเธ•เธฃเธงเธˆเธชเธญเธšเธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒเนเธฅเธฐเธ—เธ”เธชเธญเธšเธญเธตเธเธ„เธฃเธฑเน‰เธ‡', - 'trading-assistant.validation.strategyNameRequired': 'เน‚เธ›เธฃเธ”เธ›เน‰เธญเธ™เธŠเธทเนˆเธญเธ™เน‚เธขเธšเธฒเธข', - 'trading-assistant.validation.symbolRequired': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.validation.initialCapitalRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธฅเธ‡เธ—เธธเธ™', - 'trading-assistant.validation.leverageRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เน€เธฅเน€เธงเธญเน€เธฃเธˆ', - 'trading-assistant.table.time': 'เน€เธงเธฅเธฒ', - 'trading-assistant.table.type': 'เธžเธดเธกเธžเนŒ', - 'trading-assistant.table.price': 'เธฃเธฒเธ„เธฒ', - 'trading-assistant.table.amount': 'เธ›เธฃเธดเธกเธฒเธ“', - 'trading-assistant.table.value': 'เธˆเธณเธ™เธงเธ™', - 'trading-assistant.table.commission': 'เธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃ', - 'trading-assistant.table.symbol': 'เธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.table.side': 'เธ—เธดเธจเธ—เธฒเธ‡', - 'trading-assistant.table.size': 'เธ›เธฃเธดเธกเธฒเธ“เธ•เธณเนเธซเธ™เนˆเธ‡', - 'trading-assistant.table.entryPrice': 'เธฃเธฒเธ„เธฒเน€เธ›เธดเธ”', - 'trading-assistant.table.currentPrice': 'เธฃเธฒเธ„เธฒเธ›เธฑเธˆเธˆเธธเธšเธฑเธ™', - 'trading-assistant.table.unrealizedPnl': 'เธเธณเน„เธฃเธซเธฃเธทเธญเธ‚เธฒเธ”เธ—เธธเธ™เธ—เธตเนˆเธขเธฑเธ‡เน„เธกเนˆเน€เธเธดเธ”เธ‚เธถเน‰เธ™เธˆเธฃเธดเธ‡', - 'trading-assistant.table.pnlPercent': 'เธญเธฑเธ•เธฃเธฒเธชเนˆเธงเธ™เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™', - 'trading-assistant.table.buy': 'เธ‹เธทเน‰เธญ', - 'trading-assistant.table.sell': 'เธ‚เธฒเธข', - 'trading-assistant.table.long': 'เธขเธฒเธงเน„เธ›', - 'trading-assistant.table.short': 'เธชเธฑเน‰เธ™', - 'trading-assistant.table.noPositions': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ•เธณเนเธซเธ™เนˆเธ‡', - 'trading-assistant.detail.title': 'เธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'trading-assistant.detail.strategyName': 'เธŠเธทเนˆเธญเธเธฃเธกเธ˜เธฃเธฃเธกเนŒ', - 'trading-assistant.detail.strategyType': 'เธ›เธฃเธฐเน€เธ เธ—เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'trading-assistant.detail.status': 'เธชเธ–เธฒเธ™เธฐ', - 'trading-assistant.detail.tradingMode': 'เธฃเธนเธ›เนเธšเธšเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.detail.exchange': 'เนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'trading-assistant.detail.initialCapital': 'เธ—เธธเธ™เน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'trading-assistant.detail.totalInvestment': 'เธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธฅเธ‡เธ—เธธเธ™เธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'trading-assistant.detail.currentEquity': 'เธกเธนเธฅเธ„เนˆเธฒเธชเธธเธ—เธ˜เธดเนƒเธ™เธ›เธฑเธˆเธˆเธธเธšเธฑเธ™', - 'trading-assistant.detail.totalPnl': 'เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™เธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'trading-assistant.detail.indicatorName': 'เธŠเธทเนˆเธญเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰', - 'trading-assistant.detail.maxLeverage': 'เน€เธฅเน€เธงเธญเน€เธฃเธˆเธชเธนเธ‡เธชเธธเธ”', - 'trading-assistant.detail.decideInterval': 'เธŠเนˆเธงเธ‡เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆ', - 'trading-assistant.detail.symbols': 'เธงเธฑเธ•เธ–เธธเธ˜เธธเธฃเธเธฃเธฃเธก', - 'trading-assistant.detail.createdAt': 'เน€เธงเธฅเธฒเธชเธฃเน‰เธฒเธ‡', - 'trading-assistant.detail.updatedAt': 'เน€เธงเธฅเธฒเธญเธฑเธ›เน€เธ”เธ•', - 'trading-assistant.detail.llmConfig': 'เธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒเน‚เธกเน€เธ”เธฅ AI', - 'trading-assistant.detail.exchangeConfig': 'เธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'trading-assistant.detail.provider': 'เธœเธนเน‰เนƒเธซเน‰เธšเธฃเธดเธเธฒเธฃ', - 'trading-assistant.detail.modelId': 'เธฃเธซเธฑเธชเธฃเธธเนˆเธ™', - 'trading-assistant.detail.close': 'เธ›เธดเธ”', - 'trading-assistant.detail.loadFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธ™เน‚เธขเธšเธฒเธขเน„เธ”เน‰', - 'trading-assistant.equity.noData': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ‚เน‰เธญเธกเธนเธฅเธกเธนเธฅเธ„เนˆเธฒเธชเธธเธ—เธ˜เธด', - 'trading-assistant.equity.equity': 'เธกเธนเธฅเธ„เนˆเธฒเธชเธธเธ—เธ˜เธด', - 'trading-assistant.exchange.tradingMode': 'เธฃเธนเธ›เนเธšเธšเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'trading-assistant.exchange.virtual': 'เธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธˆเธณเธฅเธญเธ‡', - 'trading-assistant.exchange.live': 'เธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธกเธˆเธฃเธดเธ‡', - 'trading-assistant.exchange.selectExchange': 'เน€เธฅเธทเธญเธเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'trading-assistant.exchange.walletAddress': 'เธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™', - 'trading-assistant.exchange.walletAddressPlaceholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ—เธตเนˆเธญเธขเธนเนˆเธเธฃเธฐเน€เธ›เน‹เธฒเน€เธ‡เธดเธ™เธ‚เธญเธ‡เธ„เธธเธ“ (เน€เธฃเธดเนˆเธกเธ•เน‰เธ™เธ”เน‰เธงเธข 0x)', - 'trading-assistant.exchange.privateKey': 'เธฃเธซเธฑเธชเธชเนˆเธงเธ™เธ•เธฑเธง', - 'trading-assistant.exchange.privateKeyPlaceholder': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธชเนˆเธงเธ™เธ•เธฑเธง (64 เธ•เธฑเธงเธญเธฑเธเธฉเธฃ)', - 'trading-assistant.exchange.testConnection': 'เธ—เธ”เธชเธญเธšเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญ', - 'trading-assistant.exchange.connectionSuccess': 'เธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธชเธณเน€เธฃเน‡เธˆ', - 'trading-assistant.exchange.connectionFailed': 'เธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธฅเน‰เธกเน€เธซเธฅเธง', - 'trading-assistant.exchange.testFailed': 'เธเธฒเธฃเธ—เธ”เธชเธญเธšเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธฅเน‰เธกเน€เธซเธฅเธง', - 'trading-assistant.exchange.fillComplete': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเธเธณเธซเธ™เธ”เธ„เนˆเธฒเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™เนƒเธซเน‰เธ„เธฃเธšเธ–เน‰เธงเธ™', - 'trading-assistant.strategyTypeOptions.ai': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธ—เธตเนˆเธ‚เธฑเธšเน€เธ„เธฅเธทเนˆเธญเธ™เธ”เน‰เธงเธข AI', - 'trading-assistant.strategyTypeOptions.indicator': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธ•เธฑเธงเธšเนˆเธ‡เธŠเธตเน‰เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'เธŸเธฑเธ‡เธเนŒเธŠเธฑเธ™เธเธฅเธขเธธเธ—เธ˜เนŒเธ—เธตเนˆเธ‚เธฑเธšเน€เธ„เธฅเธทเนˆเธญเธ™เธ”เน‰เธงเธข AI เธญเธขเธนเนˆเธฃเธฐเธซเธงเนˆเธฒเธ‡เธเธฒเธฃเธžเธฑเธ’เธ™เธฒ เธ”เธฑเธ‡เธ™เธฑเน‰เธ™เน‚เธ›เธฃเธ”เธ„เธญเธขเธ•เธดเธ”เธ•เธฒเธก', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'เธ„เธธเธ“เธชเธกเธšเธฑเธ•เธดเธเธฅเธขเธธเธ—เธ˜เนŒเธ—เธตเนˆเธ‚เธฑเธšเน€เธ„เธฅเธทเนˆเธญเธ™เธ”เน‰เธงเธข AI เธเธณเธฅเธฑเธ‡เธญเธขเธนเนˆเนƒเธ™เธเธฒเธฃเธžเธฑเธ’เธ™เธฒ', - 'trading-assistant.indicatorType.trend': 'เนเธ™เธงเน‚เธ™เน‰เธก', - 'trading-assistant.indicatorType.momentum': 'เน‚เธกเน€เธกเธ™เธ•เธฑเธก', - 'trading-assistant.indicatorType.volatility': 'เธ„เธงเธฒเธกเธœเธฑเธ™เธœเธงเธ™', - 'trading-assistant.indicatorType.volume': 'เธ›เธฃเธดเธกเธฒเธ“', - 'trading-assistant.indicatorType.custom': 'เธ›เธฃเธฑเธšเนเธ•เนˆเธ‡', - 'trading-assistant.exchangeNames': { - 'okx': 'เน‚เธญเน€เธ„เน€เธญเน‡เธเธ‹เนŒ', - 'binance': 'เน„เธšเนเธ™เธ™เธ‹เนŒ', - 'hyperliquid': 'เน„เธฎเน€เธ›เธญเธฃเนŒเธฅเธดเธ„เธงเธดเธ”', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'เธ„เธญเธขเธ™เนŒเน€เธšเธช', - 'gate': 'Gate.io', - 'mexc': 'เน€เธกเน‡เธเธ‹เธดเน‚เธ', - 'kraken': 'เธ„เธฃเธฒเน€เธ„เธ™', - 'bitfinex': 'Bitfinex', - 'bybit': 'เธšเธฒเธขเธšเธดเธ•', - 'kucoin': 'เธ„เธนเธ„เธญเธขเธ™เนŒ', - 'huobi': 'เธซเธฑเนˆเธงเธ›เธตเน‰', - 'bitget': 'เธšเธดเธ—เน€เธเน‡เธ•', - 'bitmex': 'BitMEX', - 'deribit': 'เธญเธ™เธธเธกเธฒเธ™', - 'phemex': 'เธŸเธตเน€เธกเน‡เธเธ‹เนŒ', - 'bitmart': 'เธšเธดเธ•เธกเธฒเธฃเนŒเธ—', - 'bitstamp': 'เธšเธดเธ•เธชเนเธ•เธกเธ›เนŒ', - 'bittrex': 'เธšเธดเธ—เน€เธ—เธฃเน‡เธเธ‹เนŒ', - 'poloniex': 'เน‚เธ›เน‚เธฅเธ™เธตเธเธ‹เนŒ', - 'gemini': 'เธฃเธฒเธจเธตเน€เธกเธ–เธธเธ™', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'เธšเธดเธ•เธŸเธฅเธฒเธขเน€เธญเธญเธฃเนŒ', - 'upbit': 'เธญเธฑเธžเธšเธดเธ•', - 'bithumb': 'เธšเธดเธ˜เธฑเธกเธšเนŒ', - 'coinone': 'เน‚เธ„เน‚เธ™เน€เธ™เนˆ', - 'zb': 'เธ‹เธตเธšเธต', - 'lbank': 'เนเธญเธฅเนเธšเธ‡เธ„เนŒ', - 'bibox': 'เน„เธšเธšเน‡เธญเธเธ‹เนŒ', - 'bigone': 'เธšเธดเนŠเธเธงเธฑเธ™', - 'bitrue': 'เธšเธดเธ•เธ—เธฃเธน', - 'coinex': 'เธ„เธญเธขเธ™เนŒเน€เธญเน‡เธเธ‹เนŒ', - 'digifinex': 'DigiFinex', - 'ftx': 'เน€เธญเธŸเธ—เธตเน€เธญเน‡เธเธ‹เนŒ', - 'ftxus': 'FTX เธชเธซเธฃเธฑเธเธญเน€เธกเธฃเธดเธเธฒ', - 'binanceus': 'Binance เธชเธซเธฃเธฑเธเธญเน€เธกเธฃเธดเธเธฒ', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDโ“ˆ-M', - 'deepcoin': 'เธ”เธตเธžเธ„เธญเธขเธ™เนŒ' - }, - 'ai-trading-assistant.title': 'เธœเธนเน‰เธŠเนˆเธงเธขเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข AI', - 'ai-trading-assistant.strategyList': 'เธฃเธฒเธขเธเธฒเธฃเธเธฅเธขเธธเธ—เธ˜เนŒ', - 'ai-trading-assistant.createStrategy': 'เธชเธฃเน‰เธฒเธ‡เธ™เน‚เธขเธšเธฒเธข', - 'ai-trading-assistant.noStrategy': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธเธฅเธขเธธเธ—เธ˜เนŒ', - 'ai-trading-assistant.selectStrategy': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธเธฅเธขเธธเธ—เธ˜เนŒเธˆเธฒเธเธ”เน‰เธฒเธ™เธ‹เน‰เธฒเธขเน€เธžเธทเนˆเธญเธ”เธนเธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”', - 'ai-trading-assistant.startStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเน€เธ›เธดเธ”เธ•เธฑเธง', - 'ai-trading-assistant.stopStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเธซเธขเธธเธ”', - 'ai-trading-assistant.editStrategy': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธ”เน‰เธฒเธ™เธšเธฃเธฃเธ“เธฒเธ˜เธดเธเธฒเธฃ', - 'ai-trading-assistant.deleteStrategy': 'เธฅเธšเธ™เน‚เธขเธšเธฒเธข', - 'ai-trading-assistant.status.running': 'เธงเธดเนˆเธ‡', - 'ai-trading-assistant.status.stopped': 'เธซเธขเธธเธ”เนเธฅเน‰เธง', - 'ai-trading-assistant.status.error': 'เธ„เธงเธฒเธกเธœเธดเธ”เธžเธฅเธฒเธ”', - 'ai-trading-assistant.tabs.tradingRecords': 'เธ›เธฃเธฐเธงเธฑเธ•เธดเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธก', - 'ai-trading-assistant.tabs.positions': 'เธšเธฑเธ™เธ—เธถเธเธ•เธณเนเธซเธ™เนˆเธ‡', - 'ai-trading-assistant.tabs.aiDecisions': 'เธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธ‚เธญเธ‡ AI', - 'ai-trading-assistant.tabs.equityCurve': 'เน€เธชเน‰เธ™เธชเนˆเธงเธ™เธ‚เธญเธ‡เธœเธนเน‰เธ–เธทเธญเธซเธธเน‰เธ™', - 'ai-trading-assistant.form.createTitle': 'เธชเธฃเน‰เธฒเธ‡เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธ”เน‰เธงเธข AI', - 'ai-trading-assistant.form.editTitle': 'เนเธเน‰เน„เธ‚เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข AI', - 'ai-trading-assistant.form.strategyName': 'เธŠเธทเนˆเธญเธเธฃเธกเธ˜เธฃเธฃเธกเนŒ', - 'ai-trading-assistant.form.modelId': 'เน‚เธกเน€เธ”เธฅเน€เธญเน„เธญ', - 'ai-trading-assistant.form.modelIdHint': 'เนƒเธŠเน‰เธšเธฃเธดเธเธฒเธฃเธฃเธฐเธšเธš OpenRouter เน‚เธ”เธขเน„เธกเนˆเธ•เน‰เธญเธ‡เธเธณเธซเธ™เธ”เธ„เนˆเธฒ API Key', - 'ai-trading-assistant.form.decideInterval': 'เธŠเนˆเธงเธ‡เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆ', - 'ai-trading-assistant.form.decideInterval5m': '5 เธ™เธฒเธ—เธต', - 'ai-trading-assistant.form.decideInterval10m': '10 เธ™เธฒเธ—เธต', - 'ai-trading-assistant.form.decideInterval30m': '30 เธ™เธฒเธ—เธต', - 'ai-trading-assistant.form.decideInterval1h': '1 เธŠเธฑเนˆเธงเน‚เธกเธ‡', - 'ai-trading-assistant.form.decideInterval4h': '4 เธŠเธฑเนˆเธงเน‚เธกเธ‡', - 'ai-trading-assistant.form.decideInterval1d': '1 เธงเธฑเธ™', - 'ai-trading-assistant.form.decideInterval1w': '1 เธชเธฑเธ›เธ”เธฒเธซเนŒ', - 'ai-trading-assistant.form.decideIntervalHint': 'เธŠเนˆเธงเธ‡เน€เธงเธฅเธฒเธ—เธตเนˆ AI เนƒเธ™เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆ', - 'ai-trading-assistant.form.runPeriod': 'เธงเธดเนˆเธ‡เธฃเธญเธš', - 'ai-trading-assistant.form.runPeriodHint': 'เน€เธงเธฅเธฒเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เนเธฅเธฐเน€เธงเธฅเธฒเธชเธดเน‰เธ™เธชเธธเธ”เธ‚เธญเธ‡เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'ai-trading-assistant.form.startDate': 'เธงเธฑเธ™เธ—เธตเนˆเน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'ai-trading-assistant.form.endDate': 'เธงเธฑเธ™เธ—เธตเนˆเธชเธดเน‰เธ™เธชเธธเธ”', - 'ai-trading-assistant.form.qdtCostTitle': 'เธ„เธณเนเธ™เธฐเธ™เธณเธเธฒเธฃเธซเธฑเธเน€เธ‡เธดเธ™เธ‚เธญเธ‡ QDT', - 'ai-trading-assistant.form.qdtCostHint': 'เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธ‚เธญเธ‡ AI เนเธ•เนˆเธฅเธฐเธ„เธฃเธฑเน‰เธ‡เธˆเธฐเธ–เธนเธเธซเธฑเธเธญเธญเธ {cost} QDT เน‚เธ›เธฃเธ”เธ•เธฃเธงเธˆเธชเธญเธšเนƒเธซเน‰เนเธ™เนˆเนƒเธˆเธงเนˆเธฒเธšเธฑเธเธŠเธตเธ‚เธญเธ‡เธ„เธธเธ“เธกเธตเธขเธญเธ”เธ„เธ‡เน€เธซเธฅเธทเธญ QDT เน€เธžเธตเธขเธ‡เธžเธญ เนƒเธ™เธฃเธฐเธซเธงเนˆเธฒเธ‡เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ•เธฒเธกเธเธฅเธขเธธเธ—เธ˜เนŒเธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธˆเธฐเธ–เธนเธเธซเธฑเธเนเธšเธšเน€เธฃเธตเธขเธฅเน„เธ—เธกเนŒเธชเธณเธซเธฃเธฑเธšเธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเนเธ•เนˆเธฅเธฐเธ„เธฃเธฑเน‰เธ‡', - 'ai-trading-assistant.form.apiKey': 'เธ„เธตเธขเนŒ API', - 'ai-trading-assistant.form.exchange': 'เน€เธฅเธทเธญเธเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'ai-trading-assistant.form.secretKey': 'เธฃเธซเธฑเธชเธฅเธฑเธš', - 'ai-trading-assistant.form.passphrase': 'เธ‚เน‰เธญเธ„เธงเธฒเธกเธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'ai-trading-assistant.form.testConnection': 'เธ—เธ”เธชเธญเธšเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญ', - 'ai-trading-assistant.form.symbol': 'เธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'ai-trading-assistant.form.symbolHint': 'เน€เธฅเธทเธญเธเธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธ—เธตเนˆเธˆเธฐเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'ai-trading-assistant.form.initialCapital': 'เธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธ—เธตเนˆเธฅเธ‡เธ—เธธเธ™ (เธกเธฒเธฃเนŒเธˆเธดเน‰เธ™)', - 'ai-trading-assistant.form.leverage': 'เนƒเธŠเน‰เธ›เธฃเธฐเน‚เธขเธŠเธ™เนŒเธซเธฅเธฒเธขเธญเธขเนˆเธฒเธ‡', - 'ai-trading-assistant.form.timeframe': 'เธŠเนˆเธงเธ‡เน€เธงเธฅเธฒ', - 'ai-trading-assistant.form.timeframe1m': '1 เธ™เธฒเธ—เธต', - 'ai-trading-assistant.form.timeframe5m': '5 เธ™เธฒเธ—เธต', - 'ai-trading-assistant.form.timeframe15m': '15 เธ™เธฒเธ—เธต', - 'ai-trading-assistant.form.timeframe30m': '30 เธ™เธฒเธ—เธต', - 'ai-trading-assistant.form.timeframe1H': '1 เธŠเธฑเนˆเธงเน‚เธกเธ‡', - 'ai-trading-assistant.form.timeframe4H': '4 เธŠเธฑเนˆเธงเน‚เธกเธ‡', - 'ai-trading-assistant.form.timeframe1D': '1 เธงเธฑเธ™', - 'ai-trading-assistant.form.marketType': 'เธ›เธฃเธฐเน€เธ เธ—เธ•เธฅเธฒเธ”', - 'ai-trading-assistant.form.marketTypeFutures': 'เธชเธฑเธเธเธฒ', - 'ai-trading-assistant.form.marketTypeSpot': 'เธˆเธธเธ”เธชเธดเธ™เธ„เน‰เธฒ', - 'ai-trading-assistant.form.totalPnl': 'เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™เธ—เธฑเน‰เธ‡เธซเธกเธ”', - 'ai-trading-assistant.form.customPrompt': 'เธ„เธณเนเธˆเน‰เธ‡เธ—เธตเนˆเธเธณเธซเธ™เธ”เน€เธญเธ‡', - 'ai-trading-assistant.form.customPromptHint': 'เธ•เธฑเธงเน€เธฅเธทเธญเธเน€เธชเธฃเธดเธก เนƒเธŠเน‰เน€เธžเธทเนˆเธญเธ›เธฃเธฑเธšเนเธ•เนˆเธ‡เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข AI เนเธฅเธฐเธ•เธฃเธฃเธเธฐเนƒเธ™เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆ', - 'ai-trading-assistant.form.cancel': 'เธขเธเน€เธฅเธดเธ', - 'ai-trading-assistant.form.prev': 'เธ‚เธฑเน‰เธ™เธ•เธญเธ™เธเนˆเธญเธ™เธซเธ™เน‰เธฒ', - 'ai-trading-assistant.form.next': 'เธ‚เธฑเน‰เธ™เธ•เธญเธ™เธ•เนˆเธญเน„เธ›', - 'ai-trading-assistant.form.confirmCreate': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเธชเธฃเน‰เธฒเธ‡', - 'ai-trading-assistant.form.confirmEdit': 'เธขเธทเธ™เธขเธฑเธ™เธเธฒเธฃเน€เธ›เธฅเธตเนˆเธขเธ™เนเธ›เธฅเธ‡', - 'ai-trading-assistant.messages.createSuccess': 'เธชเธฃเน‰เธฒเธ‡เธเธฅเธขเธธเธ—เธ˜เนŒเธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง', - 'ai-trading-assistant.messages.createFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธชเธฃเน‰เธฒเธ‡เธ™เน‚เธขเธšเธฒเธขเน„เธ”เน‰', - 'ai-trading-assistant.messages.updateSuccess': 'เธญเธฑเธ›เน€เธ”เธ•เธ™เน‚เธขเธšเธฒเธขเธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง', - 'ai-trading-assistant.messages.updateFailed': 'เธญเธฑเธ›เน€เธ”เธ•เธ™เน‚เธขเธšเธฒเธขเน„เธกเนˆเธชเธณเน€เธฃเน‡เธˆ', - 'ai-trading-assistant.messages.deleteSuccess': 'เธฅเธšเธ™เน‚เธขเธšเธฒเธขเธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง', - 'ai-trading-assistant.messages.deleteFailed': 'เธฅเธšเธ™เน‚เธขเธšเธฒเธขเธฅเน‰เธกเน€เธซเธฅเธง', - 'ai-trading-assistant.messages.startSuccess': 'เธเธฅเธขเธธเธ—เธ˜เนŒเน€เธฃเธดเนˆเธกเธ•เน‰เธ™เน„เธ”เน‰เธชเธณเน€เธฃเน‡เธˆ', - 'ai-trading-assistant.messages.startFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เน€เธฃเธดเนˆเธกเธ™เน‚เธขเธšเธฒเธขเน„เธ”เน‰', - 'ai-trading-assistant.messages.stopSuccess': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธซเธขเธธเธ”เธชเธณเน€เธฃเน‡เธˆ', - 'ai-trading-assistant.messages.stopFailed': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธซเธขเธธเธ”เธฅเน‰เธกเน€เธซเธฅเธง', - 'ai-trading-assistant.messages.loadFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเธฃเธฒเธขเธเธฒเธฃเธ™เน‚เธขเธšเธฒเธข', - 'ai-trading-assistant.messages.loadDecisionsFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธฑเธšเธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธ‚เธญเธ‡ AI', - 'ai-trading-assistant.messages.deleteConfirm': 'เธ„เธธเธ“เนเธ™เนˆเนƒเธˆเธซเธฃเธทเธญเน„เธกเนˆเธงเนˆเธฒเธ•เน‰เธญเธ‡เธเธฒเธฃเธฅเธšเธ™เน‚เธขเธšเธฒเธขเธ™เธตเน‰เธเธฒเธฃเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ™เธตเน‰เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธขเน‰เธญเธ™เธเธฅเธฑเธšเน„เธ”เน‰', - 'ai-trading-assistant.placeholders.inputStrategyName': 'เน‚เธ›เธฃเธ”เธ›เน‰เธญเธ™เธŠเธทเนˆเธญเธ™เน‚เธขเธšเธฒเธข', - 'ai-trading-assistant.placeholders.selectModelId': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเน‚เธกเน€เธ”เธฅ AI', - 'ai-trading-assistant.placeholders.selectDecideInterval': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธŠเนˆเธงเธ‡เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆ', - 'ai-trading-assistant.placeholders.startTime': 'เน€เธงเธฅเธฒเน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'ai-trading-assistant.placeholders.endTime': 'เน€เธงเธฅเธฒเธชเธดเน‰เธ™เธชเธธเธ”', - 'ai-trading-assistant.placeholders.inputApiKey': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ„เธตเธขเนŒ API', - 'ai-trading-assistant.placeholders.selectExchange': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'ai-trading-assistant.placeholders.inputSecretKey': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธฅเธฑเธš', - 'ai-trading-assistant.placeholders.inputPassphrase': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธœเนˆเธฒเธ™', - 'ai-trading-assistant.placeholders.selectSymbol': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข เน€เธŠเนˆเธ™ BTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเธŠเนˆเธงเธ‡เน€เธงเธฅเธฒ', - 'ai-trading-assistant.placeholders.inputCustomPrompt': 'เน‚เธ›เธฃเธ”เธ›เน‰เธญเธ™เธ„เธณเนเธˆเน‰เธ‡เธ—เธตเนˆเธเธณเธซเธ™เธ”เน€เธญเธ‡ (เน„เธกเนˆเธšเธฑเธ‡เธ„เธฑเธš)', - 'ai-trading-assistant.validation.strategyNameRequired': 'เน‚เธ›เธฃเธ”เธ›เน‰เธญเธ™เธŠเธทเนˆเธญเธ™เน‚เธขเธšเธฒเธข', - 'ai-trading-assistant.validation.modelIdRequired': 'เน‚เธ›เธฃเธ”เน€เธฅเธทเธญเธเน‚เธกเน€เธ”เธฅ AI', - 'ai-trading-assistant.validation.runPeriodRequired': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธฃเธญเธšเธเธฒเธฃเธ—เธณเธ‡เธฒเธ™', - 'ai-trading-assistant.validation.apiKeyRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธ„เธตเธขเนŒ API', - 'ai-trading-assistant.validation.exchangeRequired': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™', - 'ai-trading-assistant.validation.secretKeyRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธฃเธซเธฑเธชเธฅเธฑเธš', - 'ai-trading-assistant.validation.symbolRequired': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'ai-trading-assistant.validation.initialCapitalRequired': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธˆเธณเธ™เธงเธ™เน€เธ‡เธดเธ™เธฅเธ‡เธ—เธธเธ™', - 'ai-trading-assistant.table.time': 'เน€เธงเธฅเธฒ', - 'ai-trading-assistant.table.type': 'เธžเธดเธกเธžเนŒ', - 'ai-trading-assistant.table.price': 'เธฃเธฒเธ„เธฒ', - 'ai-trading-assistant.table.amount': 'เธ›เธฃเธดเธกเธฒเธ“', - 'ai-trading-assistant.table.value': 'เธˆเธณเธ™เธงเธ™', - 'ai-trading-assistant.table.symbol': 'เธ„เธนเนˆเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธข', - 'ai-trading-assistant.table.side': 'เธ—เธดเธจเธ—เธฒเธ‡', - 'ai-trading-assistant.table.size': 'เธ›เธฃเธดเธกเธฒเธ“เธ•เธณเนเธซเธ™เนˆเธ‡', - 'ai-trading-assistant.table.entryPrice': 'เธฃเธฒเธ„เธฒเน€เธ›เธดเธ”', - 'ai-trading-assistant.table.currentPrice': 'เธฃเธฒเธ„เธฒเธ›เธฑเธˆเธˆเธธเธšเธฑเธ™', - 'ai-trading-assistant.table.unrealizedPnl': 'เธเธณเน„เธฃเธซเธฃเธทเธญเธ‚เธฒเธ”เธ—เธธเธ™เธ—เธตเนˆเธขเธฑเธ‡เน„เธกเนˆเน€เธเธดเธ”เธ‚เธถเน‰เธ™เธˆเธฃเธดเธ‡', - 'ai-trading-assistant.table.profit': 'เธเธณเน„เธฃเนเธฅเธฐเธ‚เธฒเธ”เธ—เธธเธ™', - 'ai-trading-assistant.table.openLong': 'เน€เธ›เธดเธ”เธขเธฒเธงเน†', - 'ai-trading-assistant.table.closeLong': 'เธ›เธดเธ™เธ•เธฑเธง', - 'ai-trading-assistant.table.openShort': 'เน€เธ›เธดเธ”เธชเธฑเน‰เธ™', - 'ai-trading-assistant.table.closeShort': 'เธงเนˆเธฒเธ‡เน€เธ›เธฅเนˆเธฒ', - 'ai-trading-assistant.table.addLong': 'เธเธฒเธ”เธญเธ•', - 'ai-trading-assistant.table.addShort': 'เน€เธžเธดเนˆเธกเธชเธฑเน‰เธ™', - 'ai-trading-assistant.table.closeShortProfit': 'เธ‚เธฒเธขเธ—เธณเธเธณเน„เธฃเธˆเธฒเธเธชเธ–เธฒเธ™เธฐเธ‚เธฒเธข', - 'ai-trading-assistant.table.closeShortStop': 'เธซเธขเธธเธ”เธเธฒเธฃเธชเธนเธเน€เธชเธตเธข', - 'ai-trading-assistant.table.closeLongProfit': 'เธซเธขเธธเธ”เธขเธฒเธงเนเธฅเธฐเธ—เธณเธเธณเน„เธฃ', - 'ai-trading-assistant.table.closeLongStop': 'เธซเธขเธธเธ”เธเธฒเธฃเธชเธนเธเน€เธชเธตเธข', - 'ai-trading-assistant.table.buy': 'เธ‹เธทเน‰เธญ', - 'ai-trading-assistant.table.sell': 'เธ‚เธฒเธข', - 'ai-trading-assistant.table.long': 'เธขเธฒเธงเน„เธ›', - 'ai-trading-assistant.table.short': 'เธชเธฑเน‰เธ™', - 'ai-trading-assistant.table.hold': 'เธ–เธทเธญ', - 'ai-trading-assistant.table.reasoning': 'เน€เธซเธ•เธธเธœเธฅเนƒเธ™เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ', - 'ai-trading-assistant.table.decisions': 'เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆ', - 'ai-trading-assistant.table.riskAssessment': 'เธเธฒเธฃเธ›เธฃเธฐเน€เธกเธดเธ™เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'ai-trading-assistant.table.confidence': 'เธ„เธงเธฒเธกเธกเธฑเนˆเธ™เนƒเธˆ', - 'ai-trading-assistant.table.totalRecords': 'เธฃเธงเธก {total} เธšเธฑเธ™เธ—เธถเธ', - 'ai-trading-assistant.table.noPositions': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ•เธณเนเธซเธ™เนˆเธ‡', - 'ai-trading-assistant.detail.title': 'เธฃเธฒเธขเธฅเธฐเน€เธญเธตเธขเธ”เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'ai-trading-assistant.equity.noData': 'เธขเธฑเธ‡เน„เธกเนˆเธกเธตเธ‚เน‰เธญเธกเธนเธฅเธกเธนเธฅเธ„เนˆเธฒเธชเธธเธ—เธ˜เธด', - 'ai-trading-assistant.equity.equity': 'เธกเธนเธฅเธ„เนˆเธฒเธชเธธเธ—เธ˜เธด', - 'ai-trading-assistant.exchange.testFailed': 'เธเธฒเธฃเธ—เธ”เธชเธญเธšเธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธฅเน‰เธกเน€เธซเธฅเธง', - 'ai-trading-assistant.exchange.connectionSuccess': 'เธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธชเธณเน€เธฃเน‡เธˆ', - 'ai-trading-assistant.exchange.connectionFailed': 'เธเธฒเธฃเน€เธŠเธทเนˆเธญเธกเธ•เนˆเธญเธฅเน‰เธกเน€เธซเธฅเธง', - 'ai-trading-assistant.form.advancedSettings': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธ‚เธฑเน‰เธ™เธชเธนเธ‡', - 'ai-trading-assistant.form.orderMode': 'เน‚เธซเธกเธ”เธเธฒเธฃเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญ', - 'ai-trading-assistant.form.orderModeMaker': 'เธœเธนเน‰เธชเธฃเน‰เธฒเธ‡', - 'ai-trading-assistant.form.orderModeTaker': 'เธฃเธฒเธ„เธฒเธ•เธฅเธฒเธ” (เน€เธ—เธ„เน€เธเธญเธฃเนŒ)', - 'ai-trading-assistant.form.orderModeHint': 'เน‚เธซเธกเธ”เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเนƒเธŠเน‰เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเนเธšเธšเธˆเธณเธเธฑเธ”เนเธฅเธฐเธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃเธ•เนˆเธณเธเธงเนˆเธฒ เน‚เธซเธกเธ”เธฃเธฒเธ„เธฒเธ•เธฅเธฒเธ”เธˆเธฐเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ—เธฑเธ™เธ—เธตเนเธฅเธฐเธ„เนˆเธฒเธ˜เธฃเธฃเธกเน€เธ™เธตเธขเธกเธเธฒเธฃเธˆเธฑเธ”เธเธฒเธฃเธˆเธฐเธชเธนเธ‡เธ‚เธถเน‰เธ™', - 'ai-trading-assistant.form.makerWaitSec': 'เน€เธงเธฅเธฒเธฃเธญเธชเธณเธซเธฃเธฑเธšเธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ (เธงเธดเธ™เธฒเธ—เธต)', - 'ai-trading-assistant.form.makerWaitSecHint': 'เน€เธงเธฅเธฒเธ—เธตเนˆเธ•เน‰เธญเธ‡เธฃเธญเธเธฒเธฃเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธกเธซเธฅเธฑเธ‡เธˆเธฒเธเธ—เธณเธเธฒเธฃเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญ เธขเธเน€เธฅเธดเธเนเธฅเธฐเธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เธซเธฅเธฑเธ‡เธˆเธฒเธเธซเธกเธ”เน€เธงเธฅเธฒ', - 'ai-trading-assistant.form.makerRetries': 'เธˆเธณเธ™เธงเธ™เธเธฒเธฃเธฅเธญเธ‡เนƒเธซเธกเนˆเธชเธณเธซเธฃเธฑเธšเธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'ai-trading-assistant.form.makerRetriesHint': 'เธˆเธณเธ™เธงเธ™เธ„เธฃเธฑเน‰เธ‡เธชเธนเธ‡เธชเธธเธ”เนƒเธ™เธเธฒเธฃเธฅเธญเธ‡เนƒเธซเธกเนˆเน€เธกเธทเนˆเธญเน„เธกเนˆเน„เธ”เน‰เธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃ', - 'ai-trading-assistant.form.fallbackToMarket': 'เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเธฅเน‰เธกเน€เธซเธฅเธงเนเธฅเธฐเธฃเธฒเธ„เธฒเธ•เธฅเธฒเธ”เธ–เธนเธเธฅเธ”เธฃเธฐเธ”เธฑเธšเธฅเธ‡', - 'ai-trading-assistant.form.fallbackToMarketHint': 'เน€เธกเธทเนˆเธญเธเธฒเธฃเน€เธ›เธดเธ”/เธ›เธดเธ”เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเธ—เธตเนˆเธฃเธญเธ”เธณเน€เธ™เธดเธ™เธเธฒเธฃเน„เธกเนˆเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ เธ„เธงเธฃเธ”เธฒเธงเธ™เนŒเน€เธเธฃเธ”เน€เธ›เน‡เธ™เธ„เธณเธชเธฑเนˆเธ‡เธ‹เธทเน‰เธญเนƒเธ™เธ•เธฅเธฒเธ”เน€เธžเธทเนˆเธญเนƒเธซเน‰เนเธ™เนˆเนƒเธˆเธงเนˆเธฒเธ˜เธธเธฃเธเธฃเธฃเธกเธˆเธฐเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒเธซเธฃเธทเธญเน„เธกเนˆ', - 'ai-trading-assistant.form.marginMode': 'เน‚เธซเธกเธ”เธฃเธฐเธขเธฐเธ‚เธญเธš', - 'ai-trading-assistant.form.marginModeCross': 'เน‚เธเธ”เธฑเธ‡เน€เธ•เน‡เธก', - 'ai-trading-assistant.form.marginModeIsolated': 'เธ•เธณเนเธซเธ™เนˆเธ‡เธ—เธตเนˆเน‚เธ”เธ”เน€เธ”เธตเนˆเธขเธง', - 'ai-analysis.title': 'เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธ„เธงเธญเธ™เธ•เธฑเธก', - 'ai-analysis.system.online': 'เธญเธญเธ™เน„เธฅเธ™เนŒ', - 'ai-analysis.system.agents': 'เธ•เธฑเธงเนเธ—เธ™', - 'ai-analysis.system.active': 'เธ„เธฅเนˆเธญเธ‡เนเธ„เธฅเนˆเธง', - 'ai-analysis.system.stage': 'เน€เธงเธ—เธต', - 'ai-analysis.panel.roster': 'เธฃเธฒเธขเธŠเธทเนˆเธญเธ•เธฑเธงเนเธ—เธ™', - 'ai-analysis.panel.thinking': 'เธเธณเธฅเธฑเธ‡เธ„เธดเธ”...', - 'ai-analysis.panel.done': 'เน€เธชเธฃเน‡เธˆ', - 'ai-analysis.panel.standby': 'เธชเนเธ•เธ™เธ”เนŒเธšเธฒเธข', - 'ai-analysis.input.title': 'เน€เธ„เธฃเธทเนˆเธญเธ‡เธกเธทเธญเธเธฒเธฃเธ‹เธทเน‰เธญเธ‚เธฒเธขเธ„เธงเธญเธ™เธ•เธฑเธก', - 'ai-analysis.input.placeholder': 'เน€เธฅเธทเธญเธเธชเธดเธ™เธ—เธฃเธฑเธžเธขเนŒเน€เธ›เน‰เธฒเธซเธกเธฒเธข (เน€เธŠเนˆเธ™ BTC/USDT)', - 'ai-analysis.input.watchlist': 'เธซเธธเน‰เธ™เธ—เธฒเธ‡เน€เธฅเธทเธญเธ', - 'ai-analysis.input.start': 'เน€เธฃเธดเนˆเธกเธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒ', - 'ai-analysis.input.recent': 'เธ‡เธฒเธ™เธฅเนˆเธฒเธชเธธเธ”:', - 'ai-analysis.vis.stage': 'เน€เธงเธ—เธต', - 'ai-analysis.vis.processing': 'เธเธณเธฅเธฑเธ‡เธ›เธฃเธฐเธกเธงเธฅเธœเธฅ', - 'ai-analysis.result.complete': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ', - 'ai-analysis.result.signal': 'เธชเธฑเธเธเธฒเธ“เธชเธธเธ”เธ—เน‰เธฒเธข', - 'ai-analysis.result.confidence': 'เธ„เธงเธฒเธกเธกเธฑเนˆเธ™เนƒเธˆ:', - 'ai-analysis.result.new': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเนƒเธซเธกเนˆ', - 'ai-analysis.result.full': 'เธ”เธนเธฃเธฒเธขเธ‡เธฒเธ™เธ‰เธšเธฑเธšเน€เธ•เน‡เธก', - 'ai-analysis.logs.title': 'เธšเธฑเธ™เธ—เธถเธเธ‚เธญเธ‡เธฃเธฐเธšเธš', - 'ai-analysis.modal.title': 'เธฃเธฒเธขเธ‡เธฒเธ™เธ—เธตเนˆเน€เธ›เน‡เธ™เธ„เธงเธฒเธกเธฅเธฑเธš', - 'ai-analysis.modal.fundamental': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธžเธทเน‰เธ™เธเธฒเธ™', - 'ai-analysis.modal.technical': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'ai-analysis.modal.sentiment': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธญเธฒเธฃเธกเธ“เนŒ', - 'ai-analysis.modal.risk': 'เธเธฒเธฃเธ›เธฃเธฐเน€เธกเธดเธ™เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'ai-analysis.stage.idle': 'เธชเนเธ•เธ™เธ”เนŒเธšเธฒเธข', - 'ai-analysis.stage.1': 'เธฃเธฐเธขเธฐเธ—เธตเนˆเธซเธ™เธถเนˆเธ‡: เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธซเธฅเธฒเธขเธกเธดเธ•เธด', - 'ai-analysis.stage.2': 'เธฃเธฐเธขเธฐเธ—เธตเนˆเธชเธญเธ‡: เธเธฒเธฃเธญเธ เธดเธ›เธฃเธฒเธขเธฃเธฐเธขเธฐเธขเธฒเธง-เธฃเธฐเธขเธฐเธชเธฑเน‰เธ™', - 'ai-analysis.stage.3': 'เธฃเธฐเธขเธฐเธ—เธตเนˆเธชเธฒเธก: เธเธฒเธฃเธงเธฒเธ‡เนเธœเธ™เน€เธŠเธดเธ‡เธเธฅเธขเธธเธ—เธ˜เนŒ', - 'ai-analysis.stage.4': 'เธ‚เธฑเน‰เธ™เธ•เธญเธ™เธ—เธตเนˆเธชเธตเนˆ: เธเธฒเธฃเธ—เธšเธ—เธงเธ™เธเธฒเธฃเธ„เธงเธšเธ„เธธเธกเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'ai-analysis.stage.complete': 'เน€เธชเธฃเน‡เธˆ', - 'ai-analysis.agent.investment_director': 'เธœเธนเน‰เธญเธณเธ™เธงเธขเธเธฒเธฃเธเนˆเธฒเธขเธเธฒเธฃเธฅเธ‡เธ—เธธเธ™', - 'ai-analysis.agent.role.investment_director': 'เธเธฒเธฃเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธตเนˆเธ„เธฃเธญเธšเธ„เธฅเธธเธกเนเธฅเธฐเธ‚เน‰เธญเธชเธฃเธธเธ›เธ‚เธฑเน‰เธ™เธชเธธเธ”เธ—เน‰เธฒเธข', - 'ai-analysis.agent.market': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ•เธฅเธฒเธ”', - 'ai-analysis.agent.role.market': 'เน€เธ—เธ„เน‚เธ™เน‚เธฅเธขเธตเนเธฅเธฐเธ‚เน‰เธญเธกเธนเธฅเธเธฒเธฃเธ•เธฅเธฒเธ”', - 'ai-analysis.agent.fundamental': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธžเธทเน‰เธ™เธเธฒเธ™', - 'ai-analysis.agent.role.fundamental': 'เธเธฒเธฃเน€เธ‡เธดเธ™เนเธฅเธฐเธเธฒเธฃเธ›เธฃเธฐเน€เธกเธดเธ™เธ„เนˆเธฒ', - 'ai-analysis.agent.technical': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'ai-analysis.agent.role.technical': 'เธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เนเธฅเธฐเนเธœเธ™เธ เธนเธกเธดเธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„', - 'ai-analysis.agent.news': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ‚เนˆเธฒเธง', - 'ai-analysis.agent.role.news': 'เธ•เธฑเธงเธเธฃเธญเธ‡เธ‚เนˆเธฒเธงเธ—เธฑเนˆเธงเน‚เธฅเธ', - 'ai-analysis.agent.sentiment': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ„เธงเธฒเธกเธฃเธนเน‰เธชเธถเธ', - 'ai-analysis.agent.role.sentiment': 'เธชเธฑเธ‡เธ„เธกเนเธฅเธฐเธญเธฒเธฃเธกเธ“เนŒ', - 'ai-analysis.agent.risk': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡', - 'ai-analysis.agent.role.risk': 'เธเธฒเธฃเธ•เธฃเธงเธˆเธชเธญเธšเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เน€เธšเธทเน‰เธญเธ‡เธ•เน‰เธ™', - 'ai-analysis.agent.bull': 'เธ™เธฑเธเธงเธดเธˆเธฑเธขเธฃเธฑเน‰เธ™', - 'ai-analysis.agent.role.bull': 'เธเธฒเธฃเธ‚เธธเธ”เธ•เธฑเธงเน€เธฃเนˆเธ‡เธ›เธเธดเธเธดเธฃเธดเธขเธฒเธเธฒเธฃเน€เธ•เธดเธšเน‚เธ•', - 'ai-analysis.agent.bear': 'เธ™เธฑเธเธงเธดเธˆเธฑเธขเธ‚เธฒเธฅเธ‡', - 'ai-analysis.agent.role.bear': 'เธเธฒเธฃเธ‚เธธเธ”เธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡เนเธฅเธฐเธ‚เน‰เธญเธšเธเธžเธฃเนˆเธญเธ‡', - 'ai-analysis.agent.manager': 'เธœเธนเน‰เธˆเธฑเธ”เธเธฒเธฃเธเนˆเธฒเธขเธงเธดเธˆเธฑเธข', - 'ai-analysis.agent.role.manager': 'เธœเธนเน‰เธ”เธนเนเธฅเธเธฒเธฃเธญเธ เธดเธ›เธฃเธฒเธข', - 'ai-analysis.agent.trader': 'เธžเนˆเธญเธ„เน‰เธฒ', - 'ai-analysis.agent.role.trader': 'เธ™เธฑเธเธขเธธเธ—เธ˜เธจเธฒเธชเธ•เธฃเนŒเธšเธฃเธดเธซเธฒเธฃ', - 'ai-analysis.agent.risky': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธเธดเธˆเธเธฃเธฃเธก', - 'ai-analysis.agent.role.risky': 'เธเธฅเธขเธธเธ—เธ˜เนŒเน€เธŠเธดเธ‡เธฃเธธเธ', - 'ai-analysis.agent.neutral': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ„เธงเธฒเธกเธชเธกเธ”เธธเธฅ', - 'ai-analysis.agent.role.neutral': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธเธฒเธฃเธชเธฃเน‰เธฒเธ‡เธชเธกเธ”เธธเธฅ', - 'ai-analysis.agent.safe': 'เธ™เธฑเธเธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธญเธ™เธธเธฃเธฑเธเธฉเนŒเธ™เธดเธขเธก', - 'ai-analysis.agent.role.safe': 'เธเธฅเธขเธธเธ—เธ˜เนŒเธญเธ™เธธเธฃเธฑเธเธฉเนŒเธ™เธดเธขเธก', - 'ai-analysis.agent.cro': 'เธœเธนเน‰เธˆเธฑเธ”เธเธฒเธฃเธเนˆเธฒเธขเธ„เธงเธšเธ„เธธเธกเธ„เธงเธฒเธกเน€เธชเธตเนˆเธขเธ‡ (CRO)', - 'ai-analysis.agent.role.cro': 'เธญเธณเธ™เธฒเธˆเนƒเธ™เธเธฒเธฃเธ•เธฑเธ”เธชเธดเธ™เนƒเธˆเธ‚เธฑเน‰เธ™เธชเธธเธ”เธ—เน‰เธฒเธข', - 'ai-analysis.script.market': 'เธเธณเธฅเธฑเธ‡เธ”เธถเธ‡เธ‚เน‰เธญเธกเธนเธฅ OHLCV เธˆเธฒเธเธเธฒเธฃเนเธฅเธเน€เธ›เธฅเธตเนˆเธขเธ™เธซเธฅเธฑเธ...', - 'ai-analysis.script.fundamental': 'เธเธณเธฅเธฑเธ‡เธ”เธถเธ‡เธฃเธฒเธขเธ‡เธฒเธ™เธ—เธฒเธ‡เธเธฒเธฃเน€เธ‡เธดเธ™เธฃเธฒเธขเน„เธ•เธฃเธกเธฒเธช...', - 'ai-analysis.script.technical': 'เธเธณเธฅเธฑเธ‡เธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเธ•เธฑเธงเธŠเธตเน‰เธงเธฑเธ”เธ—เธฒเธ‡เน€เธ—เธ„เธ™เธดเธ„เนเธฅเธฐเธฃเธนเธ›เนเธšเธšเธเธฃเธฒเธŸ...', - 'ai-analysis.script.news': 'เธเธณเธฅเธฑเธ‡เธชเนเธเธ™เธ‚เนˆเธฒเธงเธเธฒเธฃเน€เธ‡เธดเธ™เธ—เธฑเนˆเธงเน‚เธฅเธ...', - 'ai-analysis.script.sentiment': 'เธงเธดเน€เธ„เธฃเธฒเธฐเธซเนŒเน€เธ—เธฃเธ™เธ”เนŒเน‚เธ‹เน€เธŠเธตเธขเธฅเธกเธตเน€เธ”เธตเธข...', - 'ai-analysis.script.risk': 'เธเธณเธฅเธฑเธ‡เธ„เธณเธ™เธงเธ“เธ„เธงเธฒเธกเธœเธฑเธ™เธœเธงเธ™เนƒเธ™เธญเธ”เธตเธ•...', - 'invite.inviteLink': 'เธฅเธดเธ‡เธ„เนŒเธ„เธณเน€เธŠเธดเธ', - 'invite.copy': 'เธ„เธฑเธ”เธฅเธญเธเธฅเธดเธ‡เธเนŒ', - 'invite.copySuccess': 'เธ„เธฑเธ”เธฅเธญเธเธชเธณเน€เธฃเน‡เธˆ!', - 'invite.copyFailed': 'เธเธฒเธฃเธ„เธฑเธ”เธฅเธญเธเธฅเน‰เธกเน€เธซเธฅเธง เน‚เธ›เธฃเธ”เธ„เธฑเธ”เธฅเธญเธเธ”เน‰เธงเธขเธ•เธ™เน€เธญเธ‡', - 'invite.noInviteLink': 'เน„เธกเนˆเน„เธ”เน‰เธชเธฃเน‰เธฒเธ‡เธฅเธดเธ‡เธเนŒเธ„เธณเน€เธŠเธดเธ', - 'invite.totalInvites': 'เธ„เธณเน€เธŠเธดเธเธชเธฐเธชเธก', - 'invite.totalReward': 'เธฃเธฒเธ‡เธงเธฑเธฅเธชเธฐเธชเธก', - 'invite.rules': 'เธเธŽเธเธฒเธฃเน€เธŠเธดเธเธŠเธงเธ™', - 'invite.rule1': 'เธ—เธธเธเธ„เธฃเธฑเน‰เธ‡เธ—เธตเนˆเธ„เธธเธ“เน€เธŠเธดเธเน€เธžเธทเนˆเธญเธ™เธกเธฒเธฅเธ‡เธ—เธฐเน€เธšเธตเธขเธ™เธชเธณเน€เธฃเน‡เธˆ เธ„เธธเธ“เธˆเธฐเน„เธ”เน‰เธฃเธฑเธšเธฃเธฒเธ‡เธงเธฑเธฅ', - 'invite.rule2': 'เธซเธฒเธเน€เธžเธทเนˆเธญเธ™เธ—เธตเนˆเน„เธ”เน‰เธฃเธฑเธšเน€เธŠเธดเธเธ—เธณเธ˜เธธเธฃเธเธฃเธฃเธกเธ„เธฃเธฑเน‰เธ‡เนเธฃเธเธชเธณเน€เธฃเน‡เธˆ เธ„เธธเธ“เธˆเธฐเน„เธ”เน‰เธฃเธฑเธšเธฃเธฒเธ‡เธงเธฑเธฅเน€เธžเธดเนˆเธกเน€เธ•เธดเธก', - 'invite.rule3': 'เธฃเธฒเธ‡เธงเธฑเธฅเธ„เธณเน€เธŠเธดเธเธˆเธฐเธ–เธนเธเธชเนˆเธ‡เน„เธ›เธขเธฑเธ‡เธšเธฑเธเธŠเธตเธ‚เธญเธ‡เธ„เธธเธ“เน‚เธ”เธขเธ•เธฃเธ‡', - 'invite.inviteList': 'เธฃเธฒเธขเธเธฒเธฃเน€เธŠเธดเธ', - 'invite.tasks': 'เธจเธนเธ™เธขเนŒเธ เธฒเธฃเธเธดเธˆ', - 'invite.inviteeName': 'เธœเธนเน‰เน„เธ”เน‰เธฃเธฑเธšเน€เธŠเธดเธ', - 'invite.inviteTime': 'เน€เธงเธฅเธฒเน€เธŠเธดเธ', - 'invite.status': 'เธชเธ–เธฒเธ™เธฐ', - 'invite.reward': 'เธฃเธฒเธ‡เธงเธฑเธฅ', - 'invite.active': 'เธ„เธฅเนˆเธญเธ‡เนเธ„เธฅเนˆเธง', - 'invite.inactive': 'เน„เธกเนˆเน„เธ”เน‰เน€เธ›เธดเธ”เนƒเธŠเน‰เธ‡เธฒเธ™', - 'invite.completed': 'เธชเธกเธšเธนเธฃเธ“เนŒ', - 'invite.claimed': 'เน„เธ”เน‰เธฃเธฑเธš', - 'invite.pending': 'เนƒเธซเน‰เนเธฅเน‰เธงเน€เธชเธฃเน‡เธˆ', - 'invite.goToTask': 'เน€เธžเธทเนˆเธญเนƒเธซเน‰เน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ', - 'invite.claimReward': 'เธฃเธฑเธšเธฃเธฒเธ‡เธงเธฑเธฅ', - 'invite.verify': 'เธเธฒเธฃเธขเธทเธ™เธขเธฑเธ™เน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ', - 'invite.verifySuccess': 'เธเธฒเธฃเธขเธทเธ™เธขเธฑเธ™เธชเธณเน€เธฃเน‡เธˆ!เธ‡เธฒเธ™เน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ', - 'invite.verifyNotCompleted': 'เธ‡เธฒเธ™เธขเธฑเธ‡เน„เธกเนˆเน€เธชเธฃเน‡เธˆเธชเธกเธšเธนเธฃเธ“เนŒ เธเธฃเธธเธ“เธฒเธ—เธณเธ‡เธฒเธ™เนƒเธซเน‰เน€เธชเธฃเน‡เธˆเธเนˆเธญเธ™', - 'invite.verifyFailed': 'เธเธฒเธฃเธขเธทเธ™เธขเธฑเธ™เธฅเน‰เธกเน€เธซเธฅเธง เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'invite.claimSuccess': 'เธฃเธฑเธš {reward} QDT เธชเธณเน€เธฃเน‡เธˆเนเธฅเน‰เธง!', - 'invite.claimFailed': 'เน„เธกเนˆเธชเธฒเธกเธฒเธฃเธ–เธฃเธงเธšเธฃเธงเธกเน„เธ”เน‰ เน‚เธ›เธฃเธ”เธฅเธญเธ‡เธญเธตเธเธ„เธฃเธฑเน‰เธ‡เนƒเธ™เธ เธฒเธขเธซเธฅเธฑเธ‡', - 'invite.totalRecords': 'เธฃเธงเธก {total} เธšเธฑเธ™เธ—เธถเธ', - 'invite.task.twitter.title': 'เธฃเธตเธ—เธงเธตเธ•เน„เธ›เธ—เธตเนˆ X (Twitter)', - 'invite.task.twitter.desc': 'เนเธšเนˆเธ‡เธ›เธฑเธ™เธ—เธงเธตเธ•เธญเธขเนˆเธฒเธ‡เน€เธ›เน‡เธ™เธ—เธฒเธ‡เธเธฒเธฃเธ‚เธญเธ‡เน€เธฃเธฒเน„เธ›เธขเธฑเธ‡เธšเธฑเธเธŠเธต X (Twitter) เธ‚เธญเธ‡เธ„เธธเธ“', - 'invite.task.youtube.title': 'เธ•เธดเธ”เธ•เธฒเธกเธŠเนˆเธญเธ‡ YouTube เธ‚เธญเธ‡เน€เธฃเธฒ', - 'invite.task.youtube.desc': 'เธชเธกเธฑเธ„เธฃเธชเธกเธฒเธŠเธดเธเนเธฅเธฐเธ•เธดเธ”เธ•เธฒเธกเธŠเนˆเธญเธ‡ YouTube เธญเธขเนˆเธฒเธ‡เน€เธ›เน‡เธ™เธ—เธฒเธ‡เธเธฒเธฃเธ‚เธญเธ‡เน€เธฃเธฒ', - 'invite.task.telegram.title': 'เน€เธ‚เน‰เธฒเธฃเนˆเธงเธกเธเธฅเธธเนˆเธกเน‚เธ—เธฃเน€เธฅเธ‚', - 'invite.task.telegram.desc': 'เน€เธ‚เน‰เธฒเธฃเนˆเธงเธกเธเธฅเธธเนˆเธกเธŠเธธเธกเธŠเธ™เน‚เธ—เธฃเน€เธฅเธ‚เธญเธขเนˆเธฒเธ‡เน€เธ›เน‡เธ™เธ—เธฒเธ‡เธเธฒเธฃเธ‚เธญเธ‡เน€เธฃเธฒ', - 'invite.task.discord.title': 'เน€เธ‚เน‰เธฒเธฃเนˆเธงเธกเน€เธ‹เธดเธฃเนŒเธŸเน€เธงเธญเธฃเนŒ Discord', - 'invite.task.discord.desc': 'เน€เธ‚เน‰เธฒเธฃเนˆเธงเธกเน€เธ‹เธดเธฃเนŒเธŸเน€เธงเธญเธฃเนŒเธŠเธธเธกเธŠเธ™ Discord เธ‚เธญเธ‡เน€เธฃเธฒ', - 'message': '-', - 'layouts.usermenu.dialog.title': 'เธ‚เน‰เธญเธกเธนเธฅ', - 'layouts.usermenu.dialog.content': 'เธ„เธธเธ“เนเธ™เนˆเนƒเธˆเธซเธฃเธทเธญเน„เธกเนˆเธงเนˆเธฒเธ•เน‰เธญเธ‡เธเธฒเธฃเธญเธญเธเธˆเธฒเธเธฃเธฐเธšเธš?', - 'layouts.userLayout.title': 'เธ„เน‰เธ™เธซเธฒเธ„เธงเธฒเธกเธˆเธฃเธดเธ‡เนƒเธ™เธ„เธงเธฒเธกเน„เธกเนˆเนเธ™เนˆเธ™เธญเธ™', - // Auto-filled missing keys from en-US (fallback to English) - 'dashboard.indicator.boundary.message': 'Note: The indicator script only computes plots + buy/sell signals. Position sizing, risk, scaling, fees/slippage belong to execution config.', - 'dashboard.indicator.boundary.indicatorRule': "Keep the script to buy/sell only (and set df['buy']/df['sell']). Do NOT implement position management, TP/SL, scaling in the script.", - 'dashboard.indicator.boundary.backtestRule': 'Rule: If a bar has a main signal (buy/sell โ†’ open/close/reverse), scaling in/out is skipped on the same bar.', - 'dashboard.indicator.guide.title': 'Python Indicator & Strategy Development Guide', - 'dashboard.indicator.guide.intro': 'This platform supports writing custom technical indicators and trading signals using Python. The system includes built-in pandas and numpy data analysis libraries. You can use standard DataFrame operations to process K-line data and draw charts or mark buy/sell signals.', - 'dashboard.indicator.guide.section1.title': '1. Runtime Environment & Predefined Variables', - 'dashboard.indicator.guide.section1.env': 'Your code runs in a browser-based Python environment (Pyodide).', - 'dashboard.indicator.guide.section1.libs': 'Pre-installed Libraries', - 'dashboard.indicator.guide.section1.libsDesc': 'The following libraries are imported by default, no need to import again:', - 'dashboard.indicator.guide.section1.libsList': 'pandas (pd), numpy (np), math, json', - 'dashboard.indicator.guide.section1.data': 'Input Data: df', - 'dashboard.indicator.guide.section1.dataDesc': 'The system automatically converts current K-line data into a Pandas DataFrame object, variable name is df.', - 'dashboard.indicator.guide.section1.dataColumns': 'df contains the following columns (all float type):', - 'dashboard.indicator.guide.section1.dataColumnsList': 'time (timestamp, seconds), open, high, low, close, volume', - 'dashboard.indicator.guide.section1.dataNote': 'Data index is arranged from old to new (0 is the earliest data, last row is the latest data).', - 'dashboard.indicator.guide.section1.dataIndex': 'Important: df index is timestamp (DatetimeIndex), please preserve the index, avoid using .values which loses the index.', - 'dashboard.indicator.guide.section2.title': '2. Parameter Definition', - 'dashboard.indicator.guide.section2.desc': 'You can define variables as parameters at the beginning of your code. The system will try to parse statements like variable = value as adjustable parameters.', - 'dashboard.indicator.guide.section2.example': 'Parameter Example', - 'dashboard.indicator.guide.section2.exampleCode': 'span = 20 or multiplier = 2.0', - 'dashboard.indicator.guide.section3.title': '3. Backtest Signal Setup (Important!)', - 'dashboard.indicator.guide.section3.desc': 'If you want your indicator to support backtesting, you must set the following two columns in your code:', - 'dashboard.indicator.guide.section3.backtestRequired': 'Required for Backtesting:', - 'dashboard.indicator.guide.section3.backtestBuySignal': "df['buy_signal'] - Boolean Series, True indicates buy signal", - 'dashboard.indicator.guide.section3.backtestSellSignal': "df['sell_signal'] - Boolean Series, True indicates sell signal", - 'dashboard.indicator.guide.section3.backtestExample': 'Example:', - 'dashboard.indicator.guide.section3.backtestExampleCode': "df['buy_signal'] = condition_buy
    df['sell_signal'] = condition_sell", - 'dashboard.indicator.guide.section3.backtestNote': 'Note: Even if you only set output.signals for chart display, you must set these two columns to enable backtesting.', - 'dashboard.indicator.guide.section4.title': '4. Output Requirements: output', - 'dashboard.indicator.guide.section4.desc': 'At the end of code execution, you must define a dictionary named output to tell the chart how to display results.', - 'dashboard.indicator.guide.section4.fields': 'The output dictionary contains the following fields:', - 'dashboard.indicator.guide.section4.plots': 'plots - For drawing lines (e.g., moving averages, RSI)', - 'dashboard.indicator.guide.section4.signals': 'signals - For marking buy/sell signals (e.g., arrows, labels)', - 'dashboard.indicator.guide.section4.name': 'name - Indicator name (optional)', - 'dashboard.indicator.guide.section4.calculatedVars': 'calculatedVars - Calculated variables (optional, for displaying additional information)', - 'dashboard.indicator.guide.section5.title': '5. Plot Configuration (Plots)', - 'dashboard.indicator.guide.section5.desc': 'Each object in the plots list represents a line.', - 'dashboard.indicator.guide.section5.table.field': 'Field', - 'dashboard.indicator.guide.section5.table.type': 'Type', - 'dashboard.indicator.guide.section5.table.required': 'Required', - 'dashboard.indicator.guide.section5.table.requiredYes': 'Yes', - 'dashboard.indicator.guide.section5.table.requiredNo': 'No', - 'dashboard.indicator.guide.section5.table.desc': 'Description', - 'dashboard.indicator.guide.section5.table.name': 'The name of the indicator line, displayed in the legend', - 'dashboard.indicator.guide.section5.table.data': 'Data list, length must match the number of rows in df. Recommended to use series.tolist()', - 'dashboard.indicator.guide.section5.table.color': "Line color (Hex format, e.g. '#ff0000'). If not filled, the system will automatically assign", - 'dashboard.indicator.guide.section5.table.typeDesc': "Chart type, default is 'line'", - 'dashboard.indicator.guide.section5.table.overlay': 'Important. True means display on main chart (with K-line), False means display on sub-chart (independent area)', - 'dashboard.indicator.guide.section5.example': 'Example: Draw Simple Moving Average (SMA)', - 'dashboard.indicator.guide.section5.exampleCalc': 'Calculate SMA', - 'dashboard.indicator.guide.section5.exampleOutput': 'Construct Output', - 'dashboard.indicator.guide.section5.exampleOverlay': 'Display on main chart', - 'dashboard.indicator.guide.section6.title': '6. Signal Markers (Signals)', - 'dashboard.indicator.guide.section6.desc': "signals are used to mark buy/sell points on specific K-lines through icons or text. Note: This is only for chart display. The backtest system uses df['buy_signal'] and df['sell_signal'].", - 'dashboard.indicator.guide.section6.table.type': "Signal type: 'buy' (buy, marked below K-line) or 'sell' (sell, marked above K-line)", - 'dashboard.indicator.guide.section6.table.data': 'Signal data list. Fill price value at signal positions, fill None (or np.nan) at non-signal positions', - 'dashboard.indicator.guide.section6.table.text': 'Text displayed on the label (e.g. "B", "S", "Buy", "Sell")', - 'dashboard.indicator.guide.section6.table.color': 'Marker color', - 'dashboard.indicator.guide.section6.hint': 'The system automatically handles positioning.', - 'dashboard.indicator.guide.section6.buy': 'Markers will be automatically positioned below the Low of the current K-line', - 'dashboard.indicator.guide.section6.sell': 'Markers will be automatically positioned above the High of the current K-line', - 'dashboard.indicator.guide.section6.example': 'Example: Draw Buy/Sell Signals', - 'dashboard.indicator.guide.section6.exampleInit': 'Initialize signal list, fill all with None', - 'dashboard.indicator.guide.section6.exampleLogic': 'Simple logic: mark buy when close price is greater than open price', - 'dashboard.indicator.guide.section6.exampleNote': 'In actual logic, please use loops or vectorized operations', - 'dashboard.indicator.guide.section6.examplePrice': 'Record price', - 'dashboard.indicator.guide.section6.exampleText': 'Buy', - 'dashboard.indicator.guide.section7.title': '7. Complete Code Examples', - 'dashboard.indicator.guide.section7.exampleA': 'Example A: Dual EMA Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleACode': "# 1. Calculate indicators
    df['ema_fast'] = df['close'].ewm(span=5, adjust=False).mean()
    df['ema_slow'] = df['close'].ewm(span=13, adjust=False).mean()

    # 2. Calculate crossover signals
    cross_up = (df['ema_fast'] > df['ema_slow']) & (df['ema_fast'].shift(1) <= df['ema_slow'].shift(1))
    cross_down = (df['ema_fast'] < df['ema_slow']) & (df['ema_fast'].shift(1) >= df['ema_slow'].shift(1))

    # 3. ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = cross_up
    df['close_long'] = cross_down
    df['open_short'] = cross_down
    df['close_short'] = cross_up

    # 4. Generate signal data for chart display
    buy_signals = [df['low'].iloc[i] * 0.995 if cross_up.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if cross_down.iloc[i] else None for i in range(len(df))]

    # 5. Build output
    output = {
    \"name\": \"Dual EMA Strategy\",
    \"plots\": [
    {\"name\": \"EMA 5\", \"data\": df['ema_fast'].tolist(), \"color\": \"#FF6B6B\", \"overlay\": True},
    {\"name\": \"EMA 13\", \"data\": df['ema_slow'].tolist(), \"color\": \"#4ECDC4\", \"overlay\": True}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleB': 'Example B: Bollinger Bands - Chart Display Only', - 'dashboard.indicator.guide.section7.exampleBCode': "# Calculate Bollinger Bands (chart display only, no backtesting)
    length = 20
    mult = 2.0
    df['sma'] = df['close'].rolling(length).mean()
    df['std'] = df['close'].rolling(length).std()
    df['upper'] = df['sma'] + mult * df['std']
    df['lower'] = df['sma'] - mult * df['std']

    output = {
    \"name\": \"Bollinger Bands\",
    \"plots\": [
    {\"name\": \"Upper\", \"data\": df['upper'].tolist(), \"color\": \"#FF5252\", \"overlay\": True},
    {\"name\": \"Middle\", \"data\": df['sma'].tolist(), \"color\": \"#2196F3\", \"overlay\": True},
    {\"name\": \"Lower\", \"data\": df['lower'].tolist(), \"color\": \"#00E676\", \"overlay\": True}
    ]
    }", - 'dashboard.indicator.guide.section7.exampleC': 'Example C: RSI Strategy (Supports Backtesting)', - 'dashboard.indicator.guide.section7.exampleCCode': "# Calculate RSI
    delta = df['close'].diff()
    up = delta.clip(lower=0)
    down = -1 * delta.clip(upper=0)
    ema_up = up.ewm(com=13, adjust=False).mean()
    ema_down = down.ewm(com=13, adjust=False).mean()
    rs = ema_up / ema_down
    df['rsi'] = 100 - (100 / (1 + rs))

    # Generate trading signals
    buy_condition = df['rsi'] < 30 # Oversold buy
    sell_condition = df['rsi'] > 70 # Overbought sell

    # ใ€Importantใ€‘Set NEW backtest signal columns (bool)
    df['open_long'] = buy_condition
    df['close_long'] = sell_condition
    df['open_short'] = sell_condition
    df['close_short'] = buy_condition

    # Generate chart signals
    buy_signals = [df['low'].iloc[i] * 0.995 if buy_condition.iloc[i] else None for i in range(len(df))]
    sell_signals = [df['high'].iloc[i] * 1.005 if sell_condition.iloc[i] else None for i in range(len(df))]

    output = {
    \"name\": \"RSI Strategy\",
    \"plots\": [
    {\"name\": \"RSI\", \"data\": df['rsi'].tolist(), \"color\": \"#9C27B0\", \"overlay\": False},
    {\"name\": \"Overbought\", \"data\": [70] * len(df), \"color\": \"#FF5252\", \"style\": \"dashed\", \"overlay\": False},
    {\"name\": \"Oversold\", \"data\": [30] * len(df), \"color\": \"#00E676\", \"style\": \"dashed\", \"overlay\": False}
    ],
    \"signals\": [
    {\"type\": \"buy\", \"text\": \"BUY\", \"data\": buy_signals, \"color\": \"#00E676\"},
    {\"type\": \"sell\", \"text\": \"SELL\", \"data\": sell_signals, \"color\": \"#FF5252\"}
    ]
    }", - 'dashboard.indicator.guide.section6.param': 'Parameters', - 'dashboard.indicator.guide.section6.calc': 'Calculate', - 'dashboard.indicator.guide.section6.output': 'Output', - 'dashboard.indicator.guide.section6.generate': 'Generate signal data (initialize with None)', - 'dashboard.indicator.guide.section6.subchart': 'Display on sub-chart', - 'dashboard.indicator.guide.section8.title': '8. Frequently Asked Questions (FAQ)', - 'dashboard.indicator.guide.section8.q1': "Q: Why can't my indicator be backtested?", - 'dashboard.indicator.guide.section8.a1': "A: The backtest system requires NEW signal columns: df['open_long'], df['close_long'], df['open_short'], df['close_short'] (boolean). Even if you set output.signals for chart display, you must set these columns to enable backtesting.", - 'dashboard.indicator.guide.section8.q2': 'Q: Data length mismatch?', - 'dashboard.indicator.guide.section8.a2': "A: The data list in plots and signals must have exactly the same length as the K-line data. If you use df['xxx'].tolist(), there is usually no problem.", - 'dashboard.indicator.guide.section8.q3': 'Q: How to handle NaN (empty values)?', - 'dashboard.indicator.guide.section8.a3': "A: Pandas calculations (such as rolling mean) will produce NaN at the beginning. The system will automatically convert NaN to null for chart rendering. You don't need to manually clean it, but if you need specific logic, you can use df.fillna(0) or other methods.", - 'dashboard.indicator.guide.section8.q4': 'Q: Index mismatch causing all signals to be NaN?', - 'dashboard.indicator.guide.section8.a4': "A: Please ensure you preserve the original df index (timestamp). Avoid using .values to create new Series. Use columns directly like df['close'] for operations.", - 'dashboard.indicator.guide.section8.q5': 'Q: Can I use third-party network libraries?', - 'dashboard.indicator.guide.section8.a5': 'A: No. The runtime environment is a browser sandbox and cannot use libraries like requests to request external APIs, nor can it install additional pip packages. Limited to built-in libraries such as pandas, numpy, math, json.', - 'dashboard.indicator.guide.section8.q6': 'Q: How to debug code?', - 'dashboard.indicator.guide.section8.a6': 'A: If the chart does not display indicators, it is usually because the Python code has an error. Please check for syntax errors or array index out of bounds. It is recommended to debug the algorithm logic in a local Python environment first, then copy it in.', - 'dashboard.indicator.guide.section8.q7': 'Q: Backtest shows 0 signals?', - 'dashboard.indicator.guide.section8.a7': "A: Please check the data type of df['open_long']/df['close_long']/df['open_short']/df['close_short']. They should be boolean (True/False), not numeric. Use condition.fillna(False).astype(bool) to ensure correct type.", - 'dashboard.indicator.backtest.commissionHint': 'Charged on notional value (incl. leverage) per trade; both entry & exit are deducted from balance.', - 'dashboard.indicator.backtest.historyTitle': 'Backtest History', - 'dashboard.indicator.backtest.historyRefresh': 'Refresh', - 'dashboard.indicator.backtest.historyView': 'View', - 'dashboard.indicator.backtest.historyNoData': 'No backtest history', - 'dashboard.indicator.backtest.historyUseCurrent': 'Only current symbol/timeframe', - 'dashboard.indicator.backtest.historyFilterSymbol': 'Symbol', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'Timeframe', - 'dashboard.indicator.backtest.historyApply': 'Apply filters', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AI Analyze', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI Suggestions', - 'dashboard.indicator.backtest.historyNoAIResult': 'No AI analysis result', - 'dashboard.indicator.backtest.historyRunId': 'Run ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'Time', - 'dashboard.indicator.backtest.historyRange': 'Range', - 'dashboard.indicator.backtest.historyStatus': 'Status', - 'dashboard.indicator.backtest.historyStatusSuccess': 'Success', - 'dashboard.indicator.backtest.historyStatusFailed': 'Failed', - 'dashboard.indicator.backtest.historyActions': 'Actions', - 'trading-assistant.exchange.ipWhitelistTip': 'Please add the following IPs to the whitelist in your exchange API settings:', - 'signal-robot.title': 'Signal Robot Console', - 'signal-robot.createBot': 'Create New Bot', - 'signal-robot.search.nameOrSymbol': 'Name/Symbol', - 'signal-robot.search.placeholder': 'Search bot name or symbol', - 'signal-robot.search.status': 'Status', - 'signal-robot.search.statusAll': 'All', - 'signal-robot.search.statusRunning': 'Running', - 'signal-robot.search.statusPaused': 'Paused', - 'signal-robot.search.query': 'Query', - 'signal-robot.search.reset': 'Reset', - 'signal-robot.table.botName': 'Bot Name', - 'signal-robot.table.symbolTimeframe': 'Symbol/Timeframe', - 'signal-robot.table.triggerStrategy': 'Trigger Strategy', - 'signal-robot.table.notificationChannels': 'Notification Channels', - 'signal-robot.table.status': 'Status', - 'signal-robot.table.action': 'Action', - 'signal-robot.table.triggerConditions': '{count} trigger conditions', - 'signal-robot.table.monitoring': 'Monitoring', - 'signal-robot.table.paused': 'Paused', - 'signal-robot.table.edit': 'Edit', - 'signal-robot.table.pause': 'Pause', - 'signal-robot.table.start': 'Start', - 'signal-robot.table.delete': 'Delete', - 'signal-robot.table.deleteConfirm': 'Are you sure you want to delete this bot?', - 'signal-robot.table.deleteSuccess': 'Deleted successfully', - 'signal-robot.table.startSuccess': 'Bot started', - 'signal-robot.table.pauseSuccess': 'Bot paused', - 'signal-robot.channel.telegram': 'Telegram', - 'signal-robot.channel.discord': 'Discord', - 'signal-robot.channel.email': 'Email', - 'signal-robot.channel.webhook': 'Webhook', - 'signal-robot.channel.browser': 'Browser Push', - 'signal-robot.modal.createTitle': 'Create New Signal Robot', - 'signal-robot.modal.editTitle': 'Edit Signal Robot', - 'signal-robot.modal.step.basic': 'Basic Settings', - 'signal-robot.modal.step.entry': 'Entry Strategy', - 'signal-robot.modal.step.position': 'Position Management', - 'signal-robot.modal.step.risk': 'Risk Control', - 'signal-robot.modal.step.notify': 'Notification Config', - 'signal-robot.modal.prev': 'Previous', - 'signal-robot.modal.next': 'Next', - 'signal-robot.modal.preview': 'Preview Backtest', - 'signal-robot.modal.complete': 'Complete & Run', - 'signal-robot.modal.saveSuccess': 'Saved successfully', - 'signal-robot.modal.previewDeveloping': 'Preview feature is under development...', - 'signal-robot.modal.basicInfoRequired': 'Please complete basic information', - 'signal-robot.basic.alert': 'Set basic information for the bot', - 'signal-robot.basic.title': 'Basic Information', - 'signal-robot.basic.botName': 'Bot Name', - 'signal-robot.basic.botNamePlaceholder': 'e.g.: BTC SuperTrend Strategy', - 'signal-robot.basic.symbol': 'Trading Pair', - 'signal-robot.basic.symbolPlaceholder': 'Select from watchlist', - 'signal-robot.basic.noWatchlist': 'No watchlist items, please add in market page first', - 'signal-robot.basic.timeframe': 'K-Line Period', - 'signal-robot.basic.timeframe15m': '15 Minutes', - 'signal-robot.basic.timeframe30m': '30 Minutes', - 'signal-robot.basic.timeframe1h': '1 Hour', - 'signal-robot.basic.timeframe4h': '4 Hours', - 'signal-robot.basic.timeframe1d': '1 Day', - 'signal-robot.basic.autoNameSuggestion': '{symbol} Signal Robot', - 'signal-robot.entry.alert': 'Trigger entry signal when all conditions below are met', - 'signal-robot.entry.condition': 'Condition {index}', - 'signal-robot.entry.indicator': 'Indicator', - 'signal-robot.entry.indicatorSupertrend': 'SuperTrend', - 'signal-robot.entry.indicatorEma': 'EMA (Exponential Moving Average)', - 'signal-robot.entry.indicatorRsi': 'RSI (Relative Strength Index)', - 'signal-robot.entry.indicatorMacd': 'MACD', - 'signal-robot.entry.indicatorBollinger': 'Bollinger Bands', - 'signal-robot.entry.atrPeriod': 'ATR Period', - 'signal-robot.entry.multiplier': 'Multiplier', - 'signal-robot.entry.triggerSignal': 'Trigger Signal', - 'signal-robot.entry.signalTrendBullish': 'Trend Bullish', - 'signal-robot.entry.signalTrendBearish': 'Trend Bearish', - 'signal-robot.entry.signalIsUptrend': 'Is Uptrend', - 'signal-robot.entry.signalIsDowntrend': 'Is Downtrend', - 'signal-robot.entry.period': 'Period', - 'signal-robot.entry.compareCondition': 'Compare Condition', - 'signal-robot.entry.priceAbove': 'Price > EMA (Price Above)', - 'signal-robot.entry.priceBelow': 'Price < EMA (Price Below)', - 'signal-robot.entry.crossUp': 'Price Crosses Above EMA (Golden Cross)', - 'signal-robot.entry.crossDown': 'Price Crosses Below EMA (Death Cross)', - 'signal-robot.entry.compare': 'Compare', - 'signal-robot.entry.greaterThan': 'Greater Than', - 'signal-robot.entry.lessThan': 'Less Than', - 'signal-robot.entry.crossUpShort': 'Cross Up', - 'signal-robot.entry.crossDownShort': 'Cross Down', - 'signal-robot.entry.threshold': 'Threshold', - 'signal-robot.entry.selectIndicator': 'Please select an indicator to configure parameters', - 'signal-robot.entry.addCondition': 'Add Condition', - 'signal-robot.position.alert': 'Configure initial position size, leverage and pyramiding rules', - 'signal-robot.position.basicTitle': 'Basic Position Management', - 'signal-robot.position.initialSize': 'Initial Size (Capital %)', - 'signal-robot.position.initialSizeHint': 'Recommended 5% - 20%', - 'signal-robot.position.leverage': 'Leverage', - 'signal-robot.position.leverageHint': 'Please ensure your exchange account supports this leverage', - 'signal-robot.position.maxPyramiding': 'Max Pyramiding Times', - 'signal-robot.position.maxPyramidingHint': '0 means no pyramiding', - 'signal-robot.position.pyramidingTitle': 'Pyramiding Rules', - 'signal-robot.position.pyramidingEnabled': 'Enabled', - 'signal-robot.position.pyramidingDisabled': 'Disabled', - 'signal-robot.position.pyramidingCondition': 'Pyramiding Trigger Condition', - 'signal-robot.position.priceRisePct': 'Price Rises (Long) / Falls (Short)', - 'signal-robot.position.profitPct': 'Profit Reaches', - 'signal-robot.position.triggerThreshold': 'Trigger Threshold (%)', - 'signal-robot.position.triggerThresholdHint': 'e.g. 3%: add position once every 3% rise', - 'signal-robot.position.addSize': 'Single Add Size (Capital %)', - 'signal-robot.position.pyramidingDisabledHint': 'Pyramiding disabled, only initial position will be executed', - 'signal-robot.risk.alert': 'Configure take profit, stop loss and exit rules', - 'signal-robot.risk.stopLossTitle': 'Stop Loss', - 'signal-robot.risk.stopLossEnabled': 'Enabled', - 'signal-robot.risk.stopLossDisabled': 'Disabled', - 'signal-robot.risk.stopLossType': 'Stop Loss Type', - 'signal-robot.risk.stopLossFixedPct': 'Fixed Percentage', - 'signal-robot.risk.stopLossAtrMultiplier': 'ATR Multiplier', - 'signal-robot.risk.stopLossValue': 'Value', - 'signal-robot.risk.stopLossFixedHint': 'e.g. 2%: stop loss when loss reaches 2%', - 'signal-robot.risk.stopLossAtrHint': 'e.g. 2.0: stop loss when price touches ATR*2.0', - 'signal-robot.risk.stopLossDisabledHint': 'Stop loss disabled (high risk)', - 'signal-robot.risk.trailingStopTitle': 'Trailing Stop', - 'signal-robot.risk.activationProfit': 'Activation Profit (%)', - 'signal-robot.risk.activationProfitHint': 'Start trailing when profit reaches this level', - 'signal-robot.risk.callbackPct': 'Callback (%)', - 'signal-robot.risk.callbackPctHint': 'Trigger take profit when price falls from peak by this percentage', - 'signal-robot.risk.trailingStopDisabledHint': 'Trailing stop disabled', - 'signal-robot.risk.otherExitTitle': 'Other Exit Rules', - 'signal-robot.risk.signalExit': 'Allow Signal Exit', - 'signal-robot.risk.signalExitHint': 'Close position immediately when reverse signal appears (e.g. close long when short signal appears)', - 'signal-robot.notify.alert': 'Configure notification methods when signal is triggered', - 'signal-robot.notify.channelTitle': 'Notification Channels', - 'signal-robot.notify.discordWebhook': 'Discord Webhook', - 'signal-robot.notify.genericWebhook': 'Generic Webhook', - 'signal-robot.notify.webhookUrl': 'Webhook URL', - 'signal-robot.notify.webhookUrlPlaceholder': 'https://example.com/webhook', - 'signal-robot.notify.discordUrl': 'Discord URL', - 'signal-robot.notify.discordUrlPlaceholder': 'https://discord.com/api/webhooks/...', - 'signal-robot.operator.greaterThan': 'Greater Than', - 'signal-robot.operator.lessThan': 'Less Than', - 'signal-robot.operator.equal': 'Equal', - 'signal-robot.operator.goldenCross': 'Golden Cross', - 'signal-robot.operator.deathCross': 'Death Cross', - 'signal-robot.operator.increaseBy': 'Increase By', - 'signal-robot.operator.decreaseBy': 'Decrease By', - 'signal-robot.indicator.price': 'Price', - 'signal-robot.indicator.rsi': 'RSI', - 'signal-robot.indicator.kdjK': 'KDJ(K)', - 'signal-robot.indicator.kdjJ': 'KDJ(J)', - 'signal-robot.indicator.macd': 'MACD', - 'signal-robot.indicator.macdHist': 'MACD Histogram', - 'signal-robot.indicator.bollingerUp': 'Bollinger Upper', - 'signal-robot.indicator.bollingerLow': 'Bollinger Lower', - 'signal-robot.indicator.volume': 'Volume', - 'signal-robot.indicator.changePct1h': '1H Change %', - 'signal-robot.indicator.changePct24h': '24H Change %', - 'signal-robot.indicator.signalLine': 'Signal Line', - - // Settings (Memory/Reflection) - 'settings.group.agent_memory': 'เธซเธ™เนˆเธงเธขเธ„เธงเธฒเธกเธˆเธณ/เธเธฒเธฃเธชเธฐเธ—เน‰เธญเธ™', - 'settings.group.reflection_worker': 'เธ•เธฑเธงเธ—เธณเธ‡เธฒเธ™เธ•เธฃเธงเธˆเธชเธญเธšเธเธฒเธฃเธชเธฐเธ—เน‰เธญเธ™เธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด', - 'settings.field.ENABLE_AGENT_MEMORY': 'เน€เธ›เธดเธ”เนƒเธŠเน‰เธซเธ™เนˆเธงเธขเธ„เธงเธฒเธกเธˆเธณเน€เธญเน€เธˆเธ™เธ•เนŒ', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'เน€เธ›เธดเธ”เนƒเธŠเน‰เธเธฒเธฃเธ„เน‰เธ™เธซเธฒเน€เธงเธเน€เธ•เธญเธฃเนŒ (เนƒเธ™เน€เธ„เธฃเธทเนˆเธญเธ‡)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'เธกเธดเธ•เธด Embedding', - 'settings.field.AGENT_MEMORY_TOP_K': 'เธˆเธณเธ™เธงเธ™เธ”เธถเธ‡เธ‚เน‰เธญเธกเธนเธฅ Top-K', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'เธ‚เธ™เธฒเธ”เธซเธ™เน‰เธฒเธ•เนˆเธฒเธ‡เธœเธนเน‰เธชเธกเธฑเธ„เธฃ', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'เธ„เธฃเธถเนˆเธ‡เธŠเธตเธงเธดเธ•เธเธฒเธฃเธฅเธ”เธ—เธญเธ™เธ•เธฒเธกเน€เธงเธฅเธฒ (เธงเธฑเธ™)', - 'settings.field.AGENT_MEMORY_W_SIM': 'เธ„เนˆเธฒเธ™เน‰เธณเธซเธ™เธฑเธเธ„เธงเธฒเธกเธ„เธฅเน‰เธฒเธข', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'เธ„เนˆเธฒเธ™เน‰เธณเธซเธ™เธฑเธเน€เธงเธฅเธฒ', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'เธ„เนˆเธฒเธ™เน‰เธณเธซเธ™เธฑเธเธœเธฅเธ•เธญเธšเนเธ—เธ™', - 'settings.field.ENABLE_REFLECTION_WORKER': 'เน€เธ›เธดเธ”เนƒเธŠเน‰เธเธฒเธฃเธ•เธฃเธงเธˆเธชเธญเธšเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธด', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'เธŠเนˆเธงเธ‡เน€เธงเธฅเธฒเธ•เธฃเธงเธˆเธชเธญเธš (เธงเธดเธ™เธฒเธ—เธต)', - - // Profile - Notification Settings (เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™) - 'profile.notifications.title': 'เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™', - 'profile.notifications.hint': 'เธเธณเธซเธ™เธ”เธ„เนˆเธฒเธงเธดเธ˜เธตเธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เน€เธฃเธดเนˆเธกเธ•เน‰เธ™ เธˆเธฐเธ–เธนเธเนƒเธŠเน‰เน‚เธ”เธขเธญเธฑเธ•เน‚เธ™เธกเธฑเธ•เธดเน€เธกเธทเนˆเธญเธชเธฃเน‰เธฒเธ‡เธเธฒเธฃเธ•เธดเธ”เธ•เธฒเธกเธชเธดเธ™เธ—เธฃเธฑเธžเธขเนŒเนเธฅเธฐเธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™', - 'profile.notifications.defaultChannels': 'เธŠเนˆเธญเธ‡เธ—เธฒเธ‡เนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เน€เธฃเธดเนˆเธกเธ•เน‰เธ™', - 'profile.notifications.browser': 'เธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เนƒเธ™เนเธญเธ›', - 'profile.notifications.email': 'เธญเธตเน€เธกเธฅ', - 'profile.notifications.phone': 'SMS', - 'profile.notifications.telegramBotToken': 'Telegram Bot Token', - 'profile.notifications.telegramBotTokenPlaceholder': 'เธเธฃเธญเธ Telegram Bot Token เธ‚เธญเธ‡เธ„เธธเธ“', - 'profile.notifications.telegramBotTokenHint': 'เธชเธฃเน‰เธฒเธ‡เธšเธญเธ—เธœเนˆเธฒเธ™ @BotFather เน€เธžเธทเนˆเธญเธฃเธฑเธš Token', - 'profile.notifications.telegramChatId': 'Telegram Chat ID', - 'profile.notifications.telegramPlaceholder': 'เธเธฃเธญเธ Telegram Chat ID เธ‚เธญเธ‡เธ„เธธเธ“ (เน€เธŠเนˆเธ™ 123456789)', - 'profile.notifications.telegramHint': 'เธชเนˆเธ‡ /start เน„เธ›เธ—เธตเนˆ @userinfobot เน€เธžเธทเนˆเธญเธฃเธฑเธš Chat ID', - 'profile.notifications.notifyEmail': 'เธญเธตเน€เธกเธฅเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™', - 'profile.notifications.emailPlaceholder': 'เธ—เธตเนˆเธญเธขเธนเนˆเธญเธตเน€เธกเธฅเธชเธณเธซเธฃเธฑเธšเธฃเธฑเธšเธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™', - 'profile.notifications.emailHint': 'เนƒเธŠเน‰เธญเธตเน€เธกเธฅเธšเธฑเธเธŠเธตเน€เธ›เน‡เธ™เธ„เนˆเธฒเน€เธฃเธดเนˆเธกเธ•เน‰เธ™ เธชเธฒเธกเธฒเธฃเธ–เธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธญเธตเน€เธกเธฅเธญเธทเนˆเธ™เน„เธ”เน‰', - 'profile.notifications.phonePlaceholder': 'เธเธฃเธญเธเธซเธกเธฒเธขเน€เธฅเธ‚เน‚เธ—เธฃเธจเธฑเธžเธ—เนŒ (เน€เธŠเนˆเธ™ +66812345678)', - 'profile.notifications.phoneHint': 'เธœเธนเน‰เธ”เธนเนเธฅเธฃเธฐเธšเธšเธ•เน‰เธญเธ‡เธเธณเธซเธ™เธ”เธ„เนˆเธฒเธšเธฃเธดเธเธฒเธฃ Twilio', - 'profile.notifications.discordWebhook': 'Discord Webhook', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'เธชเธฃเน‰เธฒเธ‡ Webhook เนƒเธ™เธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเน€เธ‹เธดเธฃเนŒเธŸเน€เธงเธญเธฃเนŒ Discord', - 'profile.notifications.webhookUrl': 'Webhook URL', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': 'URL Webhook เนเธšเธšเธเธณเธซเธ™เธ”เน€เธญเธ‡ เธชเนˆเธ‡เธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เธœเนˆเธฒเธ™ POST JSON', - 'profile.notifications.webhookToken': 'Webhook Token (เน„เธกเนˆเธšเธฑเธ‡เธ„เธฑเธš)', - 'profile.notifications.webhookTokenPlaceholder': 'Bearer Token เธชเธณเธซเธฃเธฑเธšเธขเธทเธ™เธขเธฑเธ™เธ•เธฑเธงเธ•เธ™เธ„เธณเธ‚เธญ', - 'profile.notifications.webhookTokenHint': 'เธชเนˆเธ‡เน€เธ›เน‡เธ™ Authorization: Bearer Token เน„เธ›เธขเธฑเธ‡ Webhook', - 'profile.notifications.testBtn': 'เธชเนˆเธ‡เธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เธ—เธ”เธชเธญเธš', - 'profile.notifications.saveSuccess': 'เธšเธฑเธ™เธ—เธถเธเธเธฒเธฃเธ•เธฑเน‰เธ‡เธ„เนˆเธฒเธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เธชเธณเน€เธฃเน‡เธˆ', - 'profile.notifications.selectChannel': 'เธเธฃเธธเธ“เธฒเน€เธฅเธทเธญเธเธญเธขเนˆเธฒเธ‡เธ™เน‰เธญเธขเธซเธ™เธถเนˆเธ‡เธŠเนˆเธญเธ‡เธ—เธฒเธ‡เนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™', - 'profile.notifications.fillTelegramToken': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธ Telegram Bot Token', - 'profile.notifications.fillTelegram': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธ Telegram Chat ID', - 'profile.notifications.fillEmail': 'เธเธฃเธธเธ“เธฒเธเธฃเธญเธเธญเธตเน€เธกเธฅเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™', - 'profile.notifications.testSent': 'เธชเนˆเธ‡เธเธฒเธฃเนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เธ—เธ”เธชเธญเธšเนเธฅเน‰เธง เธเธฃเธธเธ“เธฒเธ•เธฃเธงเธˆเธชเธญเธšเธŠเนˆเธญเธ‡เธ—เธฒเธ‡เนเธˆเน‰เธ‡เน€เธ•เธทเธญเธ™เธ‚เธญเธ‡เธ„เธธเธ“' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/vi-VN.js b/quantdinger_vue/src/locales/lang/vi-VN.js deleted file mode 100644 index 41110ee..0000000 --- a/quantdinger_vue/src/locales/lang/vi-VN.js +++ /dev/null @@ -1,2953 +0,0 @@ -import antdViVN from 'ant-design-vue/es/locale-provider/vi_VN' -import momentVI from 'moment/locale/vi' - -const components = { - antLocale: antdViVN, - momentName: 'vi', - momentLocale: momentVI -} - -const locale = { - - 'submit': 'Gแปญi', - - 'save': 'Lฦฐu', - - 'submit.ok': 'Gแปญi thร nh cรดng', - - 'save.ok': 'Lฦฐu thร nh cรดng', - - 'menu.welcome': 'Chร o mแปซng', - - 'menu.home': 'Trang chแปง', - - 'menu.dashboard': 'Bแบฃng ฤ‘iแปu khiแปƒn', - - 'menu.dashboard.indicator': 'Phรขn tรญch chแป‰ bรกo', - - 'menu.dashboard.community': 'Cแป™ng ฤ‘แป“ng chแป‰ bรกo', - - 'menu.dashboard.analysis': 'Phรขn tรญch AI', - - 'menu.dashboard.tradingAssistant': 'Trแปฃ lรฝ giao dแป‹ch', - - 'menu.dashboard.aiTradingAssistant': 'Trแปฃ lรฝ giao dแป‹ch AI', - 'menu.dashboard.signalRobot': 'Robot tรญn hiแป‡u', - 'menu.dashboard.monitor': 'Giรกm sรกt Trang', - - 'menu.dashboard.workplace': 'Nฦกi lร m viแป‡c', - - 'menu.form': 'Trang biแปƒu mแบซu', - - 'menu.form.basic-form': 'Biแปƒu mแบซu cฦก bแบฃn', - - 'menu.form.step-form': 'Biแปƒu mแบซu tแปซng bฦฐแป›c', - - 'menu.form.step-form.info': 'Biแปƒu mแบซu tแปซng bฦฐแป›c (ฤiแปn thรดng tin chuyแปƒn khoแบฃn)', - - 'menu.form.step-form.confirm': 'Biแปƒu mแบซu tแปซng bฦฐแป›c (Xรกc nhแบญn thรดng tin chuyแปƒn khoแบฃn)', - - 'menu.form.step-form.result': 'Biแปƒu mแบซu tแปซng bฦฐแป›c (Hoร n tแบฅt)', - - 'menu.form.advanced-form': 'Biแปƒu mแบซu nรขng cao', - - 'menu.list': 'Trang danh sรกch', - - 'menu.list.table-list': 'Bแบฃng truy vแบฅn', - - 'menu.list.basic-list': 'Tiรชu chuแบฉn Menu.list', - - 'menu.list.card-list': 'Danh sรกch thแบป', - - 'menu.list.search-list': 'Tรฌm kiแบฟm danh sรกch', - - 'menu.list.search-list.articles': 'Tรฌm kiแบฟm danh sรกch (Bร i viแบฟt)', - - 'menu.list.search-list.projects': 'Tรฌm kiแบฟm danh sรกch (Dแปฑ รกn)', - - 'menu.list.search-list.applications': 'Tรฌm kiแบฟm danh sรกch (แปจng dแปฅng)', - - 'menu.profile': 'Trang chi tiแบฟt', - - 'menu.profile.basic': 'Trang chi tiแบฟt cฦก bแบฃn', - - 'menu.profile.advanced': 'Trang chi tiแบฟt nรขng cao', - - 'menu.result': 'Trang kแบฟt quแบฃ', - - 'menu.result.success': 'Trang thร nh cรดng', - - 'menu.result.fail': 'Trang thแบฅt bแบกi', - - 'menu.exception': 'Ngoแบกi lแป‡ Trang', - - 'menu.exception.not-permission': '403', - - 'menu.exception.not-find': '404', - - 'menu.exception.server-error': '500', - - 'menu.exception.trigger': 'ฤang gรขy ra lแป—i', - - 'menu.account': 'Trang cรก nhรขn', - - 'menu.account.center': 'Trung tรขm cรก nhรขn', - - 'menu.account.settings': 'Cร i ฤ‘แบทt cรก nhรขn', - - 'menu.account.trigger': 'ฤang gรขy ra lแป—i', - - 'menu.account.logout': 'ฤฤƒng xuแบฅt', - - 'menu.wallet': 'Vรญ cแปงa tรดi', - - 'menu.docs': 'Trung tรขm tร i liแป‡u', - - 'menu.docs.detail': 'Chi tiแบฟt tร i liแป‡u', - - 'menu.header.refreshPage': 'Lร m mแป›i Trang', - - 'menu.invite.friends': 'Mแปi bแบกn bรจ', - - 'app.setting.pagestyle': 'Cร i ฤ‘แบทt kiแปƒu tแป•ng thแปƒ', - - 'app.setting.pagestyle.light': 'Kiแปƒu menu sรกng', - - 'app.setting.pagestyle.dark': 'Kiแปƒu menu tแป‘i', - - 'app.setting.pagestyle.realdark': 'Chแบฟ ฤ‘แป™ tแป‘i', - - 'app.setting.themecolor': 'Mร u chแปง ฤ‘แป', - - 'app.setting.navigationmode': 'Chแบฟ ฤ‘แป™ ฤ‘iแปu hฦฐแป›ng', - - 'app.setting.sidemenu.nav': 'ฤiแปu hฦฐแป›ng thanh bรชn', - - 'app.setting.topmenu.nav': 'ฤiแปu hฦฐแป›ng trรชn cรนng', - - 'app.setting.content-width': 'Chiแปu rแป™ng vรนng nแป™i dung', - - 'app.setting.content-width.tooltip': 'Cร i ฤ‘แบทt nร y chแป‰ cรณ hiแป‡u lแปฑc khi [ฤiแปu hฦฐแป›ng trรชn cรนng] ฤ‘ฦฐแปฃc bแบญt', - - 'app.setting.content-width.fixed': 'Cแป‘ ฤ‘แป‹nh', - - 'app.setting.content-width.fluid': 'Linh hoแบกt', - - 'app.setting.fixedheader': 'Tiรชu ฤ‘แป cแป‘ ฤ‘แป‹nh', - - 'app.setting.fixedheader.tooltip': 'Cรณ thแปƒ cแบฅu hรฌnh khi tiรชu ฤ‘แป cแป‘ ฤ‘แป‹nh', - - 'app.setting.autoHideHeader': 'แบจn tiรชu ฤ‘แป khi vuแป‘t xuแป‘ng', - - 'app.setting.fixedsidebar': 'Menu thanh bรชn cแป‘ ฤ‘แป‹nh', - - 'app.setting.sidemenu': 'Bแป‘ cแปฅc menu thanh bรชn', - - 'app.setting.topmenu': 'Bแป‘ cแปฅc menu trรชn cรนng', - - 'app.setting.othersettings': 'Cรกc cร i ฤ‘แบทt khรกc', - - 'app.setting.weakmode': 'Chแบฟ ฤ‘แป™ mร u yแบฟu', - - 'app.setting.multitab': 'Chแบฟ ฤ‘แป™ nhiแปu tab', - - 'app.setting.copy': 'Sao chรฉp cร i ฤ‘แบทt', - - 'app.setting.loading': 'ฤang tแบฃi theme', - - 'app.setting.copyinfo': 'ฤรฃ sao chรฉp cร i ฤ‘แบทt thร nh cรดng src/config/defaultSettings.js', - - 'app.setting.copy.success': 'Sao chรฉp hoร n tแบฅt', - - 'app.setting.copy.fail': 'Sao chรฉp thแบฅt bแบกi', - - 'app.setting.theme.switching': 'ฤang chuyแปƒn ฤ‘แป•i giao diแป‡n!', - - 'app.setting.production.hint': 'Thanh cแบฅu hรฌnh chแป‰ dรนng ฤ‘แปƒ xem trฦฐแป›c trong mรดi trฦฐแปng phรกt triแปƒn vร  sแบฝ khรดng hiแปƒn thแป‹ trong mรดi trฦฐแปng sแบฃn xuแบฅt. Vui lรฒng sao chรฉp vร  chแป‰nh sแปญa thแปง cรดng tแป‡p cแบฅu hรฌnh.', - - 'app.setting.themecolor.daybreak': 'Xanh dฦฐฦกng bรฌnh minh (mแบทc ฤ‘แป‹nh)', - - 'app.setting.themecolor.dust': 'Hoร ng hรดn', - - 'app.setting.themecolor.volcano': 'Nรบi lแปญa', - - 'app.setting.themecolor.sunset': 'Hoร ng hรดn', - - 'app.setting.themecolor.cyan': 'Xanh lam sรกng', - - 'app.setting.themecolor.green': 'Xanh lแปฅc cแปฑc quang', - - 'app.setting.themecolor.geekblue': 'Xanh dฦฐฦกng cรดng nghแป‡', - - 'app.setting.themecolor.purple': 'Tรญm', - - 'app.setting.tooltip': 'Cร i ฤ‘แบทt trang', - - 'user.login.userName': 'Tรชn ngฦฐแปi dรนng', - - 'user.login.password': 'Mแบญt khแบฉu', - - 'user.login.username.placeholder': 'Tร i khoแบฃn: admin', - - 'user.login.password.placeholder': 'Mแบญt khแบฉu: admin hoแบทc ant.design', - - 'user.login.message-invalid-credentials': 'ฤฤƒng nhแบญp thแบฅt bแบกi, vui lรฒng kiแปƒm tra email vร  mรฃ xรกc minh cแปงa bแบกn', - - 'user.login.message-invalid-verification-code': 'Mรฃ xรกc minh khรดng chรญnh xรกc', - - 'user.login.tab-login-credentials': 'ฤฤƒng nhแบญp bแบฑng tร i khoแบฃn vร  mแบญt khแบฉu', - - 'user.login.tab-login-email': 'ฤฤƒng nhแบญp bแบฑng email', - - 'user.login.tab-login-mobile': 'ฤฤƒng nhแบญp bแบฑng sแป‘ ฤ‘iแป‡n thoแบกi', - - 'user.login.captcha.placeholder': 'Vui lรฒng nhแบญp mรฃ xรกc minh hรฌnh แบฃnh', - - 'user.login.mobile.placeholder': 'Sแป‘ ฤ‘iแป‡n thoแบกi Sแป‘ ฤ‘iแป‡n thoแบกi', - - 'user.login.mobile.verification-code.placeholder': 'Mรฃ xรกc thแปฑc', - - 'user.login.email.placeholder': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ email', - - 'user.login.email.verification-code.placeholder': 'Vui lรฒng nhแบญp mรฃ xรกc thแปฑc', - - 'user.login.email.sending': 'ฤang gแปญi mรฃ xรกc thแปฑc...', - - 'user.login.email.send-success-title': 'Thรดng bรกo', - - 'user.login.email.send-success': 'Mรฃ xรกc thแปฑc ฤ‘รฃ ฤ‘ฦฐแปฃc gแปญi thร nh cรดng, vui lรฒng kiแปƒm tra email cแปงa bแบกn', - - 'user.login.sms.send-success': 'Mรฃ xรกc thแปฑc ฤ‘รฃ ฤ‘ฦฐแปฃc gแปญi thร nh cรดng, vui lรฒng kiแปƒm tra tin nhแบฏn SMS cแปงa bแบกn', - - 'user.login.remember-me': 'Tแปฑ ฤ‘แป™ng ฤ‘ฤƒng nhแบญp', - - 'user.login.forgot-password': 'Quรชn mแบญt khแบฉu Mแบญt khแบฉu', - - 'user.login.sign-in-with': 'Cรกc phฦฐฦกng thแปฉc ฤ‘ฤƒng nhแบญp khรกc', - - 'user.login.signup': 'ฤฤƒng kรฝ tร i khoแบฃn', - - 'user.login.login': 'ฤฤƒng nhแบญp', - - 'user.register.register': 'ฤฤƒng kรฝ', - - 'user.register.email.placeholder': 'Email', - - 'user.register.password.placeholder': 'Vui lรฒng nhแบญp รญt nhแบฅt 6 kรฝ tแปฑ. Vui lรฒng khรดng sแปญ dแปฅng mแบญt khแบฉu dแป… ฤ‘oรกn.', - - 'user.register.password.popover-message': 'Vui lรฒng nhแบญp รญt nhแบฅt 6 kรฝ tแปฑ. Vui lรฒng khรดng sแปญ dแปฅng mแบญt khแบฉu dแป… ฤ‘oรกn.', - - 'user.register.confirm-password.placeholder': 'Xรกc nhแบญn mแบญt khแบฉu', - - 'user.register.get-verification-code': 'Lแบฅy mรฃ xรกc minh', - - 'user.register.sign-in': 'ฤฤƒng nhแบญp bแบฑng tร i khoแบฃn hiแป‡n cรณ', - - 'user.register-result.msg': 'Tร i khoแบฃn cแปงa bแบกn: {email} ฤ‘รฃ ฤ‘ฦฐแปฃc ฤ‘ฤƒng kรฝ thร nh cรดng', - - 'user.register-result.activation-email': 'Email kรญch hoแบกt ฤ‘รฃ ฤ‘ฦฐแปฃc gแปญi ฤ‘แบฟn hแป™p thฦฐ ฤ‘แบฟn cแปงa bแบกn. Email cรณ hiแป‡u lแปฑc trong 24 giแป. Vui lรฒng ฤ‘ฤƒng nhแบญp vร o email cแปงa bแบกn vร  nhแบฅp vร o liรชn kแบฟt trong email ฤ‘แปƒ kรญch hoแบกt tร i khoแบฃn.', - - 'user.register-result.back-home': 'Quay lแบกi trang chแปง', - - 'user.register-result.view-mailbox': 'Xem email', - - 'user.email.required': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ email cแปงa bแบกn!', - - 'user.email.wrong-format': 'ฤแป‹nh dแบกng ฤ‘แป‹a chแป‰ email khรดng chรญnh xรกc!', - - 'user.userName.required': 'Vui lรฒng nhแบญp tรชn ngฦฐแปi dรนng hoแบทc ฤ‘แป‹a chแป‰ email cแปงa bแบกn', - -'user.password.required': 'Vui lรฒng nhแบญp mแบญt khแบฉu cแปงa bแบกn!', - -'user.password.twice.msg': 'Hai mแบญt khแบฉu khรดng khแป›p!', - -'user.password.strength.msg': 'Mแบญt khแบฉu khรดng ฤ‘แปง mแบกnh', - -'user.password.strength.strong': 'ฤแป™ mแบกnh: Mแบกnh', - -'user.password.strength.medium': 'ฤแป™ mแบกnh: Trung bรฌnh', - -'user.password.strength.low': 'ฤแป™ mแบกnh: Yแบฟu', - -'user.password.strength.short': 'ฤแป™ mแบกnh: Quรก ngแบฏn', - -'user.confirm-password.required': 'Vui lรฒng xรกc nhแบญn mแบญt khแบฉu cแปงa bแบกn!', - -'user.phone-number.required': 'Vui lรฒng nhแบญp sแป‘ ฤ‘iแป‡n thoแบกi hแปฃp lแป‡', - -'user.phone-number.wrong-format': 'ฤแป‹nh dแบกng sแป‘ ฤ‘iแป‡n thoแบกi khรดng chรญnh xรกc!', - -'user.verification-code.required': 'Vui lรฒng nhแบญp mรฃ xรกc minh!', - -'user.captcha.required': 'Vui lรฒng nhแบญp mรฃ xรกc minh hรฌnh แบฃnh!', - -'user.login.infos': 'QuantDinger lร  cรดng cแปฅ phรขn tรญch cแป• phiแบฟu ฤ‘a tรกc nhรขn AI vร  khรดng cรณ chแปฉng chแป‰ tฦฐ vแบฅn ฤ‘แบงu tฦฐ chแปฉng khoรกn. Tแบฅt cแบฃ kแบฟt quแบฃ phรขn tรญch, xแบฟp hแบกng vร  รฝ kiแบฟn โ€‹โ€‹tham khแบฃo trรชn nแปn tแบฃng ฤ‘แปu ฤ‘ฦฐแปฃc AI tแปฑ ฤ‘แป™ng tแบกo ra dแปฑa trรชn dแปฏ liแป‡u lแป‹ch sแปญ vร  chแป‰ dร nh cho mแปฅc ฤ‘รญch hแปc tแบญp, nghiรชn cแปฉu vร  trao ฤ‘แป•i kแปน thuแบญt. Chรบng khรดng cแบฅu thร nh bแบฅt kแปณ lแปi khuyรชn ฤ‘แบงu tฦฐ hoแบทc cฦก sแปŸ ra quyแบฟt ฤ‘แป‹nh nร o. ฤแบงu tฦฐ cแป• phiแบฟu tiแปm แบฉn nhiแปu rแปงi ro nhฦฐ rแปงi ro thแป‹ trฦฐแปng, rแปงi ro thanh khoแบฃn vร  rแปงi ro chรญnh sรกch, cรณ thแปƒ dแบซn ฤ‘แบฟn mแบฅt vแป‘n gแป‘c. Ngฦฐแปi dรนng nรชn ฤ‘ฦฐa ra quyแบฟt ฤ‘แป‹nh ฤ‘แป™c lแบญp dแปฑa trรชn khแบฃ nฤƒng chแบฅp nhแบญn rแปงi ro cแปงa mรฌnh, vร  mแปi hร nh vi ฤ‘แบงu tฦฐ vร  hแบญu quแบฃ phรกt sinh tแปซ viแป‡c sแปญ dแปฅng cรดng cแปฅ nร y ฤ‘แปu do ngฦฐแปi dรนng chแป‹u trรกch nhiแป‡m. Thแป‹ trฦฐแปng ฤ‘แบงy rแปงi ro, vร  ฤ‘แบงu tฦฐ cแบงn thแบญn trแปng.', - -'user.login.tab-login-web3': 'ฤฤƒng nhแบญp Web3', - -'user.login.web3.tip': 'ฤฤƒng nhแบญp bแบฑng vรญ ฤ‘แปƒ xรกc thแปฑc chแปฏ kรฝ', - -'user.login.web3.connect': 'Kแบฟt nแป‘i vรญ vร  ฤ‘ฤƒng nhแบญp', - -'user.login.web3.no-wallet': 'Khรดng phรกt hiแป‡n vรญ', - -'user.login.web3.no-address': 'Khรดng lแบฅy ฤ‘ฦฐแปฃc ฤ‘แป‹a chแป‰ vรญ', - -'user.login.web3.nonce-failed': 'Khรดng thแปƒ lแบฅy sแป‘ ngแบซu nhiรชn', - -'user.login.web3.verify-failed': 'Xรกc thแปฑc chแปฏ kรฝ thแบฅt bแบกi', - -'user.login.web3.success': 'ฤฤƒng nhแบญp thร nh cรดng', - -'user.login.web3.failed': 'ฤฤƒng nhแบญp vรญ thแบฅt bแบกi', - -'nav.no_wallet': 'Vรญ khรดng ฤ‘ฦฐแปฃc tรฌm thแบฅy ฤ‘รฃ phรกt hiแป‡n', - -'nav.copy': 'Sao chรฉp', - -'nav.copy_success': 'Sao chรฉp thร nh cรดng', - -'user.login.oauth.google': 'ฤฤƒng nhแบญp bแบฑng Google', - -'user.login.oauth.github': 'ฤฤƒng nhแบญp bแบฑng GitHub', - -'user.login.oauth.loading': 'ฤang chuyแปƒn hฦฐแป›ng ฤ‘แบฟn trang xรกc thแปฑc...', - -'user.login.oauth.failed': 'ฤฤƒng nhแบญp OAuth thแบฅt bแบกi', - -'user.login.oauth.get-url-failed': 'Khรดng thแปƒ lแบฅy liรชn kแบฟt xรกc thแปฑc', - -'user.login.subtitle': 'Thรดng tin chi tiแบฟt ฤ‘แป‹nh lฦฐแปฃng vแป thแป‹ trฦฐแปng toร n cแบงu', - -'user.login.legal.title': 'Tuyรชn bแป‘ phรกp lรฝ', - -'user.login.legal.view': 'Xem tuyรชn bแป‘ phรกp lรฝ', - -'user.login.legal.collapse': 'Thu gแปn Tuyรชn bแป‘ phรกp lรฝ', - -'user.login.legal.agree': 'Tรดi ฤ‘รฃ ฤ‘แปc vร  ฤ‘แป“ng รฝ vแป›i tuyรชn bแป‘ phรกp lรฝ', - -'user.login.legal.required': 'Vui lรฒng ฤ‘แปc vร  kiแปƒm tra tuyรชn bแป‘ phรกp lรฝ trฦฐแป›c', - -'user.login.legal.content': 'QuantDinger lร  cรดng cแปฅ phรขn tรญch cแป• phiแบฟu ฤ‘a tรกc nhรขn AI vร  khรดng cรณ bแบฑng cแบฅp tฦฐ vแบฅn ฤ‘แบงu tฦฐ chแปฉng khoรกn. Tแบฅt cแบฃ kแบฟt quแบฃ phรขn tรญch, xแบฟp hแบกng vร  รฝ kiแบฟn โ€‹โ€‹tham khแบฃo trรชn nแปn tแบฃng ฤ‘แปu ฤ‘ฦฐแปฃc AI tแปฑ ฤ‘แป™ng tแบกo ra dแปฑa trรชn dแปฏ liแป‡u lแป‹ch sแปญ vร  chแป‰ dร nh cho mแปฅc ฤ‘รญch hแปc tแบญp, nghiรชn cแปฉu vร  trao ฤ‘แป•i kแปน thuแบญt, vร  khรดng cแบฅu thร nh bแบฅt kแปณ lแปi khuyรชn ฤ‘แบงu tฦฐ hoแบทc cฦก sแปŸ ra quyแบฟt ฤ‘แป‹nh nร o. ฤแบงu tฦฐ cแป• phiแบฟu tiแปm แบฉn nhiแปu rแปงi ro nhฦฐ rแปงi ro thแป‹ trฦฐแปng, rแปงi ro thanh khoแบฃn vร  rแปงi ro chรญnh sรกch, cรณ thแปƒ dแบซn ฤ‘แบฟn mแบฅt vแป‘n gแป‘c. Ngฦฐแปi dรนng nรชn ฤ‘ฦฐa ra quyแบฟt ฤ‘แป‹nh ฤ‘แป™c lแบญp dแปฑa trรชn khแบฃ nฤƒng chแบฅp nhแบญn rแปงi ro cแปงa mรฌnh, vร  mแปi hร nh vi ฤ‘แบงu tฦฐ vร  hแบญu quแบฃ phรกt sinh tแปซ viแป‡c sแปญ dแปฅng cรดng cแปฅ nร y sแบฝ do ngฦฐแปi dรนng chแป‹u trรกch nhiแป‡m. Thแป‹ trฦฐแปng ฤ‘แบงy rแปงi ro, vร  ฤ‘แบงu tฦฐ cแบงn thแบญn trแปng.', - -'user.login.privacy.title': 'ฤiแปu khoแบฃn Quyแปn riรชng tฦฐ Ngฦฐแปi dรนng', - -'user.login.privacy.view': 'Xem ฤiแปu khoแบฃn Quyแปn riรชng tฦฐ Ngฦฐแปi dรนng', - -'user.login.privacy.collapse': 'Thu gแปn ฤiแปu khoแบฃn Quyแปn riรชng tฦฐ Ngฦฐแปi dรนng', - -'user.login.privacy.content': 'Chรบng tรดi coi trแปng quyแปn riรชng tฦฐ vร  viแป‡c bแบฃo vแป‡ dแปฏ liแป‡u cแปงa bแบกn. 1) Phแบกm vi Thu thแบญp: Chรบng tรดi chแป‰ thu thแบญp thรดng tin cแบงn thiแบฟt ฤ‘แปƒ thแปฑc hiแป‡n cรกc chแปฉc nฤƒng (chแบณng hแบกn nhฦฐ email, sแป‘ ฤ‘iแป‡n thoแบกi di ฤ‘แป™ng, mรฃ vรนng, ฤ‘แป‹a chแป‰ vรญ Web3) vร  nhแบญt kรฝ cแบงn thiแบฟt cลฉng nhฦฐ thรดng tin thiแบฟt bแป‹. 2) Mแปฅc ฤ‘รญch Sแปญ dแปฅng: ฤแปƒ ฤ‘ฤƒng nhแบญp tร i khoแบฃn vร  xรกc minh bแบฃo mแบญt, cung cแบฅp chแปฉc nฤƒng dแป‹ch vแปฅ, khแบฏc phแปฅc sแปฑ cแป‘ vร  tuรขn thแปง cรกc yรชu cแบงu. 3) Lฦฐu trแปฏ vร  Bแบฃo mแบญt: Dแปฏ liแป‡u ฤ‘ฦฐแปฃc lฦฐu trแปฏ mรฃ hรณa vร  cรกc biแป‡n phรกp kiแปƒm soรกt quyแปn vร  truy cแบญp cแบงn thiแบฟt ฤ‘ฦฐแปฃc thแปฑc hiแป‡n ฤ‘แปƒ ngฤƒn chแบทn truy cแบญp trรกi phรฉp, tiแบฟt lแป™ hoแบทc mแบฅt mรกt. 4) Chia sแบป vร  Bรชn thแปฉ ba: Ngoแบกi trแปซ trฦฐแปng hแปฃp ฤ‘ฦฐแปฃc yรชu cแบงu bแปŸi luแบญt vร  quy ฤ‘แป‹nh hoแบทc cแบงn thiแบฟt ฤ‘แปƒ thแปฑc hiแป‡n dแป‹ch vแปฅ, chรบng tรดi sแบฝ khรดng chia sแบป thรดng tin cรก nhรขn cแปงa bแบกn vแป›i bรชn thแปฉ ba; Nแบฟu cรณ sแปฑ tham gia cแปงa cรกc dแป‹ch vแปฅ bรชn thแปฉ ba (chแบณng hแบกn nhฦฐ vรญ ฤ‘iแป‡n tแปญ, nhร  cung cแบฅp dแป‹ch vแปฅ SMS), dแปฏ liแป‡u sแบฝ chแป‰ ฤ‘ฦฐแปฃc xแปญ lรฝ แปŸ mแปฉc tแป‘i thiแปƒu cแบงn thiแบฟt ฤ‘แปƒ thแปฑc hiแป‡n cรกc chแปฉc nฤƒng. 5) Cookie/Bแป™ nhแป› cแปฅc bแป™: ฤฦฐแปฃc sแปญ dแปฅng ฤ‘แปƒ xรกc thแปฑc trแบกng thรกi ฤ‘ฤƒng nhแบญp vร  duy trรฌ phiรชn lร m viแป‡c cแบงn thiแบฟt (chแบณng hแบกn nhฦฐ mรฃ thรดng bรกo, PHPSESSID). Bแบกn cรณ thแปƒ xรณa hoแบทc hแบกn chแบฟ chรบng trong trรฌnh duyแป‡t cแปงa mรฌnh. 6) Quyแปn cรก nhรขn: Bแบกn cรณ thแปƒ thแปฑc hiแป‡n cรกc quyแปn cแปงa mรฌnh ฤ‘แปƒ yรชu cแบงu, sแปญa ฤ‘แป•i, xรณa vร  rรบt lแบกi sแปฑ ฤ‘แป“ng รฝ theo luแบญt vร  quy ฤ‘แป‹nh hiแป‡n hร nh. 7) Thay ฤ‘แป•i vร  Thรดng bรกo: Cรกc bแบฃn cแบญp nhแบญt cho cรกc ฤ‘iแปu khoแบฃn nร y sแบฝ ฤ‘ฦฐแปฃc hiแปƒn thแป‹ rรต rร ng trรชn trang. Viแป‡c tiแบฟp tแปฅc sแปญ dแปฅng dแป‹ch vแปฅ nร y cho thแบฅy bแบกn ฤ‘รฃ ฤ‘แปc vร  ฤ‘แป“ng รฝ vแป›i nแป™i dung ฤ‘ฦฐแปฃc cแบญp nhแบญt. Nแบฟu bแบกn khรดng ฤ‘แป“ng รฝ vแป›i cรกc ฤ‘iแปu khoแบฃn nร y hoแบทc bแบฅt kแปณ bแบฃn cแบญp nhแบญt nร o trong ฤ‘รณ, vui lรฒng ngแปซng sแปญ dแปฅng dแป‹ch vแปฅ nร y vร  liรชn hแป‡ vแป›i chรบng tรดi. ', - -'account.basicInfo': 'Thรดng tin cฦก bแบฃn', - -'account.id': 'ID ngฦฐแปi dรนng', - -'account.username': 'Tรชn ngฦฐแปi dรนng', - -'account.nickname': 'Biแป‡t danh', - -'account.email': 'Email', - -'account.mobile': 'Sแป‘ ฤ‘iแป‡n thoแบกi', - -'account.web3address': 'ฤแป‹a chแป‰ vรญ', - -'account.pid': 'ID ngฦฐแปi giแป›i thiแป‡u', - -'account.level': 'Cแบฅp ฤ‘แป™ ngฦฐแปi dรนng', - -'account.money': 'Sแป‘ dฦฐ', - -'account.qdtBalance': 'Sแป‘ dฦฐ QDT', - -'account.score': 'ฤiแปƒm', - -'account.createtime': 'Thแปi gian ฤ‘ฤƒng kรฝ', - -'account.inviteLink': 'Liรชn kแบฟt mแปi', - -'account.recharge': 'Nแบกp tiแปn', - -'account.rechargeTip': 'Mรฃ QR bรชn dฦฐแป›i ฤ‘แปƒ nแบกp tiแปn bแบฑng WeChat hoแบทc Alipay', - -'account.qrCodePlaceholder': 'Mรฃ QR giแบฃ lแบญp', - -'account.rechargeAmount': 'Sแป‘ tiแปn cแบงn nแบกp', - -'account.enterAmount': 'Vui lรฒng nhแบญp sแป‘ tiแปn cแบงn nแบกp', - -'account.rechargeHint': 'Sแป‘ tiแปn nแบกp tแป‘i thiแปƒu: 1 QDT', - -'account.confirmRecharge': 'Xรกc nhแบญn nแบกp tiแปn', - -'account.enterValidAmount': 'Vui lรฒng nhแบญp sแป‘ tiแปn hแปฃp lแป‡', - -'account.rechargeSuccess': 'Nแบกp tiแปn thร nh cรดng! Sแป‘ tiแปn {amount} QDT ฤ‘รฃ ฤ‘ฦฐแปฃc nแบกp', - -'account.settings.menuMap.basic': 'Cร i ฤ‘แบทt cฦก bแบฃn', - -'account.settings.menuMap.security': 'Cร i ฤ‘แบทt bแบฃo mแบญt', - -'account.settings.menuMap.notification': 'Thรดng bรกo tin nhแบฏn mแป›i', - -'account.settings.menuMap.moneyLog': 'Chi tiแบฟt quแปน', - -'account.moneyLog.empty': 'Khรดng cรณ chi tiแบฟt quแปน', - -'account.moneyLog.total': 'Tแป•ng sแป‘ {total} giao dแป‹ch', - -'account.moneyLog.type.purchase': 'Hแบกn mแปฉc mua hร ng', - -'account.moneyLog.type.recharge': 'Nแบกp tiแปn', - -'account.moneyLog.type.refund': 'Hoร n tiแปn', - -'account.moneyLog.type.reward': 'ThฦฐแปŸng', - -'account.moneyLog.type.income': 'Thu nhแบญp Cรกc chแป‰ bรกo', - -'account.moneyLog.type.commission': 'Phรญ nแปn tแบฃng', - -'wallet.balance': 'Sแป‘ dฦฐ QDT', - -'wallet.recharge': 'Nแบกp tiแปn', - -'wallet.withdraw': 'Rรบt tiแปn', - -'wallet.filter': 'Lแปc', - -'wallet.reset': 'ฤแบทt lแบกi', - -'wallet.totalRecharge': 'Tแป•ng sแป‘ tiแปn nแบกp', - -'wallet.totalWithdraw': 'Tแป•ng sแป‘ tiแปn rรบt', - -'wallet.totalIncome': 'Tแป•ng sแป‘ tiแปn thu nhแบญp', - -'wallet.records': 'Lแป‹ch sแปญ giao dแป‹ch vร  chi tiแบฟt quแปน', - -'wallet.tradingRecords': 'Lแป‹ch sแปญ giao dแป‹ch', - -'wallet.moneyLog': 'Chi tiแบฟt quแปน', - -'wallet.rechargeTip': 'Vui lรฒng quรฉt mรฃ QR bรชn dฦฐแป›i bแบฑng WeChat hoแบทc Alipay ฤ‘แปƒ nแบกp tiแปn', - -'wallet.qrCodePlaceholder': 'Mรฃ QR (mรด phแปng)', - -'wallet.rechargeAmount': 'Sแป‘ tiแปn cแบงn nแบกp', - -'wallet.enterAmount': 'Vui lรฒng nhแบญp sแป‘ tiแปn cแบงn nแบกp', - -'wallet.rechargeHint': 'Sแป‘ tiแปn nแบกp tแป‘i thiแปƒu: 1 QDT', - -'wallet.confirmRecharge': 'Xรกc nhแบญn nแบกp tiแปn', - -'wallet.enterValidAmount': 'Vui lรฒng nhแบญp sแป‘ tiแปn hแปฃp lแป‡', - -'wallet.rechargeSuccess': 'Nแบกp tiแปn thร nh cรดng! ฤรฃ thanh toรกn {amount} QDT', - -'wallet.rechargeFailed': 'Giao dแป‹ch thแบฅt bแบกi', - -'wallet.withdrawTip': 'Vui lรฒng nhแบญp sแป‘ tiแปn rรบt vร  ฤ‘แป‹a chแป‰ rรบt tiแปn', - -'wallet.withdrawAmount': 'Sแป‘ tiแปn rรบt', - -'wallet.enterWithdrawAmount': 'Vui lรฒng nhแบญp sแป‘ tiแปn rรบt', - -'wallet.withdrawHint': 'Sแป‘ tiแปn rรบt tแป‘i thiแปƒu: 1 QDT', - -'wallet.withdrawAddress': 'ฤแป‹a chแป‰ rรบt tiแปn (tรนy chแปn)', - -'wallet.enterWithdrawAddress': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ rรบt tiแปn', - -'wallet.confirmWithdraw': 'Xรกc nhแบญn rรบt tiแปn', - -'wallet.enterValidWithdrawAmount': 'Vui lรฒng nhแบญp sแป‘ tiแปn rรบt hแปฃp lแป‡', - -'wallet.insufficientBalance': 'Sแป‘ dฦฐ khรดng ฤ‘แปง', - -'wallet.withdrawSuccess': 'Rรบt tiแปn thร nh cรดng! Sแป‘ tiแปn {amount} QDT ฤ‘รฃ rรบt', - -'wallet.withdrawFailed': 'Giao dแป‹ch rรบt tiแปn thแบฅt bแบกi', - -'wallet.noTradingRecords': 'Khรดng cรณ bแบฃn ghi giao dแป‹ch nร o', - -'wallet.noMoneyLog': 'Khรดng cรณ chi tiแบฟt giao dแป‹ch', - -'wallet.loadTradingRecordsFailed': 'Khรดng thแปƒ tแบฃi bแบฃn ghi giao dแป‹ch', - -'wallet.loadMoneyLogFailed': 'Khรดng thแปƒ tแบฃi chi tiแบฟt giao dแป‹ch', - -'wallet.moneyLogTotal': 'Tแป•ng sแป‘ {total} bแบฃn ghi', - -'wallet.moneyLogTypeTitle': 'Loแบกi', - -'wallet.moneyLogType.all': 'Tแบฅt cแบฃ cรกc loแบกi', - -'wallet.table.time': 'Thแปi gian', - -'wallet.table.type': 'Loแบกi', - -'wallet.table.price': 'Giรก', - -'wallet.table.amount': 'Sแป‘ lฦฐแปฃng', - -'wallet.table.money': 'Sแป‘ tiแปn', - -'wallet.table.balance': 'Sแป‘ dฦฐ', - -'wallet.table.memo': 'Ghi chรบ', - -'wallet.table.value': 'Giรก trแป‹', - -'wallet.table.profit': 'Lแปฃi nhuแบญn/Thua lแป—', - -'wallet.table.commission': 'Hoa hแป“ng', - -'wallet.table.total': 'Tแป•ng sแป‘ {total} bแบฃn ghi', - -'wallet.tradeType.buy': 'Mua', - -'wallet.tradeType.sell': 'Bรกn', - -'wallet.tradeType.liquidation': 'Thanh lรฝ', - -'wallet.tradeType.openLong': 'MแปŸ lแป‡nh mua', - -'wallet.tradeType.addLong': 'Thรชm lแป‡nh mua', - -'wallet.tradeType.closeLong': 'ฤรณng lแป‡nh mua', - -'wallet.tradeType.closeLongStop': 'ฤรณng lแป‡nh mua vร  cแบฏt lแป—', - -'wallet.tradeType.closeLongProfit': 'Chแป‘t lแปi vร  ฤ‘รณng lแป‡nh mua', -'wallet.tradeType.openShort': 'MแปŸ vแป‹ thแบฟ bรกn khแป‘ng', - -'wallet.tradeType.addShort': 'Thรชm vแป‹ thแบฟ bรกn khแป‘ng', - -'wallet.tradeType.closeShort': 'ฤรณng vแป‹ thแบฟ bรกn khแป‘ng', - -'wallet.tradeType.closeShortStop': 'ฤรณng vแป‹ thแบฟ bรกn khแป‘ng vแป›i lแป‡nh dแปซng lแป—', - -'wallet.tradeType.closeShortProfit': 'Chแป‘t lแปi vร  ฤ‘รณng vแป‹ thแบฟ bรกn khแป‘ng', - -'wallet.moneyLogType.purchase': 'Chแป‰ bรกo mua', - -'wallet.moneyLogType.recharge': 'Nแบกp tiแปn', - -'wallet.moneyLogType.withdraw': 'Rรบt tiแปn mแบทt', - -'wallet.moneyLogType.refund': 'Hoร n tiแปn', - -'wallet.moneyLogType.reward': 'ThฦฐแปŸng', - -'wallet.moneyLogType.income': 'Thu nhแบญp', - -'wallet.moneyLogType.commission': 'Phรญ giao dแป‹ch', - -'wallet.web3Address.required': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ vรญ Web3 cแปงa bแบกn trฦฐแป›c', - -'wallet.web3Address.requiredDescription': 'Bแบกn cแบงn liรชn kแบฟt ฤ‘แป‹a chแป‰ vรญ Web3 cแปงa mรฌnh trฦฐแป›c khi gแปญi tiแปn ฤ‘แปƒ nhแบญn tiแปn gแปญi', - -'wallet.web3Address.placeholder': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ vรญ Web3 cแปงa bแบกn (bแบฏt ฤ‘แบงu bแบฑng 0x)', - -'wallet.web3Address.save': 'Lฦฐu ฤ‘แป‹a chแป‰ vรญ', - -'wallet.web3Address.saveSuccess': 'ฤแป‹a chแป‰ vรญ ฤ‘รฃ ฤ‘ฦฐแปฃc lฦฐu thร nh cรดng', - -'wallet.web3Address.saveFailed': 'Khรดng thแปƒ lฦฐu ฤ‘แป‹a chแป‰ vรญ', - -'wallet.web3Address.invalidFormat': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ vรญ Web3 hแปฃp lแป‡ (ฤ‘แป‹nh dแบกng Ethereum: 42 kรฝ tแปฑ bแบฏt ฤ‘แบงu bแบฑng 0x, hoแบทc TRC20) ฤแป‹nh dแบกng: 34 kรฝ tแปฑ bแบฏt ฤ‘แบงu bแบฑng T)', - -'wallet.selectCoin': 'Chแปn loแบกi tiแปn ฤ‘iแป‡n tแปญ', - -'wallet.selectChain': 'Chแปn chuแป—i khแป‘i', - -'wallet.chain.eth': 'ETH (ERC20)', - -'wallet.chain.trc20': 'TRC20', - -'wallet.chain.bsc': 'BSC', - -'wallet.targetQdtAmount': 'Sแป‘ lฦฐแปฃng QDT bแบกn muแป‘n ฤ‘แป•i (tรนy chแปn)', - -'wallet.targetQdtAmount.placeholder': 'Vui lรฒng nhแบญp sแป‘ lฦฐแปฃng QDT bแบกn muแป‘n ฤ‘แป•i, giรก QDT hiแป‡n tแบกi: {price} USDT', - -'wallet.targetQdtAmount.requiredUsdt': 'Sแป‘ tiแปn cแบงn nแบกp: {amount} USDT', - -'wallet.rechargeAddress': 'ฤแป‹a chแป‰ nแบกp tiแปn', - -'wallet.copyAddress': 'Sao chรฉp', - -'wallet.copySuccess': 'Sao chรฉp thร nh cรดng!', - -'wallet.copyFailed': 'Sao chรฉp thแบฅt bแบกi, vui lรฒng sao chรฉp thแปง cรดng', - -'wallet.rechargeAddressHint': 'Vui lรฒng ฤ‘แบฃm bแบฃo bแบกn sแปญ dแปฅng chuแป—i {chain} ฤ‘แปƒ gแปญi {coin} vร o ฤ‘แป‹a chแป‰ nร y', - -'wallet.qdtPrice.loading': 'ฤang tแบฃi...', - -'wallet.rechargeTip.new': 'Vui lรฒng chแปn loแบกi tiแปn tแป‡ vร  chuแป—i, sau ฤ‘รณ quรฉt mรฃ QR bรชn dฦฐแป›i ฤ‘แปƒ gแปญi tiแปn', - -'wallet.exchangeRate': '1 QDT โ‰ˆ {rate} USDT', - -'wallet.withdrawableAmount': 'Sแป‘ tiแปn cรณ thแปƒ rรบt', - -'wallet.totalBalance': 'Tแป•ng sแป‘ dฦฐ', - -'wallet.insufficientWithdrawable': 'Sแป‘ tiแปn cรณ thแปƒ rรบt khรดng ฤ‘แปง, hiแป‡n tแบกi chแป‰ cรณ thแปƒ rรบt: {amount} QDT', - -'wallet.withdrawAddressRequired': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ rรบt tiแปn ฤ‘แป‹a chแป‰', -'wallet.withdrawAddressHint': 'Vui lรฒng ฤ‘แบฃm bแบฃo ฤ‘แป‹a chแป‰ chรญnh xรกc; khรดng thแปƒ hแปงy bแป giao dแป‹ch rรบt tiแปn sau khi ฤ‘รฃ gแปญi', - -'wallet.withdrawSubmitSuccess': 'Yรชu cแบงu rรบt tiแปn ฤ‘รฃ ฤ‘ฦฐแปฃc gแปญi thร nh cรดng; Vui lรฒng chแป xem xรฉt', - -'menu.footer.contactUs': 'Liรชn hแป‡ vแป›i chรบng tรดi', - -'menu.footer.getSupport': 'Nhแบญn hแป— trแปฃ', - -'menu.footer.socialAccounts': 'Tร i khoแบฃn mแบกng xรฃ hแป™i', - -'menu.footer.userAgreement': 'Thแปa thuแบญn ngฦฐแปi dรนng', - -'menu.footer.privacyPolicy': 'Chรญnh sรกch bแบฃo mแบญt', - -'menu.footer.support': 'Hแป— trแปฃ', - -'menu.footer.featureRequest': 'Yรชu cแบงu tรญnh nฤƒng', - -'menu.footer.email': 'Email', - -'menu.footer.liveChat': 'Trรฒ chuyแป‡n trแปฑc tuyแบฟn 24/7', - -'dashboard.analysis.title': 'Phรขn tรญch ฤ‘a chiแปu', - -'dashboard.analysis.subtitle': 'Phรขn tรญch tร i chรญnh toร n diแป‡n dแปฑa trรชn AI Nแปn tแบฃng', - -'dashboard.analysis.selectSymbol': 'Chแปn hoแบทc nhแบญp mรฃ chแปฉng khoรกn', - -'dashboard.analysis.selectModel': 'Chแปn mรด hรฌnh', - -'dashboard.analysis.startAnalysis': 'Bแบฏt โ€‹โ€‹ฤ‘แบงu phรขn tรญch', - -'dashboard.analysis.history': 'Lแป‹ch sแปญ', - -'dashboard.analysis.tab.overview': 'Phรขn tรญch toร n diแป‡n', - -'dashboard.analysis.tab.fundamental': 'Cรกc yแบฟu tแป‘ cฦก bแบฃn', - -'dashboard.analysis.tab.technical': 'Phรขn tรญch kแปน thuแบญt', - -'dashboard.analysis.tab.news': 'Tin tแปฉc', - -'dashboard.analysis.tab.sentiment': 'Tรขm lรฝ thแป‹ trฦฐแปng', - -'dashboard.analysis.tab.risk': 'Rแปงi ro', - -'dashboard.analysis.tab.debate': 'Tฤƒng/Giแบฃm giรก', -'dashboard.analysis.tab.decision': 'Quyแบฟt ฤ‘แป‹nh cuแป‘i cรนng', - -'dashboard.analysis.empty.selectSymbol': 'Chแปn mแปฅc tiรชu ฤ‘แปƒ bแบฏt ฤ‘แบงu phรขn tรญch', - -'dashboard.analysis.empty.selectSymbolDesc': 'Chแปn mแปฅc tiรชu tแปซ danh sรกch theo dรตi cแปงa bแบกn hoแบทc nhแบญp mรฃ cแปงa nรณ ฤ‘แปƒ nhแบญn bรกo cรกo phรขn tรญch AI ฤ‘a chiแปu', - -'dashboard.analysis.empty.startAnalysis': 'Nhแบฅp vร o nรบt "Bแบฏt ฤ‘แบงu phรขn tรญch" ฤ‘แปƒ phรขn tรญch ฤ‘a chiแปu', - -'dashboard.analysis.empty.startAnalysisDesc': 'Chรบng tรดi sแบฝ cung cแบฅp cho bแบกn phรขn tรญch toร n diแป‡n tแปซ nhiแปu khรญa cแบกnh bao gแป“m cฦก bแบฃn, kแปน thuแบญt, tin tแปฉc, tรขm lรฝ vร  rแปงi ro', - -'dashboard.analysis.empty.noData': 'Khรดng cรณ dแปฏ liแป‡u phรขn tรญch cho {type}, vui lรฒng thแปฑc hiแป‡n phรขn tรญch toร n diแป‡n trฦฐแป›c', - -'dashboard.analysis.empty.noWatchlist': 'Khรดng cรณ danh sรกch theo dรตi cรณ sแบตn', - -'dashboard.analysis.empty.noHistory': 'Khรดng cรณ dแปฏ liแป‡u lแป‹ch sแปญ', - -'dashboard.analysis.empty.watchlistHint': 'Khรดng cรณ danh sรกch theo dรตi, vui lรฒng thแปฑc hiแป‡n phรขn tรญch toร n diแป‡n trฦฐแป›c', - -'dashboard.analysis.empty.noDebateData': 'Khรดng cรณ dแปฏ liแป‡u tranh luแบญn', - -'dashboard.analysis.empty.noDecisionData': 'Khรดng cรณ dแปฏ liแป‡u quyแบฟt ฤ‘แป‹nh', - -'dashboard.analysis.empty.selectAgent': 'Vui lรฒng chแปn mแป™t ฤแบกi lรฝ ฤ‘แปƒ xem kแบฟt quแบฃ phรขn tรญch', - -'dashboard.analysis.loading.analyzing': 'ฤang phรขn tรญch, vui lรฒng chแป...', - -'dashboard.analysis.loading.fundamental': 'ฤang phรขn tรญch dแปฏ liแป‡u cฦก bแบฃn...', - -'dashboard.analysis.loading.technical': 'ฤang phรขn tรญch cรกc chแป‰ bรกo kแปน thuแบญt...', - -'dashboard.analysis.loading.news': 'ฤang phรขn tรญch dแปฏ liแป‡u tin tแปฉc...', - -'dashboard.analysis.loading.sentiment': 'Phรขn tรญch tรขm lรฝ thแป‹ trฦฐแปng...', - -'dashboard.analysis.loading.risk': 'ฤรกnh giรก rแปงi ro...', - -'dashboard.analysis.loading.debate': 'Cuแป™c tranh luแบญn ฤ‘ang diแป…n ra giแปฏa phe tฤƒng giรก vร  phe giแบฃm giรก...', - -'dashboard.analysis.loading.decision': 'ฤฦฐa ra quyแบฟt ฤ‘แป‹nh cuแป‘i cรนng...', - -'dashboard.analysis.score.overall': 'ฤiแปƒm tแป•ng thแปƒ', - -'dashboard.analysis.score.recommendation': 'Lแปi khuyรชn ฤ‘แบงu tฦฐ', - -'dashboard.analysis.score.confidence': 'Mแปฉc ฤ‘แป™ tin cแบญy', - -'dashboard.analysis.dimension.fundamental': 'cรกc yแบฟu tแป‘ cฦก bแบฃn', - -'dashboard.analysis.dimension.technical': 'cรกc yแบฟu tแป‘ kแปน thuแบญt', - -'dashboard.analysis.dimension.news': 'tin tแปฉc', - -'dashboard.analysis.dimension.sentiment': 'tรขm lรฝ', - -'dashboard.analysis.dimension.risk': 'rแปงi ro', - -'dashboard.analysis.card.dimensionScores': 'ฤ‘iแปƒm sแป‘ cho tแปซng yแบฟu tแป‘', - -'dashboard.analysis.card.overviewReport': 'bรกo cรกo tแป•ng quan', - -'dashboard.analysis.card.financialMetrics': 'cรกc chแป‰ sแป‘ tร i chรญnh', - -'dashboard.analysis.card.fundamentalReport': 'bรกo cรกo phรขn tรญch cฦก bแบฃn', - -'dashboard.analysis.card.technicalIndicators': 'Cรกc chแป‰ sแป‘ kแปน thuแบญt Cรกc chแป‰ bรกo', - -'dashboard.analysis.card.technicalReport': 'Bรกo cรกo phรขn tรญch kแปน thuแบญt', - -'dashboard.analysis.card.newsList': 'Tin tแปฉc liรชn quan', - -'dashboard.analysis.card.newsReport': 'Bรกo cรกo phรขn tรญch tin tแปฉc', - -'dashboard.analysis.card.sentimentIndicators': 'Cรกc chแป‰ bรกo tรขm lรฝ', - -'dashboard.analysis.card.sentimentReport': 'Bรกo cรกo phรขn tรญch tรขm lรฝ', - -'dashboard.analysis.card.riskMetrics': 'Cรกc chแป‰ bรกo rแปงi ro', - -'dashboard.analysis.card.riskReport': 'Bรกo cรกo ฤ‘รกnh giรก rแปงi ro', - -'dashboard.analysis.card.bullView': 'Quan ฤ‘iแปƒm lแบกc quan', - -'dashboard.analysis.card.bearView': 'Quan ฤ‘iแปƒm bi quan', - -'dashboard.analysis.card.researchConclusion': 'Kแบฟt luแบญn cแปงa nhร  nghiรชn cแปฉu', - -'dashboard.analysis.card.traderPlan': 'Kแบฟ hoแบกch giao dแป‹ch', - -'dashboard.analysis.card.riskDebate': 'Thแบฃo luแบญn cแปงa แปฆy ban Rแปงi ro', - -'dashboard.analysis.card.finalDecision': 'Quyแบฟt ฤ‘แป‹nh cuแป‘i cรนng', - -'dashboard.analysis.card.tradePlanDetail': 'Chi tiแบฟt kแบฟ hoแบกch giao dแป‹ch', - -'dashboard.analysis.tradingPlan.entry_price': 'Giรก vร o lแป‡nh', - -'dashboard.analysis.tradingPlan.position_size': 'Quy mรด vแป‹ thแบฟ', - -'dashboard.analysis.tradingPlan.stop_loss': 'Cแบฏt lแป—', - -'dashboard.analysis.tradingPlan.take_profit': 'Chแป‘t lแปi', - -'dashboard.analysis.label.confidence': 'Mแปฉc ฤ‘แป™ tแปฑ tin Mแปฉc ฤ‘แป™', - -'dashboard.analysis.label.keyPoints': 'ฤiแปƒm chรญnh', - -'dashboard.analysis.label.riskWarning': 'Cแบฃnh bรกo rแปงi ro', - -'dashboard.analysis.risk.risky': 'Quan ฤ‘iแปƒm rแปงi ro', - -'dashboard.analysis.risk.neutral': 'Quan ฤ‘iแปƒm trung lแบญp', - -'dashboard.analysis.risk.safe': 'Quan ฤ‘iแปƒm an toร n', - -'dashboard.analysis.risk.conclusion': 'Kแบฟt luแบญn', - -'dashboard.analysis.feature.fundamental': 'Phรขn tรญch cฦก bแบฃn', - -'dashboard.analysis.feature.technical': 'Phรขn tรญch kแปน thuแบญt', - -'dashboard.analysis.feature.news': 'Phรขn tรญch tin tแปฉc', - -'dashboard.analysis.feature.sentiment': 'Phรขn tรญch cแบฃm xรบc', - -'dashboard.analysis.feature.risk': 'Rแปงi ro ฤรกnh giรก', - -'dashboard.analysis.watchlist.title': 'Danh sรกch theo dรตi cแปงa tรดi', - -'dashboard.analysis.watchlist.add': 'Thรชm', - -'dashboard.analysis.watchlist.addStock': 'Thรชm cแป• phiแบฟu', - -'dashboard.analysis.modal.addStock.title': 'Thรชm vร o danh sรกch theo dรตi', - -'dashboard.analysis.modal.addStock.confirm': 'Xรกc nhแบญn', - -'dashboard.analysis.modal.addStock.cancel': 'Hแปงy', - -'dashboard.analysis.modal.addStock.market': 'Loแบกi thแป‹ trฦฐแปng', - -'dashboard.analysis.modal.addStock.marketPlaceholder': 'Vui lรฒng chแปn thแป‹ trฦฐแปng', - -'dashboard.analysis.modal.addStock.marketRequired': 'Vui lรฒng chแปn loแบกi thแป‹ trฦฐแปng', - -'dashboard.analysis.modal.addStock.symbol': 'Mรฃ chแปฉng khoรกn', - -'dashboard.analysis.modal.addStock.symbolPlaceholder': 'Vรญ dแปฅ: AAPL, TSLA, GOOGL, 000001, BTC', - -'dashboard.analysis.modal.addStock.symbolRequired': 'Vui lรฒng nhแบญp mรฃ chแปฉng khoรกn', - -'dashboard.analysis.modal.addStock.searchPlaceholder': 'Tรฌm kiแบฟm mรฃ chแปฉng khoรกn hoแบทc tรชn cแป• phiแบฟu', - -'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'Tรฌm kiแบฟm hoแบทc nhแบญp mรฃ chแปฉng khoรกn (vรญ dแปฅ: AAPL, BTC/USDT, EUR/USD)', - -'dashboard.analysis.modal.addStock.searchOrInputHint': 'Hแป— trแปฃ tรฌm kiแบฟm cแป• phiแบฟu trong cฦก sแปŸ dแปฏ liแป‡u hoแบทc nhแบญp trแปฑc tiแบฟp mรฃ (hแป‡ thแป‘ng sแบฝ tแปฑ ฤ‘แป™ng truy xuแบฅt tรชn)', - -'dashboard.analysis.modal.addStock.search': 'Tรฌm kiแบฟm', - -'dashboard.analysis.modal.addStock.searchResults': 'Kแบฟt quแบฃ tรฌm kiแบฟm', - -'dashboard.analysis.modal.addStock.hotSymbols': 'Cแป• phiแบฟu nรณng', - -'dashboard.analysis.modal.addStock.noHotSymbols': 'Khรดng cรณ cแป• phiแบฟu nรณng', - -'dashboard.analysis.modal.addStock.selectedSymbol': 'Cแป• phiแบฟu ฤ‘รฃ chแปn', - -'dashboard.analysis.modal.addStock.pleaseSelectSymbol': 'Vui lรฒng chแปn cแป• phiแบฟu trฦฐแป›c', - -'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': 'Vui lรฒng chแปn cแป• phiแบฟu hoแบทc nhแบญp mรฃ cแป• phiแบฟu', - -'dashboard.analysis.modal.addStock.pleaseEnterSymbol': 'Vui lรฒng nhแบญp mรฃ cแป• phiแบฟu', - -'dashboard.analysis.modal.addStock.pleaseSelectMarket': 'Vui lรฒng chแปn loแบกi thแป‹ trฦฐแปng', - -'dashboard.analysis.modal.addStock.searchFailed': 'Tรฌm kiแบฟm thแบฅt bแบกi, vui lรฒng thแปญ lแบกi sau', - -'dashboard.analysis.modal.addStock.noSearchResults': 'Khรดng tรฌm thแบฅy cแป• phiแบฟu phรน hแปฃp', - -'dashboard.analysis.modal.addStock.willAutoFetchName': 'Hแป‡ thแป‘ng sแบฝ tแปฑ ฤ‘แป™ng lแบฅy tรชn', - -'dashboard.analysis.modal.addStock.addDirectly': 'Thรชm trแปฑc tiแบฟp', - -'dashboard.analysis.modal.addStock.nameWillBeFetched': 'Tรชn sแบฝ ฤ‘ฦฐแปฃc tแปฑ ฤ‘แป™ng lแบฅy khi thรชm', - -'dashboard.analysis.market.USStock': 'Cแป• phiแบฟu Mแปน', - -'dashboard.analysis.market.Crypto': 'Tiแปn ฤ‘iแป‡n tแปญ', - -'dashboard.analysis.market.Forex': 'Ngoแบกi hแป‘i', - -'dashboard.analysis.market.Futures': 'Hแปฃp ฤ‘แป“ng tฦฐฦกng lai', - -'dashboard.analysis.modal.history.title': 'Lแป‹ch sแปญ phรขn tรญch', - -'dashboard.analysis.modal.history.viewResult': 'Xem kแบฟt quแบฃ', - -'dashboard.analysis.modal.history.completeTime': 'Thแปi gian hoร n thร nh', - -'dashboard.analysis.modal.history.error': 'Lแป—i', - -'dashboard.analysis.status.pending': 'ฤang chแป xแปญ lรฝ', - -'dashboard.analysis.status.processing': 'ฤang xแปญ lรฝ', - -'dashboard.analysis.status.completed': 'Hoร n thร nh', - -'dashboard.analysis.status.failed': 'Thแบฅt bแบกi', - -'dashboard.analysis.message.selectSymbol': 'Vui lรฒng chแปn mแปฅc tiรชu trฦฐแป›c', - -'dashboard.analysis.message.taskCreated': 'Tรกc vแปฅ phรขn tรญch ฤ‘รฃ ฤ‘ฦฐแปฃc tแบกo, ฤ‘ang thแปฑc thi trong nแปn...', - -'dashboard.analysis.message.analysisComplete': 'Phรขn tรญch ฤ‘รฃ hoร n tแบฅt', - -'dashboard.analysis.message.analysisCompleteCache': 'Phรขn tรญch ฤ‘รฃ hoร n tแบฅt (sแปญ dแปฅng dแปฏ liแป‡u ฤ‘ฦฐแปฃc lฦฐu trong bแป™ nhแป› cache)', - -'dashboard.analysis.message.analysisFailed': 'Phรขn tรญch thแบฅt bแบกi, vui lรฒng thแปญ lแบกi sau', - -'dashboard.analysis.message.addStockSuccess': 'ฤรฃ thรชm thร nh cรดng', - -'dashboard.analysis.message.addStockFailed': 'Thรชm thแบฅt bแบกi', - -'dashboard.analysis.message.removeStockSuccess': 'ฤรฃ xรณa thร nh cรดng', - -'dashboard.analysis.message.removeStockFailed': 'Xรณa thแบฅt bแบกi', - -'dashboard.analysis.message.resumingAnalysis': 'ฤang tiแบฟp tแปฅc tรกc vแปฅ phรขn tรญch...', - -'dashboard.analysis.message.deleteSuccess': 'ฤรฃ xรณa thร nh cรดng', - -'dashboard.analysis.message.deleteFailed': 'Xรณa thแบฅt bแบกi', - -'dashboard.analysis.modal.history.delete': 'Xรณa', - -'dashboard.analysis.modal.history.deleteConfirm': 'Bแบกn cรณ chแบฏc chแบฏn muแป‘n xรณa bแบฃn ghi phรขn tรญch nร y khรดng?', - -'dashboard.analysis.test': 'Cแปญa hร ng ฤ‘ฦฐแปng Gongzhuan {khรดng}', - -'dashboard.analysis.introduce': 'Mรด tแบฃ chแป‰ bรกo', - -'dashboard.analysis.total-sales': 'Tแป•ng doanh thu', - -'dashboard.analysis.day-sales': 'Doanh thu trung bรฌnh hร ng ngร y', - -'dashboard.analysis.visits': 'Lฦฐแปฃt truy cแบญp', - -'dashboard.analysis.visits-trend': 'Lฦฐแปฃt truy cแบญp xu hฦฐแป›ng', - -'dashboard.analysis.visits-ranking': 'Xแบฟp hแบกng lฦฐแปฃt truy cแบญp cแปญa hร ng', - -'dashboard.analysis.day-visits': 'Lฦฐแปฃt truy cแบญp hร ng ngร y', - -'dashboard.analysis.week': 'Lฦฐแปฃt truy cแบญp hร ng tuแบงn so vแป›i cรนng kแปณ nฤƒm trฦฐแป›c', - -'dashboard.analysis.day': 'Lฦฐแปฃt truy cแบญp hร ng ngร y so vแป›i cรนng kแปณ nฤƒm trฦฐแป›c', - -'dashboard.analysis.payments': 'Sแป‘ lฦฐแปฃng thanh toรกn', - -'dashboard.analysis.conversion-rate': 'Tแปท lแป‡ chuyแปƒn ฤ‘แป•i', - -'dashboard.analysis.operational-effect': 'Hiแป‡u quแบฃ hoแบกt ฤ‘แป™ng', - -'dashboard.analysis.sales-trend': 'Xu hฦฐแป›ng doanh sแป‘', - -'dashboard.analysis.sales-ranking': 'Xแบฟp hแบกng doanh sแป‘ cแปญa hร ng', - -'dashboard.analysis.all-year': 'Quanh nฤƒm', - -'dashboard.analysis.all-month': 'Thรกng nร y', - -'dashboard.analysis.all-week': 'Tuแบงn nร y', - -'dashboard.analysis.all-day': 'Hรดm nay', - -'dashboard.analysis.search-users': 'Sแป‘ lฦฐแปฃng ngฦฐแปi dรนng tรฌm kiแบฟm', - -'dashboard.analysis.per-capita-search': 'Sแป‘ lฦฐแปฃt tรฌm kiแบฟm trung bรฌnh trรชn ฤ‘แบงu ngฦฐแปi', - -'dashboard.analysis.online-top-search': 'Cรกc tแปซ khรณa tรฌm kiแบฟm trแปฑc tuyแบฟn phแป• biแบฟn', - -'dashboard.analysis.the-proportion-of-sales': 'Doanh sแป‘ theo danh mแปฅc', - -'dashboard.analysis.dropdown-option-one': 'Phฦฐฦกng รกn mแป™t', - -'dashboard.analysis.dropdown-option-two': 'Phฦฐฦกng รกn hai', - -'dashboard.analysis.channel.all': 'Tแบฅt cแบฃ Kรชnh', - -'dashboard.analysis.channel.online': 'Trแปฑc tuyแบฟn', - -'dashboard.analysis.channel.stores': 'Cแปญa hร ng', - -'dashboard.analysis.sales': 'Doanh thu bรกn hร ng', - -'dashboard.analysis.traffic': 'Lฦฐu lฦฐแปฃng truy cแบญp', - -'dashboard.analysis.table.rank': 'Xแบฟp hแบกng', - -'dashboard.analysis.table.search-keyword': 'Tแปซ khรณa tรฌm kiแบฟm', - -'dashboard.analysis.table.users': 'Sแป‘ lฦฐแปฃng ngฦฐแปi dรนng', - -'dashboard.analysis.table.weekly-range': 'Tฤƒng trฦฐแปŸng hร ng tuแบงn', - -'dashboard.indicator.selectSymbol': 'Chแปn hoแบทc nhแบญp mรฃ cแป• phiแบฟu', - -'dashboard.indicator.emptyWatchlistHint': 'Hiแป‡n khรดng cรณ cแป• phiแบฟu nร o trong danh sรกch theo dรตi, vui lรฒng thรชm vร o, ฤแบงu tiรชn', - -'dashboard.indicator.hint.selectSymbol': 'Vui lรฒng chแปn cแป• phiแบฟu ฤ‘แปƒ bแบฏt ฤ‘แบงu phรขn tรญch', - -'dashboard.indicator.hint.selectSymbolDesc': 'Chแปn hoแบทc nhแบญp mรฃ cแป• phiแบฟu vร o รด tรฌm kiแบฟm phรญa trรชn ฤ‘แปƒ xem biแปƒu ฤ‘แป“ nแบฟn vร  cรกc chแป‰ bรกo kแปน thuแบญt', - -'dashboard.indicator.retry': 'Thแปญ lแบกi', - -'dashboard.indicator.panel.title': 'Cรกc chแป‰ bรกo kแปน thuแบญt', - -'dashboard.indicator.panel.realtimeOn': 'Tแบฏt cแบญp nhแบญt thแปi gian thแปฑc', - -'dashboard.indicator.panel.realtimeOff': 'Bแบญt cแบญp nhแบญt thแปi gian thแปฑc', - -'dashboard.indicator.panel.themeLight': 'Chuyแปƒn sang chแปง ฤ‘แป tแป‘i', - -'dashboard.indicator.panel.themeDark': 'Chuyแปƒn sang chแปง ฤ‘แป sรกng theme', - -'dashboard.indicator.section.enabled': 'ฤรฃ bแบญt', - -'dashboard.indicator.section.added': 'Cรกc chแป‰ bรกo tรดi ฤ‘รฃ thรชm', - -'dashboard.indicator.section.custom': 'Chแป‰ bรกo do tรดi tแปฑ tแบกo', - -'dashboard.indicator.section.bought': 'Cรกc chแป‰ bรกo tรดi ฤ‘รฃ mua', - -'dashboard.indicator.section.myCreated': 'Cรกc chแป‰ bรกo tรดi ฤ‘รฃ tแบกo', - -'dashboard.indicator.empty': 'Chฦฐa cรณ chแป‰ bรกo nร o, vui lรฒng thรชm hoแบทc tแบกo chแป‰ bรกo trฦฐแป›c', - -'dashboard.indicator.buy': 'Mua chแป‰ bรกo', - -'dashboard.indicator.action.start': 'Bแบฏt โ€‹โ€‹ฤ‘แบงu', - -'dashboard.indicator.action.stop': 'Dแปซng', - -'dashboard.indicator.action.edit': 'Chแป‰nh sแปญa', - -'dashboard.indicator.action.delete': 'Xรณa', - -'dashboard.indicator.action.backtest': 'Kiแปƒm tra lแบกi', - -'dashboard.indicator.status.normal': 'Bรฌnh thฦฐแปng', - -'dashboard.indicator.status.normalPermanent': 'Bรฌnh thฦฐแปng (Cรณ hiแป‡u lแปฑc vฤฉnh viแป…n)', - -'dashboard.indicator.status.expired': 'ฤรฃ hแบฟt hแบกn', - -'dashboard.indicator.expiry.permanent': 'Cรณ hiแป‡u lแปฑc vฤฉnh viแป…n', - -'dashboard.indicator.expiry.noExpiry': 'Khรดng cรณ ngร y hแบฟt hแบกn', - -'dashboard.indicator.expiry.expired': 'ฤรฃ hแบฟt hแบกn: {date}', - -'dashboard.indicator.expiry.expiresOn': 'Ngร y hแบฟt hแบกn: {date}', - -'dashboard.indicator.delete.confirmTitle': 'Xรกc nhแบญn xรณa', - -'dashboard.indicator.delete.confirmContent': 'Bแบกn cรณ chแบฏc chแบฏn muแป‘n xรณa chแป‰ bรกo "{name}" khรดng? Thao tรกc nร y khรดng thแปƒ ฤ‘แบฃo ngฦฐแปฃc.', - -'dashboard.indicator.delete.confirmOk': 'Xรณa', - -'dashboard.indicator.delete.confirmCancel': 'Hแปงy', - -'dashboard.indicator.delete.success': 'Xรณa thร nh cรดng', - -'dashboard.indicator.delete.failed': 'Xรณa thแบฅt bแบกi', - -'dashboard.indicator.save.success': 'Lฦฐu thร nh cรดng', - -'dashboard.indicator.save.failed': 'Lฦฐu thแบฅt bแบกi', - -'dashboard.indicator.error.loadWatchlistFailed': 'Khรดng thแปƒ tแบฃi danh sรกch theo dรตi', - -'dashboard.indicator.error.chartNotReady': 'Thร nh phแบงn biแปƒu ฤ‘แป“ chฦฐa ฤ‘ฦฐแปฃc khแปŸi tแบกo, vui lรฒng chแปn mแปฅc tiรชu vร  ฤ‘แปฃi biแปƒu ฤ‘แป“ tแบฃi xong , load', -'dashboard.indicator.error.chartMethodNotReady': 'Phฦฐฦกng thแปฉc cแปงa thร nh phแบงn biแปƒu ฤ‘แป“ chฦฐa sแบตn sร ng, vui lรฒng thแปญ lแบกi sau', - -'dashboard.indicator.error.chartExecuteNotReady': 'Phฦฐฦกng thแปฉc thแปฑc thi cแปงa thร nh phแบงn biแปƒu ฤ‘แป“ chฦฐa sแบตn sร ng, vui lรฒng thแปญ lแบกi sau', - -'dashboard.indicator.error.parseFailed': 'Khรดng thแปƒ phรขn tรญch cรบ phรกp mรฃ Python', - -'dashboard.indicator.error.parseFailedCheck': 'Khรดng thแปƒ phรขn tรญch cรบ phรกp mรฃ Python, vui lรฒng kiแปƒm tra ฤ‘แป‹nh dแบกng mรฃ', - -'dashboard.indicator.error.addIndicatorFailed': 'Khรดng thแปƒ thรชm chแป‰ bรกo', - -'dashboard.indicator.error.runIndicatorFailed': 'Khรดng thแปƒ chแบกy chแป‰ bรกo', - -'dashboard.indicator.error.pleaseLogin': 'Vui lรฒng ฤ‘ฤƒng nhแบญp trฦฐแป›c', - -'dashboard.indicator.error.loadDataFailed': 'Tแบฃi dแปฏ liแป‡u thแบฅt bแบกi', - -'dashboard.indicator.error.loadDataFailedDesc': 'Vui lรฒng kiแปƒm tra kแบฟt nแป‘i mแบกng cแปงa bแบกn', - -'dashboard.indicator.error.pythonEngineFailed': 'Khรดng thแปƒ tแบฃi cรดng cแปฅ Python; chแปฉc nฤƒng chแป‰ bรกo cรณ thแปƒ khรดng khแบฃ dแปฅng', - -'dashboard.indicator.error.chartInitFailed': 'KhแปŸi tแบกo biแปƒu ฤ‘แป“ thแบฅt bแบกi', - -'dashboard.indicator.warning.enterCode': 'Vui lรฒng nhแบญp mรฃ chแป‰ bรกo trฦฐแป›c', - -'dashboard.indicator.warning.pyodideLoadFailed': 'Khรดng thแปƒ tแบฃi cรดng cแปฅ Python', - -'dashboard.indicator.warning.pyodideLoadFailedDesc': 'Tรญnh nฤƒng nร y khรดng khแบฃ dแปฅng trong khu vแปฑc hoแบทc mรดi trฦฐแปng mแบกng hiแป‡n tแบกi cแปงa bแบกn', - -'dashboard.indicator.warning.chartNotInitialized': 'Biแปƒu ฤ‘แป“ chฦฐa ฤ‘ฦฐแปฃc khแปŸi tแบกo; Cรดng cแปฅ vแบฝ khรดng khแบฃ dแปฅng', - -'dashboard.indicator.success.runIndicator': 'Chแป‰ bรกo ฤ‘รฃ chแบกy thร nh cรดng', - -'dashboard.indicator.success.clearDrawings': 'ฤรฃ xรณa tแบฅt cแบฃ cรกc ฤ‘ฦฐแปng', - -'dashboard.indicator.sma': 'SMA (Trung bรฌnh ฤ‘แป™ng ngแบฏn hแบกn)', - -'dashboard.indicator.ema': 'EMA (Trung bรฌnh ฤ‘แป™ng hร m mลฉ)', - -'dashboard.indicator.rsi': 'RSI (Chแป‰ sแป‘ sแปฉc mแบกnh tฦฐฦกng ฤ‘แป‘i)', - -'dashboard.indicator.macd': 'MACD', - -'dashboard.indicator.bb': 'Dแบฃi Bollinger (...Dแบฃi Bollinger)', - -'dashboard.indicator.atr': 'ATR (Chแป‰ sแป‘ phแบกm vi trung bรฌnh thแปฑc)', - -'dashboard.indicator.cci': 'CCI (Chแป‰ sแป‘ kรชnh hร ng hรณa)', - -'dashboard.indicator.williams': 'Williams %R (Chแป‰ sแป‘ Williams %R)', - -'dashboard.indicator.mfi': 'MFI (Chแป‰ sแป‘ dรฒng tiแปn)', - -'dashboard.indicator.adx': 'ADX (Chแป‰ sแป‘ hฦฐแป›ng trung bรฌnh)', - -'dashboard.indicator.obv': 'OBV (Chแป‰ sแป‘ khแป‘i lฦฐแปฃng cรขn bแบฑng)', - -'dashboard.indicator.adosc': 'ADOSC (Chแป‰ bรกo dao ฤ‘แป™ng tรญch lลฉy/phรขn phแป‘i)', - -'dashboard.indicator.ad': 'AD (Chแป‰ bรกo ฤ‘ฦฐแปng tรญch lลฉy/phรขn phแป‘i)', - -'dashboard.indicator.kdj': 'KDJ (Chแป‰ bรกo ngแบซu nhiรชn)', -'dashboard.indicator.signal.buy': 'MUA', - -'dashboard.indicator.signal.sell': 'BรN', - -'dashboard.indicator.signal.supertrendBuy': 'Mua theo xu hฦฐแป›ng siรชu mแบกnh', - -'dashboard.indicator.signal.supertrendSell': 'Bรกn theo xu hฦฐแป›ng siรชu mแบกnh', - -'dashboard.indicator.chart.kline': 'ฤฦฐแปng K', - -'dashboard.indicator.chart.volume': 'Khแป‘i lฦฐแปฃng', - -'dashboard.indicator.chart.uptrend': 'Xu hฦฐแป›ng tฤƒng', - -'dashboard.indicator.chart.downtrend': 'Xu hฦฐแป›ng giแบฃm', - -'dashboard.indicator.tooltip.time': 'Thแปi gian', -'dashboard.indicator.tooltip.open': 'MแปŸ', - -'dashboard.indicator.tooltip.close': 'ฤรณng', - -'dashboard.indicator.tooltip.high': 'Cao', - -'dashboard.indicator.tooltip.low': 'Thแบฅp', - -'dashboard.indicator.tooltip.volume': 'Khแป‘i lฦฐแปฃng', - -'dashboard.indicator.drawing.line': 'ฤoแบกn thแบณng', - -'dashboard.indicator.drawing.horizontalLine': 'ฤฦฐแปng ngang', - -'dashboard.indicator.drawing.verticalLine': 'ฤฦฐแปng thแบณng ฤ‘แปฉng', - -'dashboard.indicator.drawing.ray': 'Tia', - -'dashboard.indicator.drawing.straightLine': 'ฤฦฐแปng thแบณng', - -'dashboard.indicator.drawing.parallelLine': 'ฤฦฐแปng song song', - -'dashboard.indicator.drawing.priceLine': 'Giรก', -'dashboard.indicator.drawing.priceChannel': 'kรชnh giรก', - -'dashboard.indicator.drawing.fibonacciLine': 'ฤ‘ฦฐแปng Fibonacci', - -'dashboard.indicator.drawing.clearAll': 'xรณa tแบฅt cแบฃ cรกc ฤ‘ฦฐแปng ฤ‘รฃ vแบฝ', - -'dashboard.indicator.market.USStock': 'cแป• phiแบฟu Mแปน', - -'dashboard.indicator.market.Crypto': 'tiแปn ฤ‘iแป‡n tแปญ', - -'dashboard.indicator.market.Forex': 'ngoแบกi hแป‘i', - -'dashboard.indicator.market.Futures': 'hแปฃp ฤ‘แป“ng tฦฐฦกng lai', - -'dashboard.indicator.create': 'Tแบกo Indicator', - -'dashboard.indicator.editor.title': 'Tแบกo/Chแป‰nh sแปญa chแป‰ bรกo', - -'dashboard.indicator.editor.name': 'Tรชn chแป‰ bรกo', - -'dashboard.indicator.editor.nameRequired': 'Vui lรฒng nhแบญp tรชn chแป‰ bรกo', - -'dashboard.indicator.editor.namePlaceholder': 'Vui lรฒng nhแบญp tรชn chแป‰ bรกo', - -'dashboard.indicator.editor.description': 'Mรด tแบฃ chแป‰ bรกo', - -'dashboard.indicator.editor.descriptionPlaceholder': 'Vui lรฒng nhแบญp mรด tแบฃ chแป‰ bรกo (tรนy chแปn)', - -'dashboard.indicator.editor.code': 'Mรฃ Python', - -'dashboard.indicator.editor.codeRequired': 'Vui lรฒng nhแบญp mรฃ chแป‰ bรกo', - -'dashboard.indicator.editor.codePlaceholder': 'Vui lรฒng nhแบญp mรฃ Python code', - -'dashboard.indicator.editor.run': 'Chแบกy', - -'dashboard.indicator.editor.runHint': 'Nhแบฅp vร o nรบt chแบกy ฤ‘แปƒ xem trฦฐแป›c hiแป‡u แปฉng cแปงa chแป‰ bรกo trรชn biแปƒu ฤ‘แป“ nแบฟn', - -'dashboard.indicator.editor.guide': 'Hฦฐแป›ng dแบซn phรกt triแปƒn', - -'dashboard.indicator.editor.guideTitle': 'Hฦฐแป›ng dแบซn phรกt triแปƒn chแป‰ bรกo Python', - -'dashboard.indicator.editor.save': 'Lฦฐu', - -'dashboard.indicator.editor.cancel': 'Hแปงy', - -'dashboard.indicator.editor.unnamed': 'Chแป‰ bรกo chฦฐa ฤ‘ฦฐแปฃc ฤ‘แบทt tรชn', - -'dashboard.indicator.editor.publishToCommunity': 'Chia sแบป lรชn cแป™ng ฤ‘แป“ng', - -'dashboard.indicator.editor.publishToCommunityHint': 'Sau khi chia sแบป, ngฦฐแปi dรนng khรกc cรณ thแปƒ xem vร  sแปญ dแปฅng cรกc chแป‰ sแป‘ cแปงa bแบกn, trong cแป™ng ฤ‘แป“ng', - -'dashboard.indicator.editor.indicatorType': 'Loแบกi chแป‰ bรกo', - -'dashboard.indicator.editor.indicatorTypeRequired': 'Vui lรฒng chแปn loแบกi chแป‰ bรกo', - -'dashboard.indicator.editor.indicatorTypePlaceholder': 'Vui lรฒng chแปn loแบกi chแป‰ bรกo', - -'dashboard.indicator.editor.previewImage': 'Hรฌnh แบฃnh xem trฦฐแป›c', - -'dashboard.indicator.editor.uploadImage': 'Tแบฃi lรชn hรฌnh แบฃnh', - -'dashboard.indicator.editor.previewImageHint': 'Kรญch thฦฐแป›c ฤ‘แป xuแบฅt: 800x400, kรญch thฦฐแป›c khรดng vฦฐแปฃt quรก 2MB', - -'dashboard.indicator.editor.pricing': 'Giรก (QDT)', - -'dashboard.indicator.editor.pricingType.free': 'Miแป…n phรญ', - -'dashboard.indicator.editor.pricingType.permanent': 'Vฤฉnh viแป…n', - -'dashboard.indicator.editor.pricingType.monthly': 'Hร ng thรกng', - -'dashboard.indicator.editor.price': 'Giรก', - -'dashboard.indicator.editor.priceRequired': 'Vui lรฒng nhแบญp giรก', - -'dashboard.indicator.editor.pricePlaceholder': 'Vui lรฒng nhแบญp giรก', - -'dashboard.indicator.editor.pricingHint': 'Mแบทc dรน chแป‰ bรกo miแป…n phรญ cรณ giรก 0, nแปn tแบฃng sแบฝ thฦฐแปŸng cho bแบกn dแปฑa trรชn viแป‡c sแปญ dแปฅng chแป‰ bรกo vร  tแปท lแป‡ ฤ‘รกnh giรก tรญch cแปฑc (QDT)', - -'dashboard.indicator.editor.aiGenerate': 'Tแบกo thรดng minh', - -'dashboard.indicator.editor.aiPromptPlaceholder': 'Hรฃy cho tรดi biแบฟt รฝ tฦฐแปŸng cแปงa bแบกn, vร  Tรดi sแบฝ tแบกo mรฃ chแป‰ bรกo Python cho bแบกn', - -'dashboard.indicator.editor.aiGenerateBtn': 'Mรฃ ฤ‘ฦฐแปฃc tแบกo bแปŸi AI', - -'dashboard.indicator.editor.aiPromptRequired': 'Vui lรฒng nhแบญp รฝ tฦฐแปŸng cแปงa bแบกn', - -'dashboard.indicator.editor.aiGenerateSuccess': 'Tแบกo mรฃ thร nh cรดng', - -'dashboard.indicator.editor.aiGenerateError': 'Tแบกo mรฃ thแบฅt bแบกi, vui lรฒng thแปญ lแบกi sau', - -'dashboard.indicator.backtest.title': 'Kiแปƒm thแปญ ngฦฐแปฃc chแป‰ bรกo', - -'dashboard.indicator.backtest.config': 'Tham sแป‘ kiแปƒm thแปญ ngฦฐแปฃc', - -'dashboard.indicator.backtest.startDate': 'Ngร y bแบฏt ฤ‘แบงu', - -'dashboard.indicator.backtest.endDate': 'Ngร y kแบฟt thรบc Ngร y', - -'dashboard.indicator.backtest.selectStartDate': 'Chแปn ngร y bแบฏt ฤ‘แบงu', - -'dashboard.indicator.backtest.selectEndDate': 'Chแปn ngร y kแบฟt thรบc', - -'dashboard.indicator.backtest.startDateRequired': 'Vui lรฒng chแปn ngร y bแบฏt ฤ‘แบงu', - -'dashboard.indicator.backtest.endDateRequired': 'Vui lรฒng chแปn ngร y kแบฟt thรบc', - -'dashboard.indicator.backtest.initialCapital': 'Vแป‘n ban ฤ‘แบงu', - -'dashboard.indicator.backtest.initialCapitalRequired': 'Vui lรฒng nhแบญp vแป‘n ban ฤ‘แบงu', - -'dashboard.indicator.backtest.commission': 'Tแปท lแป‡ hoa hแป“ng', - -'dashboard.indicator.backtest.leverage': 'Tแปท lแป‡ ฤ‘รฒn bแบฉy', - -'dashboard.indicator.backtest.tradeDirection': 'Hฦฐแป›ng giao dแป‹ch Hฦฐแป›ng', - -'dashboard.indicator.backtest.longOnly': 'Mua', - -'dashboard.indicator.backtest.shortOnly': 'Bรกn', - -'dashboard.indicator.backtest.both': 'Cแบฃ hai chiแปu', -'dashboard.indicator.backtest.run': 'Bแบฏt โ€‹โ€‹ฤ‘แบงu kiแปƒm thแปญ ngฦฐแปฃc', - -'dashboard.indicator.backtest.rerun': 'Chแบกy lแบกi kiแปƒm thแปญ ngฦฐแปฃc', - -'dashboard.indicator.backtest.close': 'ฤรณng', - -'dashboard.indicator.backtest.running': 'ฤang tiแบฟn hร nh kiแปƒm thแปญ ngฦฐแปฃc...', - -'dashboard.indicator.backtest.results': 'Kแบฟt quแบฃ kiแปƒm thแปญ ngฦฐแปฃc', - -'dashboard.indicator.backtest.totalReturn': 'Tแป•ng lแปฃi nhuแบญn', - -'dashboard.indicator.backtest.annualReturn': 'Lแปฃi nhuแบญn hร ng nฤƒm', - -'dashboard.indicator.backtest.maxDrawdown': 'Mแปฉc giแบฃm tแป‘i ฤ‘a', - -'dashboard.indicator.backtest.sharpeRatio': 'Tแปท lแป‡ Sharpe ratio', - -'dashboard.indicator.backtest.winRate': 'Tแปท lแป‡ thแบฏng', - -'dashboard.indicator.backtest.profitFactor': 'Tแปท lแป‡ lรฃi/lแป—', - -'dashboard.indicator.backtest.totalTrades': 'Sแป‘ lฦฐแปฃng giao dแป‹ch', - -'dashboard.indicator.totalReturn': 'Tแป•ng lแปฃi nhuแบญn', - -'dashboard.indicator.annualReturn': 'Lแปฃi nhuแบญn hร ng nฤƒm', - -'dashboard.indicator.maxDrawdown': 'Mแปฉc giแบฃm tแป‘i ฤ‘a', - -'dashboard.indicator.sharpeRatio': 'Tแปท lแป‡ Sharpe', - -'dashboard.indicator.winRate': 'Tแปท lแป‡ thแบฏng', - -'dashboard.indicator.profitFactor': 'Tแปท lแป‡ lรฃi/lแป— Tแปท lแป‡', - -'dashboard.indicator.totalTrades': 'Tแป•ng sแป‘ giao dแป‹ch', - -'dashboard.indicator.backtest.totalCommission': 'Tแป•ng phรญ hoa hแป“ng', - -'dashboard.indicator.backtest.equityCurve': 'ฤฦฐแปng cong vแป‘n chแปง sแปŸ hแปฏu', - -'dashboard.indicator.backtest.strategy': 'Lแปฃi nhuแบญn cแปงa chแป‰ bรกo', - -'dashboard.indicator.backtest.benchmark': 'Lแปฃi nhuแบญn chuแบฉn', - -'dashboard.indicator.backtest.tradeHistory': 'Lแป‹ch sแปญ giao dแป‹ch', - -'dashboard.indicator.backtest.tradeTime': 'Thแปi gian', - -'dashboard.indicator.backtest.tradeType': 'Loแบกi giao dแป‹ch', - -'dashboard.indicator.backtest.buy': 'Mua', - -'dashboard.indicator.backtest.sell': 'Bรกn', - -'dashboard.indicator.backtest.liquidation': 'Tร i khoแบฃn ฤ‘รฃ bแป‹ thanh lรฝ', - -'dashboard.indicator.backtest.openLong': 'MแปŸ lแป‡nh mua', - -'dashboard.indicator.backtest.closeLong': 'ฤรณng lแป‡nh mua', - -'dashboard.indicator.backtest.closeLongStop': 'ฤรณng lแป‡nh mua (Cแบฏt lแป—)', - -'dashboard.indicator.backtest.closeLongProfit': 'ฤรณng lแป‡nh mua (Chแป‘t lแปi)', - -'dashboard.indicator.backtest.addLong': 'Thรชm lแป‡nh mua', - -'dashboard.indicator.backtest.openShort': 'MแปŸ lแป‡nh bรกn', - -'dashboard.indicator.backtest.closeShort': 'ฤรณng lแป‡nh bรกn', - -'dashboard.indicator.backtest.closeShortStop': 'ฤรณng lแป‡nh bรกn (Dแปซng lแป—) Lแป—', - -'dashboard.indicator.backtest.closeShortProfit': 'ฤรณng vแป‹ thแบฟ bรกn khแป‘ng (chแป‘t lแปi)', - -'dashboard.indicator.backtest.addShort': 'Thรชm vแป‹ thแบฟ bรกn khแป‘ng', - -'dashboard.indicator.backtest.price': 'Giรก', - -'dashboard.indicator.backtest.amount': 'Sแป‘ lฦฐแปฃng', - -'dashboard.indicator.backtest.balance': 'Sแป‘ dฦฐ tร i khoแบฃn', - -'dashboard.indicator.backtest.profit': 'Lรฃi/Lแป—', - -'dashboard.indicator.backtest.success': 'Kiแปƒm thแปญ ngฦฐแปฃc thร nh cรดng', - -'dashboard.indicator.backtest.failed': 'Kiแปƒm thแปญ ngฦฐแปฃc thแบฅt bแบกi, vui lรฒng thแปญ lแบกi sau', - -'dashboard.indicator.backtest.noIndicatorCode': 'Khรดng cรณ mรฃ nร o ฤ‘แปƒ kiแปƒm thแปญ ngฦฐแปฃc nร y', -'dashboard.indicator.backtest.noSymbol': 'Vui lรฒng chแปn cรดng cแปฅ giao dแป‹ch trฦฐแป›c', - -'dashboard.indicator.backtest.dateRangeExceeded': 'Thแปi gian kiแปƒm thแปญ ngฦฐแปฃc vฦฐแปฃt quรก giแป›i hแบกn: chแป‰ cรณ thแปƒ kiแปƒm thแปญ ngฦฐแปฃc trong khoแบฃng thแปi gian {timeframe} lร  {maxRange}', -'dashboard.indicator.backtest.dateRangeExceededDays': 'Backtest range exceeds limit: {timeframe} max {maxRange} ({maxDays} days)', -'dashboard.indicator.backtest.hint.entryPctMax': 'Max entry: {maxPct}% (reserve budget for future scale-ins)', -'dashboard.indicator.backtest.metaLine': 'Symbol: {symbol} | Market: {market} | Timeframe: {timeframe}', -'dashboard.indicator.backtest.savedRunId': 'Backtest saved. Run ID: {id}', -'dashboard.indicator.backtest.prev': 'Previous', -'dashboard.indicator.backtest.next': 'Next', -'dashboard.indicator.backtest.steps.strategy.title': 'Strategy', -'dashboard.indicator.backtest.steps.strategy.desc': 'Position sizing & risk controls', -'dashboard.indicator.backtest.steps.trading.title': 'Trading settings', -'dashboard.indicator.backtest.steps.trading.desc': 'Time range, capital, fees, leverage', -'dashboard.indicator.backtest.steps.results.title': 'Results', -'dashboard.indicator.backtest.steps.results.desc': 'Backtest output', -'dashboard.indicator.backtest.panel.risk': 'Risk management (SL/TP/Trailing)', -'dashboard.indicator.backtest.panel.scale': 'Scale in / DCA (trend & mean-reversion)', -'dashboard.indicator.backtest.panel.reduce': 'Reduce position (trend & adverse)', -'dashboard.indicator.backtest.panel.position': 'Position sizing', -'dashboard.indicator.backtest.field.stopLossPct': 'Stop Loss (%)', -'dashboard.indicator.backtest.field.takeProfitPct': 'Take Profit (%)', -'dashboard.indicator.backtest.field.trailingEnabled': 'Trailing stop / take profit', -'dashboard.indicator.backtest.field.trailingStopPct': 'Trailing drawdown (%)', -'dashboard.indicator.backtest.field.trailingActivationPct': 'Trailing activation (%)', -'dashboard.indicator.backtest.field.slippage': 'Slippage (%)', -'dashboard.indicator.backtest.field.trendAddEnabled': 'Trend-following scale-in', -'dashboard.indicator.backtest.field.dcaAddEnabled': 'Mean-reversion DCA', -'dashboard.indicator.backtest.field.trendAddStepPct': 'Scale-in trigger (%)', -'dashboard.indicator.backtest.field.dcaAddStepPct': 'DCA trigger (%)', -'dashboard.indicator.backtest.field.trendAddSizePct': 'Scale-in size (% of capital)', -'dashboard.indicator.backtest.field.dcaAddSizePct': 'DCA size (% of capital)', -'dashboard.indicator.backtest.field.trendAddMaxTimes': 'Max scale-in times', -'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'Max DCA times', -'dashboard.indicator.backtest.field.trendReduceEnabled': 'Trend reduce', -'dashboard.indicator.backtest.field.adverseReduceEnabled': 'Adverse reduce', -'dashboard.indicator.backtest.field.trendReduceStepPct': 'Trend trigger (%)', -'dashboard.indicator.backtest.field.adverseReduceStepPct': 'Adverse trigger (%)', -'dashboard.indicator.backtest.field.trendReduceSizePct': 'Reduce size (% of position)', -'dashboard.indicator.backtest.field.adverseReduceSizePct': 'Adverse reduce size (% of position)', -'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'Max trend reduce times', -'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'Max adverse reduce times', -'dashboard.indicator.backtest.field.entryPct': 'Entry size (% of capital)', -'dashboard.indicator.backtest.field.minOrderPct': 'Min order size (% of capital) (optional)', -'dashboard.indicator.backtest.closeLongTrailing': 'Close Long (Trailing)', -'dashboard.indicator.backtest.reduceLong': 'Reduce Long', -'dashboard.indicator.backtest.closeShortTrailing': 'Close Short (Trailing)', -'dashboard.indicator.backtest.reduceShort': 'Reduce Short', - -'dashboard.docs.title': 'Trung tรขm Tร i liแป‡u', - -'dashboard.docs.search.placeholder': 'Tรฌm kiแบฟm Tร i liแป‡u...', - -'dashboard.docs.category.all': 'Tแบฅt cแบฃ', - -'dashboard.docs.category.guide': 'Hฦฐแป›ng dแบซn dร nh cho nhร  phรกt triแปƒn', - -'dashboard.docs.category.api': 'Tร i liแป‡u API', - -'dashboard.docs.category.tutorial': 'Hฦฐแป›ng dแบซn', - -'dashboard.docs.category.faq': 'Cรขu hแปi thฦฐแปng gแบทp Cรขu hแปi', - -'dashboard.docs.featured.title': 'Tร i liแป‡u ฤ‘ฦฐแปฃc ฤ‘แป xuแบฅt', - -'dashboard.docs.featured.tag': 'ฤฦฐแปฃc ฤ‘แป xuแบฅt', - -'dashboard.docs.list.views': 'Lฦฐแปฃt xem', - -'dashboard.docs.list.author': 'Tรกc giแบฃ', - -'dashboard.docs.list.empty': 'Khรดng cรณ tร i liแป‡u nร o', - -'dashboard.docs.list.backToAll': 'Trแบฃ vแป tแบฅt cแบฃ tร i liแป‡u', - -'dashboard.docs.list.total': 'Tแป•ng sแป‘ {count} tร i liแป‡u', - -'dashboard.docs.detail.back': 'Trแบฃ vแป danh sรกch tร i liแป‡u', - -'dashboard.docs.detail.updatedAt': 'Cแบญp nhแบญt lรบc', - -'dashboard.docs.detail.related': 'Tร i liแป‡u liรชn quan', - -'dashboard.docs.detail.notFound': 'Khรดng tรฌm thแบฅy tร i liแป‡u tแป“n tแบกi', - -'dashboard.docs.detail.error': 'Tร i liแป‡u khรดng tแป“n tแบกi hoแบทc ฤ‘รฃ bแป‹ xรณa', - -'dashboard.docs.search.result': 'Kแบฟt quแบฃ tรฌm kiแบฟm', - -'dashboard.docs.search.keyword': 'Tแปซ khรณa', - -'community.filter.indicatorType': 'Loแบกi chแป‰ bรกo', - -'community.filter.all': 'Tแบฅt cแบฃ', - -'community.filter.other': 'Cรกc tรนy chแปn khรกc', - -'community.filter.pricing': 'Loแบกi giรก', - -'community.filter.allPricing': 'Tแบฅt cแบฃ giรก', - -'community.filter.sortBy': 'Phฦฐฦกng thแปฉc sแบฏp xแบฟp', - -'community.filter.search': 'Tรฌm kiแบฟm', - -'community.filter.searchPlaceholder': 'Tรชn chแป‰ bรกo tรฌm kiแบฟm', - -'community.indicatorType.trend': 'ฤแป‹nh hฦฐแป›ng theo xu hฦฐแป›ng', - -'community.indicatorType.momentum': 'ฤแป™ng lฦฐแปฃng', - -'community.indicatorType.volatility': 'Biแบฟn ฤ‘แป™ng', - -'community.indicatorType.volume': 'Khแป‘i lฦฐแปฃng', - -'community.indicatorType.custom': 'Tรนy chแป‰nh', - -'community.pricing.free': 'Miแป…n phรญ', - -'community.pricing.paid': 'Trแบฃ phรญ', - -'community.sort.downloads': 'Lฦฐแปฃt tแบฃi xuแป‘ng', - -'community.sort.rating': 'Xแบฟp hแบกng', - -'community.sort.newest': 'Phiรชn bแบฃn mแป›i nhแบฅt', - -'community.pagination.total': 'Tแป•ng sแป‘ {total} chแป‰ bรกo', - -'community.noDescription': 'Khรดng cรณ mรด tแบฃ', - -'community.detail.type': 'Loแบกi', - -'community.detail.pricing': 'Giรก cแบฃ', - -'community.detail.rating': 'Xแบฟp hแบกng', - -'community.detail.downloads': 'Lฦฐแปฃt tแบฃi xuแป‘ng', - -'community.detail.author': 'Tรกc giแบฃ', - -'community.detail.description': 'Mรด tแบฃ', - -'community.detail.detailContent': 'Mรด tแบฃ chi tiแบฟt', - -'community.detail.backtestStats': 'Thแป‘ng kรช kiแปƒm thแปญ ngฦฐแปฃc', - -'community.action.purchase': 'Sแป‘ liแป‡u mua hร ng', - -'community.action.addToMyIndicators': 'Thรชm vร o chแป‰ bรกo cแปงa tรดi', - -'community.action.favorite': 'Yรชu thรญch', - -'community.action.unfavorite': 'Bแป yรชu thรญch', - -'community.action.buyNow': 'Mua ngay Ngay bรขy giแป', - -'community.action.renew': 'Gia hแบกn', - -'community.purchase.price': 'Giรก', - -'community.purchase.permanent': 'Vฤฉnh viแป…n', - -'community.purchase.monthly': 'Hร ng thรกng', - -'community.purchase.confirmBuy': 'Xรกc nhแบญn mua chแป‰ sแป‘ nร y ({price} QDT)?', - -'community.purchase.confirmRenew': 'Xรกc nhแบญn gia hแบกn chแป‰ sแป‘ nร y ({price} QDT/thรกng)?', - -'community.purchase.confirmFree': 'Xรกc nhแบญn thรชm chแป‰ sแป‘ miแป…n phรญ nร y?', -'community.purchase.confirmTitle': 'Xรกc nhแบญn thao tรกc', - -'community.purchase.owned': 'Bแบกn ฤ‘รฃ mua chแป‰ sแป‘ nร y (cรณ hiแป‡u lแปฑc vฤฉnh viแป…n)', - -'community.purchase.ownIndicator': 'ฤรขy lร  chแป‰ sแป‘ bแบกn ฤ‘รฃ cรดng bแป‘', - -'community.purchase.expired': 'Gรณi ฤ‘ฤƒng kรฝ cแปงa bแบกn ฤ‘รฃ hแบฟt hแบกn', - -'community.purchase.expiresOn': 'Ngร y hแบฟt hแบกn: {date}', - -'community.tabs.detail': 'Chi tiแบฟt chแป‰ sแป‘', - -'community.tabs.backtest': 'Dแปฏ liแป‡u kiแปƒm thแปญ ngฦฐแปฃc', - -'community.tabs.ratings': 'Xแบฟp hแบกng ngฦฐแปi dรนng', - -'community.rating.myRating': 'Xแบฟp hแบกng cแปงa tรดi', - -'community.rating.stars': '{count} Stars', - -'community.rating.commentPlaceholder': 'Chia sแบป trแบฃi nghiแป‡m ngฦฐแปi dรนng cแปงa bแบกn...', - -'community.rating.submit': 'Gแปญi ฤ‘รกnh giรก', - -'community.rating.modify': 'Sแปญa ฤ‘แป•i', - -'community.rating.saveModify': 'Lฦฐu thay ฤ‘แป•i', - -'community.rating.cancel': 'Hแปงy', - -'community.rating.selectRating': 'Vui lรฒng chแปn ฤ‘รกnh giรก', - -'community.rating.success': 'ฤรกnh giรก thร nh cรดng', - -'community.rating.modifySuccess': 'ฤรกnh giรก ฤ‘ฦฐแปฃc sแปญa ฤ‘แป•i thร nh cรดng', - -'community.rating.failed': 'ฤรกnh giรก thแบฅt bแบกi', - -'community.rating.noRatings': 'Chฦฐa cรณ ฤ‘รกnh giรก nร o', - -'community.backtest.note': 'Dแปฏ liแป‡u trรชn lร  kแบฟt quแบฃ kiแปƒm thแปญ ngฦฐแปฃc trong quรก khแปฉ, chแป‰ ฤ‘แปƒ tham khแบฃo vร  khรดng ฤ‘แบกi diแป‡n cho hiแป‡u suแบฅt trong tฦฐฦกng lai', -'community.backtest.noData': 'Khรดng cรณ dแปฏ liแป‡u kiแปƒm thแปญ ngฦฐแปฃc', - -'community.backtest.uploadHint': 'Tรกc giแบฃ chฦฐa tแบฃi lรชn dแปฏ liแป‡u kiแปƒm thแปญ ngฦฐแปฃc', - -'community.message.loadFailed': 'Khรดng thแปƒ tแบฃi danh sรกch chแป‰ bรกo', - -'community.message.purchaseProcessing': 'ฤang xแปญ lรฝ yรชu cแบงu mua hร ng...', - -'community.message.downloadSuccess': 'Chแป‰ bรกo ฤ‘รฃ ฤ‘ฦฐแปฃc thรชm vร o danh sรกch chแป‰ bรกo cแปงa tรดi', - -'community.message.favoriteSuccess': 'ฤรฃ thรชm vร o mแปฅc yรชu thรญch thร nh cรดng', - -'community.message.unfavoriteSuccess': 'ฤรฃ xรณa khแปi mแปฅc yรชu thรญch thร nh cรดng', - -'community.message.operationSuccess': 'Thao tรกc thร nh cรดng', - -'community.message.operationFailed': 'Thao tรกc thแบฅt bแบกi thแบฅt bแบกi', -'community.banner.readOnly': 'Chแป‰ xem', -'community.banner.loginHint': 'ฤแปƒ ฤ‘ฤƒng nhแบญp hoแบทc ฤ‘ฤƒng kรฝ, vui lรฒng nhแบฅp vร o nรบt ฤ‘แปƒ chuyแปƒn ฤ‘แบฟn trang ฤ‘แป™c lแบญp nhแบฑm trรกnh cรกc vแบฅn ฤ‘แป CSRF', -'community.banner.jumpButton': 'ฤi ฤ‘แบฟn ฤฤƒng nhแบญp/ฤฤƒng kรฝ', - -'dashboard.totalEquity': 'Tแป•ng vแป‘n chแปง sแปŸ hแปฏu', - -'dashboard.totalPnL': 'Tแป•ng lแปฃi nhuแบญn/thua lแป—', - -'dashboard.aiStrategies': 'Chiแบฟn lฦฐแปฃc AI', - -'dashboard.indicatorStrategies': 'Chiแบฟn lฦฐแปฃc chแป‰ bรกo', - -'dashboard.running': 'ฤang chแบกy', - -'dashboard.pnlHistory': 'Lแป‹ch sแปญ lแปฃi nhuแบญn/thua lแป—', - -'dashboard.strategyPerformance': 'Tแปท lแป‡ lแปฃi nhuแบญn/thua lแป— cแปงa chiแบฟn lฦฐแปฃc', - -'dashboard.recentTrades': 'Cรกc giao dแป‹ch gแบงn ฤ‘รขy', - -'dashboard.currentPositions': 'Vแป‹ thแบฟ hiแป‡n tแบกi', - -'dashboard.table.time': 'Thแปi gian', - -'dashboard.table.strategy': 'Chiแบฟn lฦฐแปฃc Name', - -'dashboard.table.symbol': 'Tร i sแบฃn cฦก sแปŸ', - -'dashboard.table.type': 'Loแบกi', - -'dashboard.table.side': 'Hฦฐแป›ng', - -'dashboard.table.size': 'Sแป‘ lฦฐแปฃng', - -'dashboard.table.entryPrice': 'Giรก mแปŸ cแปญa trung bรฌnh', - -'dashboard.table.price': 'Giรก', - -'dashboard.table.amount': 'Sแป‘ lฦฐแปฃng', - -'dashboard.table.profit': 'Lแปฃi nhuแบญn/Thua lแป—', - -'dashboard.pendingOrders': 'Lแป‹ch sแปญ thแปฑc hiแป‡n lแป‡nh', - -'dashboard.totalOrders': 'Tแป•ng {total} lแป‡nh', - -'dashboard.viewError': 'Xem lแป—i', - -'dashboard.filled': 'ฤรฃ khแป›p', - -'dashboard.orderTable.time': 'Thแปi gian tแบกo', - -'dashboard.orderTable.strategy': 'Chiแบฟn lฦฐแปฃc', - -'dashboard.orderTable.symbol': 'Cแบทp giao dแป‹ch', - -'dashboard.orderTable.signalType': 'Loแบกi tรญn hiแป‡u', - -'dashboard.orderTable.amount': 'Sแป‘ lฦฐแปฃng', - -'dashboard.orderTable.price': 'Giรก khแป›p', - -'dashboard.orderTable.status': 'Trแบกng thรกi', - -'dashboard.orderTable.executedAt': 'Thแปi gian thแปฑc hiแป‡n', - -'dashboard.signalType.openLong': 'MแปŸ Long', - -'dashboard.signalType.openShort': 'MแปŸ Short', - -'dashboard.signalType.closeLong': 'ฤรณng Long', - -'dashboard.signalType.closeShort': 'ฤรณng Short', - -'dashboard.signalType.addLong': 'Thรชm Long', - -'dashboard.signalType.addShort': 'Thรชm Short', - -'dashboard.status.pending': 'ฤang chแป', - -'dashboard.status.processing': 'ฤang xแปญ lรฝ', - -'dashboard.status.completed': 'Hoร n thร nh', - -'dashboard.status.failed': 'Thแบฅt bแบกi', - -'dashboard.status.cancelled': 'ฤรฃ hแปงy', - -'dashboard.table.pnl': 'Lแปฃi nhuแบญn/Thua lแป— chฦฐa thแปฑc hiแป‡n', - -'form.basic-form.basic.title': 'Biแปƒu mแบซu cฦก bแบฃn', - -'form.basic-form.basic.description': 'Cรกc trang biแปƒu mแบซu ฤ‘ฦฐแปฃc sแปญ dแปฅng ฤ‘แปƒ thu thแบญp hoแบทc xรกc minh thรดng tin tแปซ ngฦฐแปi dรนng. Biแปƒu mแบซu cฦก bแบฃn thฦฐแปng phแป• biแบฟn trong cรกc trฦฐแปng hแปฃp cรณ รญt mแปฅc dแปฏ liแป‡u.', - -'form.basic-form.title.label': 'Tiรชu ฤ‘แป', - -'form.basic-form.title.placeholder': 'ฤแบทt tรชn cho mแปฅc tiรชu', - -'form.basic-form.title.required': 'Vui lรฒng nhแบญp tiรชu ฤ‘แป', - -'form.basic-form.date.label': 'Ngร y bแบฏt ฤ‘แบงu vร  ngร y kแบฟt thรบc', - -'form.basic-form.placeholder.start': 'Ngร y bแบฏt ฤ‘แบงu', - -'form.basic-form.placeholder.end': 'Ngร y kแบฟt thรบc', - -'form.basic-form.date.required': 'Vui lรฒng chแปn ngร y bแบฏt ฤ‘แบงu vร  ngร y kแบฟt thรบc', - -'form.basic-form.goal.label': 'Mรด tแบฃ mแปฅc tiรชu', - -'form.basic-form.goal.placeholder': 'Vui lรฒng nhแบญp mแปฅc tiรชu cรดng viแป‡c theo tแปซng giai ฤ‘oแบกn', - -'form.basic-form.goal.required': 'Vui lรฒng nhแบญp mแปฅc tiรชu Mรด tแบฃ', -'form.basic-form.standard.label': 'Sแป‘ liแป‡u', - -'form.basic-form.standard.placeholder': 'Vui lรฒng nhแบญp sแป‘ liแป‡u', - -'form.basic-form.standard.required': 'Vui lรฒng nhแบญp sแป‘ liแป‡u', - -'form.basic-form.client.label': 'Khรกch hร ng', - -'form.basic-form.client.required': 'Vui lรฒng mรด tแบฃ khรกch hร ng bแบกn ฤ‘ang phแปฅc vแปฅ', - -'form.basic-form.label.tooltip': 'ฤแป‘i tฦฐแปฃng mแปฅc tiรชu', - -'form.basic-form.client.placeholder': 'Vui lรฒng mรด tแบฃ khรกch hร ng bแบกn ฤ‘ang phแปฅc vแปฅ; khรกch hร ng nแป™i bแป™ cรณ thแปƒ trแปฑc tiแบฟp lร  @tรชn/ID nhรขn viรชn', - -'form.basic-form.invites.label': 'Ngฦฐแปi mแปi', - -'form.basic-form.invites.placeholder': 'Vui lรฒng trแปฑc tiแบฟp lร  @tรชn/ID nhรขn viรชn; Cรณ thแปƒ mแปi tแป‘i ฤ‘a 5 ngฦฐแปi', -'form.basic-form.weight.label': 'Trแปng lฦฐแปฃng', - -'form.basic-form.weight.placeholder': 'Vui lรฒng nhแบญp', - -'form.basic-form.public.label': 'Mแปฅc tiรชu cรดng khai', - -'form.basic-form.label.help': 'Khรกch hร ng vร  ngฦฐแปi ฤ‘รกnh giรก ฤ‘ฦฐแปฃc chia sแบป theo mแบทc ฤ‘แป‹nh', - -'form.basic-form.radio.public': 'Cรดng khai', - -'form.basic-form.radio.partially-public': 'Cรดng khai mแป™t phแบงn', - -'form.basic-form.radio.private': 'Khรดng cรดng khai', - -'form.basic-form.publicUsers.placeholder': 'Cรดng khai cho', - -'form.basic-form.option.A': 'ฤแป“ng nghiแป‡p 1', - -'form.basic-form.option.B': 'ฤแป“ng nghiแป‡p 2', - -'form.basic-form.option.C': 'ฤแป“ng nghiแป‡p sแป‘ Ba', - -'form.basic-form.email.required': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ email cแปงa bแบกn!', - -'form.basic-form.email.wrong-format': 'ฤแป‹nh dแบกng ฤ‘แป‹a chแป‰ email khรดng chรญnh xรกc!', - -'form.basic-form.userName.required': 'Vui lรฒng nhแบญp tรชn ngฦฐแปi dรนng cแปงa bแบกn!', - -'form.basic-form.password.required': 'Vui lรฒng nhแบญp mแบญt khแบฉu cแปงa bแบกn!', - -'form.basic-form.password.twice': 'Hai mแบญt khแบฉu khรดng khแป›p!', - -'form.basic-form.strength.msg': 'Vui lรฒng nhแบญp รญt nhแบฅt 6 kรฝ tแปฑ. Vui lรฒng khรดng sแปญ dแปฅng mแบญt khแบฉu dแป… ฤ‘oรกn.', - -'form.basic-form.strength.strong': 'ฤแป™ mแบกnh: Mแบกnh', - -'form.basic-form.strength.medium': 'ฤแป™ mแบกnh: Trung bรฌnh', - -'form.basic-form.strength.short': 'ฤแป™ mแบกnh: Quรก ngแบฏn', - -'form.basic-form.confirm-password.required': 'Vui lรฒng xรกc nhแบญn mแบญt khแบฉu!', - -'form.basic-form.phone-number.required': 'Vui lรฒng nhแบญp sแป‘ ฤ‘iแป‡n thoแบกi cแปงa bแบกn!', - -'form.basic-form.phone-number.wrong-format': 'ฤแป‹nh dแบกng sแป‘ ฤ‘iแป‡n thoแบกi khรดng chรญnh xรกc!', - -'form.basic-form.verification-code.required': 'Vui lรฒng nhแบญp mรฃ xรกc minh!', - -'form.basic-form.form.get-captcha': 'Lแบฅy mรฃ xรกc minh mรฃ', - -'form.basic-form.captcha.second': 'giรขy', - -'form.basic-form.form.optional': '(Tรนy chแปn)', - -'form.basic-form.form.submit': 'Gแปญi', - -'form.basic-form.form.save': 'Lฦฐu', - -'form.basic-form.email.placeholder': 'Email', - -'form.basic-form.password.placeholder': 'Mแบญt khแบฉu phแบฃi cรณ รญt nhแบฅt 6 kรฝ tแปฑ, phรขn biแป‡t chแปฏ hoa chแปฏ thฦฐแปng', - -'form.basic-form.confirm-password.placeholder': 'Xรกc nhแบญn mแบญt khแบฉu', - -'form.basic-form.phone-number.placeholder': 'Sแป‘ ฤ‘iแป‡n thoแบกi', - -'form.basic-form.verification-code.placeholder': 'Mรฃ xรกc minh', - -'result.success.title': 'ฤรฃ gแปญi Thร nh cรดng', - -'result.success.description': 'Trang kแบฟt quแบฃ nแป™p bร i ฤ‘ฦฐแปฃc sแปญ dแปฅng ฤ‘แปƒ cung cแบฅp phแบฃn hแป“i vแป kแบฟt quแบฃ xแปญ lรฝ cแปงa mแป™t loแบกt cรกc tรกc vแปฅ vแบญn hร nh. Nแบฟu chแป‰ lร  mแป™t thao tรกc ฤ‘ฦกn giแบฃn, thรดng bรกo Tin nhแบฏn toร n cแปฅc lร  ฤ‘แปง. Vรนng vฤƒn bแบฃn nร y cรณ thแปƒ hiแปƒn thแป‹ cรกc giแบฃi thรญch bแป• sung ฤ‘ฦกn giแบฃn. Nแบฟu cแบงn hiแปƒn thแป‹ nแป™i dung nhฦฐ mแป™t "tร i liแป‡u", vรนng mร u xรกm bรชn dฦฐแป›i cรณ thแปƒ hiแปƒn thแป‹ nแป™i dung phแปฉc tแบกp hฦกn.', - -'result.success.operate-title': 'Tรชn dแปฑ รกn', - -'result.success.operate-id': 'ID dแปฑ รกn', - -'result.success.principal': 'Ngฦฐแปi phแปฅ trรกch', - -'result.success.operate-time': 'Thแปi gian hiแป‡u quแบฃ', - -'result.success.step1-title': 'Tแบกo dแปฑ รกn', - -'result.success.step1-operator': 'Qu Lili', - -'result.success.step2-title': 'ฤรกnh giรก ban ฤ‘แบงu cแปงa phรฒng ban', - -'result.success.step2-operator': 'Zhou Maomao', - -'result.success.step2-extra': 'Theo dรตi', - -'result.success.step3-title': 'ฤรกnh giรก tร i chรญnh', - -'result.success.step4-title': 'Hoร n thร nh', - -'result.success.btn-return': 'Quay lแบกi danh sรกch', - -'result.success.btn-project': 'Xem dแปฑ รกn', - -'result.success.btn-print': 'In', - -'result.fail.error.title': 'Gแปญi bร i khรดng thร nh cรดng', - -'result.fail.error.description': 'Vui lรฒng kiแปƒm tra vร  chแป‰nh sแปญa thรดng tin sau trฦฐแป›c khi gแปญi lแบกi.', - -'result.fail.error.hint-title': 'Nแป™i dung bแบกn ฤ‘รฃ gแปญi cรณ cรกc lแป—i sau:', - -'result.fail.error.hint-text1': 'Tร i khoแบฃn cแปงa bแบกn ฤ‘รฃ bแป‹ ฤ‘รณng bฤƒng', - -'result.fail.error.hint-btn1': 'MแปŸ khรณa ngay lแบญp tแปฉc', - -'result.fail.error.hint-text2': 'Tร i khoแบฃn cแปงa bแบกn chฦฐa ฤ‘แปง ฤ‘iแปu kiแป‡n ฤ‘แปƒ ฤ‘ฤƒng kรฝ', - -'result.fail.error.hint-btn2': 'Nรขng cแบฅp ngay lแบญp tแปฉc', - -'result.fail.error.btn-text': 'Quay lแบกi chแป‰nh sแปญa', - -'account.settings.menuMap.custom': 'Cรก nhรขn hรณa', - -'account.settings.menuMap.binding': 'Liรชn kแบฟt tร i khoแบฃn', - -'account.settings.basic.avatar': 'Avatar', - -'account.settings.basic.change-avatar': 'Thay ฤ‘แป•i แบฃnh ฤ‘แบกi diแป‡n', - -'account.settings.basic.email': 'ฤแป‹a chแป‰ email', - -'account.settings.basic.email-message': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ email cแปงa bแบกn!', - -'account.settings.basic.nickname': 'Biแป‡t danh', - -'account.settings.basic.nickname-message': 'Vui lรฒng nhแบญp biแป‡t danh cแปงa bแบกn!', - -'account.settings.basic.profile': 'Hแป“ sฦก', - -'account.settings.basic.profile-message': 'Vui lรฒng nhแบญp thรดng tin hแป“ sฦก cแปงa bแบกn!', - -'account.settings.basic.profile-placeholder': 'Hแป“ sฦก', - -'account.settings.basic.country': 'Quแป‘c gia/Vรนng', - -'account.settings.basic.country-message': 'Vui lรฒng nhแบญp quแป‘c gia cแปงa bแบกn hoแบทc khu vแปฑc!', - -'account.settings.basic.geographic': 'Tแป‰nh vร  Thร nh phแป‘', - -'account.settings.basic.geographic-message': 'Vui lรฒng nhแบญp tแป‰nh vร  thร nh phแป‘ cแปงa bแบกn!', - -'account.settings.basic.address': 'ฤแป‹a chแป‰ ฤ‘ฦฐแปng phแป‘', - -'account.settings.basic.address-message': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ ฤ‘ฦฐแปng phแป‘ cแปงa bแบกn!', - -'account.settings.basic.phone': 'Sแป‘ ฤ‘iแป‡n thoแบกi', - -'account.settings.basic.phone-message': 'Vui lรฒng nhแบญp sแป‘ ฤ‘iแป‡n thoแบกi cแปงa bแบกn!', - -'account.settings.basic.update': 'Cแบญp nhแบญt thรดng tin cฦก bแบฃn', - -'account.settings.basic.update.success': 'ฤรฃ cแบญp nhแบญt thรดng tin cฦก bแบฃn thร nh cรดng', - -'account.settings.security.strong': 'Mแบกnh', - -'account.settings.security.medium': 'Trung bรฌnh', - -'account.settings.security.weak': 'Yแบฟu', - -'account.settings.security.password': 'Mแบญt khแบฉu tร i khoแบฃn', - -'account.settings.security.password-description': 'ฤแป™ mแบกnh mแบญt khแบฉu hiแป‡n tแบกi:', - -'account.settings.security.phone': 'Sแป‘ ฤ‘iแป‡n thoแบกi bแบฃo mแบญt', - -'account.settings.security.phone-description': 'Sแป‘ ฤ‘iแป‡n thoแบกi liรชn kแบฟt:', - -'account.settings.security.question': 'Cรขu hแปi bแบฃo mแบญt', - -'account.settings.security.question-description': 'Chฦฐa thiแบฟt lแบญp cรขu hแปi bแบฃo mแบญt nร o. Cรขu hแปi bแบฃo mแบญt cรณ thแปƒ bแบฃo vแป‡ hiแป‡u quแบฃ tรญnh bแบฃo mแบญt cแปงa tร i khoแบฃn', - -'account.settings.security.email': 'Email liรชn kแบฟt', - -'account.settings.security.email-description': 'Sแป‘ email liรชn kแบฟt:', - -'account.settings.security.mfa': 'Thiแบฟt bแป‹ MFA', - -'account.settings.security.mfa-description': 'Thiแบฟt bแป‹ MFA chฦฐa liรชn kแบฟt. Viแป‡c liรชn kแบฟt sแบฝ cho phรฉp xรกc nhแบญn thแปฉ cแบฅp', - -'account.settings.security.modify': 'Sแปญa ฤ‘แป•i', - -'account.settings.security.set': 'Cร i ฤ‘แบทt', - -'account.settings.security.bind': 'Liรชn kแบฟt', - -'account.settings.binding.taobao': 'Liรชn kแบฟt Taobao', - -'account.settings.binding.taobao-description': 'Hiแป‡n chฦฐa ฤ‘ฦฐแปฃc liรชn kแบฟt vแป›i tร i khoแบฃn Taobao', - -'account.settings.binding.alipay': 'Liรชn kแบฟt Alipay', - -'account.settings.binding.alipay-description': 'Hiแป‡n chฦฐa ฤ‘ฦฐแปฃc liรชn kแบฟt vแป›i tร i khoแบฃn Alipay', - -'account.settings.binding.dingding': 'Liรชn kแบฟt DingTalk', - -'account.settings.binding.dingding-description': 'Hiแป‡n chฦฐa ฤ‘ฦฐแปฃc liรชn kแบฟt vแป›i tร i khoแบฃn DingTalk', - -'account.settings.binding.bind': 'Liรชn kแบฟt', - -'account.settings.notification.password': 'Mแบญt khแบฉu tร i khoแบฃn', - -'account.settings.notification.password-description': 'Tin nhแบฏn tแปซ ngฦฐแปi dรนng khรกc sแบฝ ฤ‘ฦฐแปฃc gแปญi qua thรดng bรกo trong แปฉng dแปฅng', - -'account.settings.notification.messages': 'Tin nhแบฏn hแป‡ thแป‘ng', - -'account.settings.notification.messages-description': 'Tin nhแบฏn hแป‡ thแป‘ng sแบฝ ฤ‘ฦฐแปฃc gแปญi qua thรดng bรกo trong แปฉng dแปฅng', - -'account.settings.notification.todo': 'Viแป‡c cแบงn lร m', - -'account.settings.notification.todo-description': 'Viแป‡c cแบงn lร m sแบฝ ฤ‘ฦฐแปฃc gแปญi qua thรดng bรกo trong แปฉng dแปฅng', - -'account.settings.settings.open': 'Bแบญt', - -'account.settings.settings.close': 'Tแบฏt', - -'trading-assistant.title': 'Trแปฃ lรฝ giao dแป‹ch', - -'trading-assistant.strategyList': 'Chiแบฟn lฦฐแปฃc Danh sรกch', - -'trading-assistant.createStrategy': 'Tแบกo chiแบฟn lฦฐแปฃc', - -'trading-assistant.noStrategy': 'Khรดng cรณ chiแบฟn lฦฐแปฃc nร o', - -'trading-assistant.selectStrategy': 'Chแปn mแป™t chiแบฟn lฦฐแปฃc tแปซ bรชn trรกi ฤ‘แปƒ xem chi tiแบฟt', - -'trading-assistant.startStrategy': 'Bแบฏt โ€‹โ€‹ฤ‘แบงu chiแบฟn lฦฐแปฃc', - -'trading-assistant.stopStrategy': 'Dแปซng chiแบฟn lฦฐแปฃc', - -'trading-assistant.editStrategy': 'Chแป‰nh sแปญa chiแบฟn lฦฐแปฃc', - -'trading-assistant.deleteStrategy': 'Xรณa chiแบฟn lฦฐแปฃc', - -'trading-assistant.status.running': 'ฤang chแบกy', - -'trading-assistant.status.stopped': 'ฤรฃ dแปซng', - -'trading-assistant.status.error': 'Lแป—i', - -'trading-assistant.strategyType.IndicatorStrategy': 'Chแป‰ bรกo kแปน thuแบญt Chiแบฟn lฦฐแปฃc', - -'trading-assistant.strategyType.PromptBasedStrategy': 'Chiแบฟn lฦฐแปฃc dแปฑa trรชn lแปi nhแบฏc', - -'trading-assistant.strategyType.GridStrategy': 'Chiแบฟn lฦฐแปฃc lฦฐแป›i', - -'trading-assistant.tabs.tradingRecords': 'Hแป“ sฦก giao dแป‹ch', - -'trading-assistant.tabs.positions': 'Vแป‹ thแบฟ', - -'trading-assistant.tabs.equityCurve': 'ฤฦฐแปng cong vแป‘n chแปง sแปŸ hแปฏu', - -'trading-assistant.form.step1': 'Chแปn chแป‰ bรกo', - -'trading-assistant.form.step2': 'Cแบฅu hรฌnh sร n giao dแป‹ch', - -'trading-assistant.form.step3': 'Tham sแป‘ chiแบฟn lฦฐแปฃc', - -'trading-assistant.form.indicator': 'Chแปn chแป‰ bรกo', - -'trading-assistant.form.indicatorHint': 'Chแป‰ chแปn cรกc chแป‰ bรกo kแปน thuแบญt bแบกn muแป‘n ฤ‘รฃ mua hoแบทc tแบกo', - -'trading-assistant.form.qdtCostHints': 'Viแป‡c sแปญ dแปฅng chiแบฟn lฦฐแปฃc nร y sแบฝ tiรชu tแป‘n QDT; vui lรฒng ฤ‘แบฃm bแบฃo tร i khoแบฃn cแปงa bแบกn cรณ ฤ‘แปง sแป‘ dฦฐ QDT', - -'trading-assistant.form.indicatorDescription': 'Mรด tแบฃ chแป‰ bรกo', - -'trading-assistant.form.noDescription': 'Khรดng cรณ mรด tแบฃ', - -'trading-assistant.form.exchange': 'Chแปn sร n giao dแป‹ch', - -'trading-assistant.form.apiKey': 'Khรณa API', - -'trading-assistant.form.secretKey': 'Khรณa bรญ mแบญt', - -'trading-assistant.form.passphrase': 'Mแบญt khแบฉu', - -'trading-assistant.form.testConnection': 'Kiแปƒm tra kแบฟt nแป‘i', - -'trading-assistant.form.strategyName': 'Tรชn chiแบฟn lฦฐแปฃc', - -'trading-assistant.form.symbol': 'Cแบทp giao dแป‹ch', - -'trading-assistant.form.symbolHint': 'Hiแป‡n tแบกi chแป‰ hแป— trแปฃ cรกc cแบทp giao dแป‹ch tiแปn ฤ‘iแป‡n tแปญ', - -'trading-assistant.form.initialCapital': 'Vแป‘n ban ฤ‘แบงu', - -'trading-assistant.form.marketType': 'Loแบกi thแป‹ trฦฐแปng', - -'trading-assistant.form.marketTypeFutures': 'Hแปฃp ฤ‘แป“ng tฦฐฦกng lai', - -'trading-assistant.form.marketTypeSpot': 'Giao dแป‹ch giao ngay', - -'trading-assistant.form.marketTypeHint': 'Hแปฃp ฤ‘แป“ng hแป— trแปฃ giao dแป‹ch hai chiแปu vร  ฤ‘รฒn bแบฉy; Giao dแป‹ch giao ngay chแป‰ hแป— trแปฃ vแป‹ thแบฟ mua vแป›i ฤ‘รฒn bแบฉy cแป‘ ฤ‘แป‹nh lร  1x', - -'trading-assistant.form.leverage': 'Tแปท lแป‡ ฤ‘รฒn bแบฉy', - -'trading-assistant.form.leverageHint': 'Hแปฃp ฤ‘แป“ng: 1-125x, Giao ngay: Cแป‘ ฤ‘แป‹nh 1x', - -'trading-assistant.form.spotLeverageFixed': 'ฤรฒn bแบฉy giao dแป‹ch giao ngay ฤ‘ฦฐแปฃc cแป‘ ฤ‘แป‹nh แปŸ mแปฉc 1x', - -'trading-assistant.form.spotOnlyLongHint': 'Giao dแป‹ch giao ngay chแป‰ hแป— trแปฃ vแป‹ thแบฟ mua', - -'trading-assistant.form.tradeDirection': 'Hฦฐแป›ng giao dแป‹ch', - -'trading-assistant.form.tradeDirectionLong': 'Chแป‰ mua', - -'trading-assistant.form.tradeDirectionShort': 'Chแป‰ bรกn', - -'trading-assistant.form.tradeDirectionBoth': 'Hai chiแปu giao dแป‹ch', - -'trading-assistant.form.timeframe': 'Khung thแปi gian', - -'trading-assistant.form.klinePeriod': 'Chu kแปณ K-Line', - -'trading-assistant.form.timeframe1m': '1 phรบt', - -'trading-assistant.form.timeframe5m': '5 phรบt', - -'trading-assistant.form.timeframe15m': '15 phรบt', - -'trading-assistant.form.timeframe30m': '30 phรบt', - -'trading-assistant.form.timeframe1H': '1 giแป', - -'trading-assistant.form.timeframe4H': '4 giแป', - -'trading-assistant.form.timeframe1D': '1 ngร y', - -'trading-assistant.form.selectStrategyType': 'Chแปn loแบกi chiแบฟn lฦฐแปฃc', - -'trading-assistant.form.indicatorStrategy': 'Chiแบฟn lฦฐแปฃc chแป‰ bรกo', - -'trading-assistant.form.indicatorStrategyDesc': 'Chiแบฟn lฦฐแปฃc giao dแป‹ch tแปฑ ฤ‘แป™ng dแปฑa trรชn chแป‰ bรกo kแปน thuแบญt', - -'trading-assistant.form.aiStrategy': 'Chiแบฟn lฦฐแปฃc AI', - -'trading-assistant.form.aiStrategyDesc': 'Chiแบฟn lฦฐแปฃc giao dแป‹ch tแปฑ ฤ‘แป™ng dแปฑa trรชn quyแบฟt ฤ‘แป‹nh thรดng minh AI', - -'trading-assistant.form.enableAiFilter': 'Bแบญt bแป™ lแปc quyแบฟt ฤ‘แป‹nh thรดng minh AI', - -'trading-assistant.form.enableAiFilterHint': 'Khi bแบญt, tรญn hiแป‡u chแป‰ bรกo sแบฝ ฤ‘ฦฐแปฃc lแปc bแปŸi AI ฤ‘แปƒ cแบฃi thiแป‡n chแบฅt lฦฐแปฃng giao dแป‹ch', - -'trading-assistant.form.aiFilterPrompt': 'Lแปi nhแบฏc tรนy chแป‰nh', - -'trading-assistant.form.aiFilterPromptHint': 'Cung cแบฅp hฦฐแป›ng dแบซn tรนy chแป‰nh cho bแป™ lแปc AI, ฤ‘แปƒ trแป‘ng ฤ‘แปƒ sแปญ dแปฅng mแบทc ฤ‘แป‹nh hแป‡ thแป‘ng', - -'trading-assistant.validation.strategyTypeRequired': 'Vui lรฒng chแปn loแบกi chiแบฟn lฦฐแปฃc', - -'trading-assistant.form.advancedSettings': 'Cร i ฤ‘แบทt nรขng cao', - -'trading-assistant.form.orderMode': 'Chแบฟ ฤ‘แป™ ฤ‘แบทt lแป‡nh', - -'trading-assistant.form.orderModeMaker': 'Maker', - -'trading-assistant.form.orderModeTaker': 'Giรก thแป‹ trฦฐแปng', - -'trading-assistant.form.orderModeHint': 'Chแบฟ ฤ‘แป™ Maker sแปญ dแปฅng lแป‡nh giแป›i hแบกn, phรญ thแบฅp hฦกn; chแบฟ ฤ‘แป™ Market thแปฑc hiแป‡n ngay lแบญp tแปฉc, phรญ cao hฦกn', - -'trading-assistant.form.makerWaitSec': 'Thแปi gian chแป cแปงa Maker (giรขy)', - -'trading-assistant.form.makerWaitSecHint': 'Thแปi gian chแป sau khi ฤ‘แบทt lแป‡nh; ', -'trading-assistant.form.makerRetries': 'Sแป‘ lแบงn thแปญ lแบกi cho lแป‡nh maker', - -'trading-assistant.form.makerRetriesHint': 'Sแป‘ lแบงn thแปญ lแบกi tแป‘i ฤ‘a nแบฟu lแป‡nh maker khรดng ฤ‘ฦฐแปฃc khแป›p', - -'trading-assistant.form.fallbackToMarket': 'Hแบก cแบฅp lแป‡nh maker thแบฅt bแบกi xuแป‘ng giรก thแป‹ trฦฐแปng', - -'trading-assistant.form.fallbackToMarketHint': 'Cรณ nรชn hแบก cแบฅp cรกc lแป‡nh mแปŸ/ฤ‘รณng ฤ‘ang chแป xแปญ lรฝ thร nh lแป‡nh thแป‹ trฦฐแปng ฤ‘แปƒ ฤ‘แบฃm bแบฃo thแปฑc hiแป‡n khi chรบng khรดng ฤ‘ฦฐแปฃc khแป›p hay khรดng', - -'trading-assistant.form.marginMode': 'Chแบฟ ฤ‘แป™ kรฝ quแปน', - -'trading-assistant.form.marginModeCross': 'Kรฝ quแปน chรฉo', - -'trading-assistant.form.marginModeIsolated': 'Kรฝ quแปน riรชng biแป‡t Kรฝ quแปน', - -'trading-assistant.form.stopLossPct': 'Tแปท lแป‡ cแบฏt lแป— (%)', - -'trading-assistant.form.stopLossPctHint': 'Thiแบฟt lแบญp tแปท lแป‡ cแบฏt lแป—; 0 cho biแบฟt lแป‡nh dแปซng lแป— khรดng ฤ‘ฦฐแปฃc bแบญt', - -'trading-assistant.form.takeProfitPct': 'Tแปท lแป‡ chแป‘t lแปi (%)', - -'trading-assistant.form.takeProfitPctHint': 'Thiแบฟt lแบญp tแปท lแป‡ chแป‘t lแปi, 0 cho biแบฟt lแป‡nh chแป‘t lแปi khรดng ฤ‘ฦฐแปฃc bแบญt', - -'trading-assistant.form.signalMode': 'Chแบฟ ฤ‘แป™ tรญn hiแป‡u', - -'trading-assistant.form.signalModeConfirmed': 'Chแบฟ ฤ‘แป™ xรกc nhแบญn', - -'trading-assistant.form.signalModeAggressive': 'Chแบฟ ฤ‘แป™ giao dแป‹ch tรญch cแปฑc', - -'trading-assistant.form.signalModeHint': 'Chแบฟ ฤ‘แป™ xรกc nhแบญn: Chแป‰ kiแปƒm tra cรกc nแบฟn ฤ‘รฃ hoร n thร nh; Chแบฟ ฤ‘แป™ giao dแป‹ch tรญch cแปฑc: Kiแปƒm tra cแบฃ viแป‡c hรฌnh thร nh nแบฟn', - -'trading-assistant.form.cancel': 'Hแปงy', - -'trading-assistant.form.prev': 'Bฦฐแป›c trฦฐแป›c', - -'trading-assistant.form.next': 'Bฦฐแป›c tiแบฟp theo', - -'trading-assistant.form.confirmCreate': 'Xรกc nhแบญn tแบกo', - -'trading-assistant.form.confirmEdit': 'Xรกc nhแบญn chแป‰nh sแปญa', - -'trading-assistant.messages.createSuccess': 'Tแบกo chiแบฟn lฦฐแปฃc thร nh cรดng', - -'trading-assistant.messages.createFailed': 'Tแบกo chiแบฟn lฦฐแปฃc thแบฅt bแบกi', - -'trading-assistant.messages.updateSuccess': 'Cแบญp nhแบญt chiแบฟn lฦฐแปฃc thร nh cรดng', - -'trading-assistant.messages.updateFailed': 'Cแบญp nhแบญt chiแบฟn lฦฐแปฃc thแบฅt bแบกi', -'trading-assistant.messages.deleteSuccess': 'Xรณa chiแบฟn lฦฐแปฃc thร nh cรดng', - -'trading-assistant.messages.deleteFailed': 'Xรณa chiแบฟn lฦฐแปฃc thแบฅt bแบกi', - -'trading-assistant.messages.startSuccess': 'KhแปŸi ฤ‘แป™ng chiแบฟn lฦฐแปฃc thร nh cรดng', - -'trading-assistant.messages.startFailed': 'KhแปŸi ฤ‘แป™ng chiแบฟn lฦฐแปฃc thแบฅt bแบกi', - -'trading-assistant.messages.stopSuccess': 'Chรญnh sรกch ฤ‘รฃ dแปซng thร nh cรดng', - -'trading-assistant.messages.stopFailed': 'Dแปซng chรญnh sรกch thแบฅt bแบกi', - -'trading-assistant.messages.loadFailed': 'Khรดng thแปƒ tแบฃi danh sรกch chรญnh sรกch', - -'trading-assistant.messages.runningWarning': 'Chรญnh sรกch ฤ‘ang chแบกy, vui lรฒng dแปซng chรญnh sรกch trฦฐแป›c khi sแปญa ฤ‘แป•i', -'trading-assistant.messages.deleteConfirmWithName': 'Bแบกn cรณ chแบฏc chแบฏn muแป‘n xรณa chรญnh sรกch "{name}" khรดng? Thao tรกc nร y khรดng thแปƒ ฤ‘แบฃo ngฦฐแปฃc.', - -'trading-assistant.messages.deleteConfirm': 'Bแบกn cรณ chแบฏc chแบฏn muแป‘n xรณa chรญnh sรกch nร y khรดng? Thao tรกc nร y khรดng thแปƒ ฤ‘แบฃo ngฦฐแปฃc.', - -'trading-assistant.messages.loadTradesFailed': 'Khรดng thแปƒ truy xuแบฅt hแป“ sฦก giao dแป‹ch', - -'trading-assistant.messages.loadPositionsFailed': 'Khรดng thแปƒ truy xuแบฅt hแป“ sฦก vแป‹ thแบฟ', - -'trading-assistant.messages.loadEquityFailed': 'Khรดng thแปƒ truy xuแบฅt ฤ‘ฦฐแปng cong vแป‘n chแปง sแปŸ hแปฏu', - -'trading-assistant.messages.loadIndicatorsFailed': 'Khรดng thแปƒ tแบฃi danh sรกch chแป‰ bรกo, vui lรฒng thแปญ lแบกi sau', - -'trading-assistant.messages.spotLimitations': 'Giao dแป‹ch giao ngay ฤ‘รฃ ฤ‘ฦฐแปฃc tแปฑ ฤ‘แป™ng thiแบฟt lแบญp chแป‰ mua, ฤ‘รฒn bแบฉy 1x', - -'trading-assistant.messages.autoFillApiConfig': 'Cแบฅu hรฌnh API lแป‹ch sแปญ cho sร n giao dแป‹ch nร y ฤ‘รฃ ฤ‘ฦฐแปฃc tแปฑ ฤ‘แป™ng ฤ‘iแปn', - -'trading-assistant.placeholders.selectIndicator': 'Vui lรฒng chแปn mแป™t chแป‰ bรกo indicator', -'trading-assistant.placeholders.selectExchange': 'Vui lรฒng chแปn mแป™t sร n giao dแป‹ch', - -'trading-assistant.placeholders.inputApiKey': 'Vui lรฒng nhแบญp Khรณa API', - -'trading-assistant.placeholders.inputSecretKey': 'Vui lรฒng nhแบญp Khรณa bรญ mแบญt', - -'trading-assistant.placeholders.inputPassphrase': 'Vui lรฒng nhแบญp Mแบญt khแบฉu', - -'trading-assistant.placeholders.inputStrategyName': 'Vui lรฒng nhแบญp tรชn chiแบฟn lฦฐแปฃc', - -'trading-assistant.placeholders.selectSymbol': 'Vui lรฒng chแปn mแป™t cแบทp giao dแป‹ch', - -'trading-assistant.placeholders.selectTimeframe': 'Vui lรฒng chแปn mแป™t khung thแปi gian', - -'trading-assistant.placeholders.selectKlinePeriod': 'Vui lรฒng chแปn chu kแปณ K-Line', - -'trading-assistant.placeholders.inputAiFilterPrompt': 'Vui lรฒng nhแบญp lแปi nhแบฏc tรนy chแป‰nh (tรนy chแปn)', - -'trading-assistant.validation.indicatorRequired': 'Vui lรฒng chแปn mแป™t chแป‰ bรกo', - -'trading-assistant.validation.exchangeRequired': 'Vui lรฒng chแปn mแป™t sร n giao dแป‹ch', -'trading-assistant.validation.apiKeyRequired': 'Vui lรฒng nhแบญp Khรณa API', - -'trading-assistant.validation.secretKeyRequired': 'Vui lรฒng nhแบญp Khรณa bรญ mแบญt', - -'trading-assistant.validation.passphraseRequired': 'Vui lรฒng nhแบญp Mแบญt khแบฉu', - -'trading-assistant.validation.exchangeConfigIncomplete': 'Vui lรฒng ฤ‘iแปn ฤ‘แบงy ฤ‘แปง thรดng tin cแบฅu hรฌnh sร n giao dแป‹ch', -'trading-assistant.validation.testConnectionRequired': 'Vui lรฒng nhแบฅp vร o nรบt "Kiแปƒm tra kแบฟt nแป‘i" vร  ฤ‘แบฃm bแบฃo kแบฟt nแป‘i thร nh cรดng', -'trading-assistant.validation.testConnectionFailed': 'Kiแปƒm tra kแบฟt nแป‘i thแบฅt bแบกi, vui lรฒng kiแปƒm tra cแบฅu hรฌnh vร  thแปญ lแบกi', - -'trading-assistant.validation.strategyNameRequired': 'Vui lรฒng nhแบญp tรชn chiแบฟn lฦฐแปฃc', - -'trading-assistant.validation.symbolRequired': 'Vui lรฒng chแปn mแป™t cแบทp giao dแป‹ch ...apiKeyRequired', - -'trading-assistant.apiKeyRequired': 'Vui lรฒng Nhแบญp khรณa API', - -'trading-assistant.validation.initialCapitalRequired': 'Vui lรฒng nhแบญp vแป‘n ban ฤ‘แบงu', - -'trading-assistant.validation.leverageRequired': 'Vui lรฒng nhแบญp tแปท lแป‡ ฤ‘รฒn bแบฉy', - -'trading-assistant.table.time': 'Thแปi gian', - -'trading-assistant.table.type': 'Loแบกi', - -'trading-assistant.table.price': 'Giรก', - -'trading-assistant.table.amount': 'Sแป‘ tiแปn', - -'trading-assistant.table.value': 'Sแป‘ tiแปn', - -'trading-assistant.table.commission': 'Phรญ hoa hแป“ng', - -'trading-assistant.table.symbol': 'Cแบทp giao dแป‹ch', - -'trading-assistant.table.side': 'Hฦฐแป›ng', - -'trading-assistant.table.size': 'Vแป‹ thแบฟ kรญch thฦฐแป›c', - -'trading-assistant.table.entryPrice': 'Giรก vร o lแป‡nh', - -'trading-assistant.table.currentPrice': 'Giรก hiแป‡n tแบกi', - -'trading-assistant.table.unrealizedPnl': 'Lแปฃi nhuแบญn/Thua lแป— chฦฐa thแปฑc hiแป‡n', - -'trading-assistant.table.pnlPercent': 'Tแปท lแป‡ lแปฃi nhuแบญn/thua lแป—', - -'trading-assistant.table.buy': 'Mua', - -'trading-assistant.table.sell': 'Bรกn', - -'trading-assistant.table.long': 'Mua', - -'trading-assistant.table.short': 'Bรกn', - -'trading-assistant.table.noPositions': 'Khรดng cรณ vแป‹ thแบฟ', - -'trading-assistant.detail.title': 'Chi tiแบฟt chiแบฟn lฦฐแปฃc', - -'trading-assistant.detail.strategyName': 'Chiแบฟn lฦฐแปฃc Tรชn', - -'trading-assistant.detail.strategyType': 'Loแบกi chiแบฟn lฦฐแปฃc', - -'trading-assistant.detail.status': 'Trแบกng thรกi', - -'trading-assistant.detail.tradingMode': 'Chแบฟ ฤ‘แป™ giao dแป‹ch', - -'trading-assistant.detail.exchange': 'Sร n giao dแป‹ch', - -'trading-assistant.detail.initialCapital': 'Vแป‘n ban ฤ‘แบงu', - -'trading-assistant.detail.totalInvestment': 'Tแป•ng vแป‘n ฤ‘แบงu tฦฐ', - -'trading-assistant.detail.currentEquity': 'Vแป‘n chแปง sแปŸ hแปฏu hiแป‡n tแบกi', - -'trading-assistant.detail.totalPnl': 'Tแป•ng lแปฃi nhuแบญn/thua lแป—', - -'trading-assistant.detail.indicatorName': 'Tรชn chแป‰ bรกo', - -'trading-assistant.detail.maxLeverage': 'ฤรฒn bแบฉy tแป‘i ฤ‘a ฤรฒn bแบฉy', - -'trading-assistant.detail.decideInterval': 'Khoแบฃng thแปi gian quyแบฟt ฤ‘แป‹nh', - -'trading-assistant.detail.symbols': 'Cรดng cแปฅ giao dแป‹ch', - -'trading-assistant.detail.createdAt': 'Thแปi gian tแบกo', - -'trading-assistant.detail.updatedAt': 'Thแปi gian cแบญp nhแบญt', - -'trading-assistant.detail.llmConfig': 'Cแบฅu hรฌnh mรด hรฌnh AI', - -'trading-assistant.detail.exchangeConfig': 'Cแบฅu hรฌnh sร n giao dแป‹ch', - -'trading-assistant.detail.provider': 'Nhร  cung cแบฅp', - -'trading-assistant.detail.modelId': 'ID mรด hรฌnh', - -'trading-assistant.detail.close': 'ฤรณng', - -'trading-assistant.detail.loadFailed': 'Khรดng thแปƒ truy xuแบฅt chiแบฟn lฦฐแปฃc chi tiแบฟt', - -'trading-assistant.equity.noData': 'Khรดng cรณ dแปฏ liแป‡u giรก trแป‹ tร i sแบฃn rรฒng', - -'trading-assistant.equity.equity': 'Giรก trแป‹ tร i sแบฃn rรฒng', - -'trading-assistant.exchange.tradingMode': 'Chแบฟ ฤ‘แป™ giao dแป‹ch', - -'trading-assistant.exchange.virtual': 'Giao dแป‹ch thแปญ nghiแป‡m', - -'trading-assistant.exchange.live': 'Giao dแป‹ch trแปฑc tiแบฟp', - -'trading-assistant.exchange.selectExchange': 'Chแปn sร n giao dแป‹ch', - -'trading-assistant.exchange.walletAddress': 'ฤแป‹a chแป‰ vรญ', - -'trading-assistant.exchange.walletAddressPlaceholder': 'Vui lรฒng nhแบญp ฤ‘แป‹a chแป‰ vรญ cแปงa bแบกn (bแบฏt ฤ‘แบงu bแบฑng 0x)', - -'trading-assistant.exchange.privateKey': 'Khรณa riรชng tฦฐ', - -'trading-assistant.exchange.privateKeyPlaceholder': 'Vui lรฒng nhแบญp khรณa riรชng tฦฐ cแปงa bแบกn (64 kรฝ tแปฑ)', - -'trading-assistant.exchange.testConnection': 'Kiแปƒm tra kแบฟt nแป‘i', - -'trading-assistant.exchange.connectionSuccess': 'Kแบฟt nแป‘i thร nh cรดng', - -'trading-assistant.exchange.connectionFailed': 'Kแบฟt nแป‘i thแบฅt bแบกi', - -'trading-assistant.exchange.testFailed': 'Kiแปƒm tra kแบฟt nแป‘i thแบฅt bแบกi', - -'trading-assistant.exchange.fillComplete': 'Vui lรฒng ฤ‘iแปn ฤ‘แบงy ฤ‘แปง thรดng tin cแบฅu hรฌnh sร n giao dแป‹ch', - -'trading-assistant.strategyTypeOptions.ai': 'Chiแบฟn lฦฐแปฃc dแปฑa trรชn AI', - -'trading-assistant.strategyTypeOptions.indicator': 'Chiแบฟn lฦฐแปฃc chแป‰ bรกo kแปน thuแบญt', - -'trading-assistant.strategyTypeOptions.aiDeveloping': 'Chแปฉc nฤƒng chiแบฟn lฦฐแปฃc dแปฑa trรชn AI ฤ‘ang ฤ‘ฦฐแปฃc phรกt triแปƒn, hรฃy theo dรตi', - -'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'Chแปฉc nฤƒng chiแบฟn lฦฐแปฃc dแปฑa trรชn AI ฤ‘ang ฤ‘ฦฐแปฃc phรกt triแปƒn', - -'trading-assistant.indicatorType.trend': 'Xu hฦฐแป›ng', - -'trading-assistant.indicatorType.momentum': 'ฤแป™ng lฦฐแปฃng', - -'trading-assistant.indicatorType.volatility': 'Biแบฟn ฤ‘แป™ng', - -'trading-assistant.indicatorType.volume': 'Khแป‘i lฦฐแปฃng', - -'trading-assistant.indicatorType.custom': 'Tรนy chแป‰nh', - -'trading-assistant.exchangeNames': { - -'okx': 'OKX', - -'binance': 'Binance', - -'hyperliquid': 'Hyperliquid', - -'blockchaincom': 'Blockchain.com', - -'coinbaseexchange': 'Coinbase', - -'gate': 'Gate.io', - -'mexc': 'MEXC', - -'kraken': 'Kraken', -'bitfinex': 'Bitfinex', -'bybit': 'Bybit', -'kucoin': 'KuCoin', -'huobi': 'Huobi', -'bitget': 'Bitget', -'bitmex': 'BitMEX', -'gแบกch tแปซ': 'Dแปฑa trรชn', -'phemex': 'Phemex', -'bitmart': 'BitMart', -'bitstamp': 'Bitstamp', -'bittrex': 'Bittrex', -'poloniex': 'Poloniex', -'song tแปญ': 'song tแปญ', -'tiแปn ฤ‘iแป‡n tแปญ': 'Crypto.com', -'bitflyer': 'bitFlyer', -'upbit': 'Upbit', -'bithumb': 'Bithumb', -'coinone': 'Coinone', -'zb': 'ZB', -'ngรขn hร ng': 'LBank', - -'bibox': 'Bibox', - -'bigone': 'BigONE', - -'bitrue': 'Bitrue', - -'coinex': 'CoinEx', - -'digifinex': 'DigiFinex', - -'ftx': 'FTX', - -'ftxus': 'FTX US', - -'binanceus': 'Binance US', - -'binancecoinm': 'Binance COIN-M', - -'binanceusdm': 'Binance USDโ“ˆ-M', - -'deepcoin': 'Deepcoin' - -}, - -'ai-trading-assistant.title': 'Trแปฃ lรฝ giao dแป‹ch AI', - -'ai-trading-assistant.strategyList': 'Danh sรกch chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.createStrategy': 'Tแบกo chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.noStrategy': 'Khรดng cรณ chiแบฟn lฦฐแปฃc Cรณ sแบตn', - -'ai-trading-assistant.selectStrategy': 'Chแปn chiแบฟn lฦฐแปฃc tแปซ bรชn trรกi ฤ‘แปƒ xem chi tiแบฟt', - -'ai-trading-assistant.startStrategy': 'Bแบฏt โ€‹โ€‹ฤ‘แบงu chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.stopStrategy': 'Dแปซng chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.editStrategy': 'Chแป‰nh sแปญa chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.deleteStrategy': 'Xรณa chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.status.running': 'ฤang chแบกy', - -'ai-trading-assistant.status.stopped': 'ฤรฃ dแปซng', - -'ai-trading-assistant.status.error': 'Lแป—i', - -'ai-trading-assistant.tabs.tradingRecords': 'Hแป“ sฦก giao dแป‹ch', - -'ai-trading-assistant.tabs.positions': 'Vแป‹ thแบฟ', - -'ai-trading-assistant.tabs.aiDecisions': 'Bแบฃn ghi quyแบฟt ฤ‘แป‹nh cแปงa AI', - -'ai-trading-assistant.tabs.equityCurve': 'ฤฦฐแปng cong vแป‘n chแปง sแปŸ hแปฏu', - -'ai-trading-assistant.form.createTitle': 'Tแบกo chiแบฟn lฦฐแปฃc giao dแป‹ch AI', - -'ai-trading-assistant.form.editTitle': 'Chแป‰nh sแปญa chiแบฟn lฦฐแปฃc giao dแป‹ch AI', - -'ai-trading-assistant.form.strategyName': 'Tรชn chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.form.modelId': 'Mรด hรฌnh AI', - -'ai-trading-assistant.form.modelIdHint': 'Sแปญ dแปฅng dแป‹ch vแปฅ OpenRouter cแปงa hแป‡ thแป‘ng; Khรดng cแบงn cแบฅu hรฌnh khรณa API', - -'ai-trading-assistant.form.decideInterval': 'Khoแบฃng thแปi gian quyแบฟt ฤ‘แป‹nh', - -'ai-trading-assistant.form.decideInterval5m': '5 phรบt', - -'ai-trading-assistant.form.decideInterval10m': '10 phรบt', - -'ai-trading-assistant.form.decideInterval30m': '30 phรบt', - -'ai-trading-assistant.form.decideInterval1h': '1 giแป', - -'ai-trading-assistant.form.decideInterval4h': '4 giแป', - -'ai-trading-assistant.form.decideInterval1d': '1 ngร y', - -'ai-trading-assistant.form.decideInterval1w': '1 tuแบงn', - -'ai-trading-assistant.form.decideIntervalHint': 'Khoแบฃng thแปi gian cho AI ฤ‘แปƒ ฤ‘ฦฐa ra quyแบฟt ฤ‘แป‹nh', - -'ai-trading-assistant.form.runPeriod': 'Thแปi gian chแบกy', - -'ai-trading-assistant.form.runPeriodHint': 'Thแปi gian bแบฏt ฤ‘แบงu vร  kแบฟt thรบc cแปงa chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.form.startDate': 'Ngร y bแบฏt ฤ‘แบงu', - -'ai-trading-assistant.form.endDate': 'Ngร y kแบฟt thรบc', - -'ai-trading-assistant.form.qdtCostTitle': 'Mรด tแบฃ chi phรญ QDT', - -'ai-trading-assistant.form.qdtCostHint': 'Mแป—i quyแบฟt ฤ‘แป‹nh cแปงa AI sแบฝ cรณ giรก {cost} QDT. Vui lรฒng ฤ‘แบฃm bแบฃo tร i khoแบฃn cแปงa bแบกn cรณ ฤ‘แปง sแป‘ dฦฐ QDT. Chi phรญ sแบฝ ฤ‘ฦฐแปฃc trแปซ theo thแปi gian thแปฑc cho mแป—i quyแบฟt ฤ‘แป‹nh trong quรก trรฌnh chแบกy chiแบฟn lฦฐแปฃc.', - -'ai-trading-assistant.form.apiKey': 'Khรณa API', - -'ai-trading-assistant.form.exchange': 'Chแปn sร n giao dแป‹ch', - -'ai-trading-assistant.form.secretKey': 'Khรณa bรญ mแบญt', - -'ai-trading-assistant.form.passphrase': 'Mแบญt khแบฉu', - -'ai-trading-assistant.form.testConnection': 'Kiแปƒm tra kแบฟt nแป‘i', - -'ai-trading-assistant.form.symbol': 'Cแบทp giao dแป‹ch', - -'ai-trading-assistant.form.symbolHint': 'Chแปn cแบทp giao dแป‹ch', - -'ai-trading-assistant.form.initialCapital': 'Sแป‘ vแป‘n ฤ‘แบงu tฦฐ (Kรฝ quแปน)', - -'ai-trading-assistant.form.leverage': 'Tแปท lแป‡ ฤ‘รฒn bแบฉy', - -'ai-trading-assistant.form.timeframe': 'Khung thแปi gian', - -'ai-trading-assistant.form.timeframe1m': '1 phรบt', - -'ai-trading-assistant.form.timeframe5m': '5 phรบt', - -'ai-trading-assistant.form.timeframe15m': '15 phรบt', - -'ai-trading-assistant.form.timeframe30m': '30 phรบt', - -'ai-trading-assistant.form.timeframe1H': '1 giแป', - -'ai-trading-assistant.form.timeframe4H': '4 giแป', - -'ai-trading-assistant.form.timeframe1D': '1 ngร y', - -'ai-trading-assistant.form.marketType': 'Loแบกi thแป‹ trฦฐแปng', - -'ai-trading-assistant.form.marketTypeFutures': 'Hแปฃp ฤ‘แป“ng', - -'ai-trading-assistant.form.marketTypeSpot': 'Giao dแป‹ch tแปฉc thแปi', - -'ai-trading-assistant.form.totalPnl': 'Tแป•ng lแปฃi nhuแบญn/thua lแป—', - -'ai-trading-assistant.form.customPrompt': 'Lแปi nhแบฏc tรนy chแป‰nh', - -'ai-trading-assistant.form.customPromptHint': 'Tรนy chแปn, ฤ‘แปƒ tรนy chแป‰nh chiแบฟn lฦฐแปฃc giao dแป‹ch vร  logic quyแบฟt ฤ‘แป‹nh cแปงa AI', - -'ai-trading-assistant.form.cancel': 'Hแปงy', - -'ai-trading-assistant.form.prev': 'Bฦฐแป›c trฦฐแป›c', - -'ai-trading-assistant.form.next': 'Bฦฐแป›c tiแบฟp theo', - -'ai-trading-assistant.form.confirmCreate': 'Xรกc nhแบญn tแบกo', - -'ai-trading-assistant.form.confirmEdit': 'Xรกc nhแบญn chแป‰nh sแปญa', - -'ai-trading-assistant.messages.createSuccess': 'Tแบกo chiแบฟn lฦฐแปฃc thร nh cรดng', - -'ai-trading-assistant.messages.createFailed': 'Tแบกo chiแบฟn lฦฐแปฃc thแบฅt bแบกi', - -'ai-trading-assistant.messages.updateSuccess': 'Cแบญp nhแบญt chiแบฟn lฦฐแปฃc thร nh cรดng', - -'ai-trading-assistant.messages.updateFailed': 'Cแบญp nhแบญt chiแบฟn lฦฐแปฃc thแบฅt bแบกi', - -'ai-trading-assistant.messages.deleteSuccess': 'Xรณa chiแบฟn lฦฐแปฃc thร nh cรดng', - -'ai-trading-assistant.messages.deleteFailed': 'Xรณa chiแบฟn lฦฐแปฃc thแบฅt bแบกi', - -'ai-trading-assistant.messages.startSuccess': 'KhแปŸi ฤ‘แป™ng chiแบฟn lฦฐแปฃc thร nh cรดng', - -'ai-trading-assistant.messages.startFailed': 'Khรดng thแปƒ khแปŸi ฤ‘แป™ng chรญnh sรกch', - -'ai-trading-assistant.messages.stopSuccess': 'ฤรฃ dแปซng thร nh cรดng chรญnh sรกch', - -'ai-trading-assistant.messages.stopFailed': 'Khรดng thแปƒ dแปซng chรญnh sรกch', - -'ai-trading-assistant.messages.loadFailed': 'Khรดng thแปƒ truy xuแบฅt danh sรกch chรญnh sรกch', - -'ai-trading-assistant.messages.loadDecisionsFailed': 'Khรดng thแปƒ truy xuแบฅt bแบฃn ghi quyแบฟt ฤ‘แป‹nh cแปงa AI', - -'ai-trading-assistant.messages.deleteConfirm': 'Bแบกn cรณ chแบฏc chแบฏn muแป‘n xรณa chรญnh sรกch nร y khรดng? Thao tรกc nร y khรดng thแปƒ ฤ‘แบฃo ngฦฐแปฃc.', - -'ai-trading-assistant.placeholders.inputStrategyName': 'Vui lรฒng nhแบญp tรชn chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.placeholders.selectModelId': 'Vui lรฒng chแปn mรด hรฌnh AI', - -'ai-trading-assistant.placeholders.selectDecideInterval': 'Vui lรฒng chแปn khoแบฃng thแปi gian quyแบฟt ฤ‘แป‹nh', - -'ai-trading-assistant.placeholders.startTime': 'Thแปi gian bแบฏt ฤ‘แบงu', - -'ai-trading-assistant.placeholders.endTime': 'Thแปi gian kแบฟt thรบc', - -'ai-trading-assistant.placeholders.inputApiKey': 'Vui lรฒng nhแบญp khรณa API', - -'ai-trading-assistant.placeholders.selectExchange': 'Vui lรฒng chแปn sร n giao dแป‹ch', - -'ai-trading-assistant.placeholders.inputSecretKey': 'Vui lรฒng nhแบญp mรฃ bรญ mแบญt Key', - -'ai-trading-assistant.placeholders.inputPassphrase': 'Vui lรฒng nhแบญp mแบญt khแบฉu cแปงa bแบกn', - -'ai-trading-assistant.placeholders.selectSymbol': 'Vui lรฒng chแปn mแป™t cแบทp giao dแป‹ch, vรญ dแปฅ nhฦฐ BTC/USDT', - -'ai-trading-assistant.placeholders.selectTimeframe': 'Vui lรฒng chแปn khung thแปi gian', - -'ai-trading-assistant.placeholders.inputCustomPrompt': 'Vui lรฒng nhแบญp lแปi nhแบฏc tรนy chแป‰nh (tรนy chแปn)', - -'ai-trading-assistant.validation.strategyNameRequired': 'Vui lรฒng nhแบญp tรชn chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.validation.modelIdRequired': 'Vui lรฒng chแปn mแป™t mรด hรฌnh AI', - -'ai-trading-assistant.validation.runPeriodRequired': 'Vui lรฒng chแปn khoแบฃng thแปi gian chแบกy', - -'ai-trading-assistant.validation.apiKeyRequired': 'Vui lรฒng nhแบญp API Key', - -'ai-trading-assistant.validation.exchangeRequired': 'Vui lรฒng chแปn sร n giao dแป‹ch', - -'ai-trading-assistant.validation.secretKeyRequired': 'Vui lรฒng nhแบญp Khรณa bรญ mแบญt', - -'ai-trading-assistant.validation.symbolRequired': 'Vui lรฒng chแปn cแบทp giao dแป‹ch', - -'ai-trading-assistant.validation.initialCapitalRequired': 'Vui lรฒng nhแบญp sแป‘ vแป‘n ฤ‘แบงu tฦฐ', - -'ai-trading-assistant.table.time': 'Thแปi gian', - -'ai-trading-assistant.table.type': 'Loแบกi', - -'ai-trading-assistant.table.price': 'Giรก', - -'ai-trading-assistant.table.amount': 'Sแป‘ lฦฐแปฃng', - -'ai-trading-assistant.table.value': 'Giรก trแป‹', - -'ai-trading-assistant.table.symbol': 'Cแบทp giao dแป‹ch', - -'ai-trading-assistant.table.side': 'Hฦฐแป›ng', - -'ai-trading-assistant.table.size': 'Sแป‘ lฦฐแปฃng vแป‹ thแบฟ', - -'ai-trading-assistant.table.entryPrice': 'Giรก vร o lแป‡nh', - -'ai-trading-assistant.table.currentPrice': 'Giรก hiแป‡n tแบกi', - -'ai-trading-assistant.table.unrealizedPnl': 'Lแปฃi nhuแบญn/Thua lแป— chฦฐa thแปฑc hiแป‡n', - -'ai-trading-assistant.table.profit': 'Lแปฃi nhuแบญn/Thua lแป—', - -'ai-trading-assistant.table.openLong': 'MแปŸ lแป‡nh mua', - -'ai-trading-assistant.table.closeLong': 'ฤรณng lแป‡nh Long', - -'ai-trading-assistant.table.openShort': 'MแปŸ lแป‡nh bรกn', - -'ai-trading-assistant.table.closeShort': 'ฤรณng lแป‡nh bรกn', - -'ai-trading-assistant.table.addLong': 'Thรชm lแป‡nh mua', - -'ai-trading-assistant.table.addShort': 'Thรชm lแป‡nh bรกn', - -'ai-trading-assistant.table.closeShortProfit': 'ฤรณng lแป‡nh bรกn cรณ lรฃi', - -'ai-trading-assistant.table.closeShortStop': 'ฤรณng lแป‡nh cแบฏt lแป— lแป‡nh bรกn', - -'ai-trading-assistant.table.closeLongProfit': 'ฤรณng lแป‡nh mua cรณ lรฃi', - -'ai-trading-assistant.table.closeLongStop': 'ฤรณng lแป‡nh cแบฏt lแป— lแป‡nh mua', - -'ai-trading-assistant.table.buy': 'Mua', - -'ai-trading-assistant.table.sell': 'ๅ”ฎ', - -'ai-trading-assistant.table.long': 'ๅผ€้•ฟ', - -'ai-trading-assistant.table.short': 'ๅผ€็Ÿญ', - -'ai-trading-assistant.table.hold': 'ๆŽง่‚ก', - -'ai-trading-assistant.table.reasoning': 'ๅˆ†ๆž็†็†', - -'ai-trading-assistant.table.decisions': 'ๅ†ณๅฎš', - -'ai-trading-assistant.table.riskAssessment': '้ฃŽ้™ฉ่€ƒๆ ธ', - -'ai-trading-assistant.table.trust': 'ไฟกไฟกๅบฆ', - -'ai-trading-assistant.table.totalRecords': '{total} Khรดng cรณ bแบฃn ghi', -'ai-trading-assistant.table.noPositions': 'Khรดng cรณ vแป‹ thแบฟ', - -'ai-trading-assistant.detail.title': 'Chi tiแบฟt chiแบฟn lฦฐแปฃc', - -'ai-trading-assistant.equity.noData': 'Khรดng cรณ dแปฏ liแป‡u giรก trแป‹ tร i sแบฃn rรฒng', - -'ai-trading-assistant.equity.equity': 'Giรก trแป‹ tร i sแบฃn rรฒng', - -'ai-trading-assistant.exchange.testFailed': 'Kiแปƒm tra kแบฟt nแป‘i thแบฅt bแบกi', - -'ai-trading-assistant.exchange.connectionSuccess': 'Kแบฟt nแป‘i thร nh cรดng', - -'ai-trading-assistant.exchange.connectionFailed': 'Kแบฟt nแป‘i thแบฅt bแบกi', - -'ai-trading-assistant.form.advancedSettings': 'Cร i ฤ‘แบทt nรขng cao', - -'ai-trading-assistant.form.orderMode': 'Lแป‡nh Mode', - -'ai-trading-assistant.form.orderModeMaker': 'Lแป‡nh chแป (Ngฦฐแปi tแบกo lแป‡nh)', - -'ai-trading-assistant.form.orderModeTaker': 'Lแป‡nh thแป‹ trฦฐแปng (Ngฦฐแปi nhแบญn lแป‡nh)', - -'ai-trading-assistant.form.orderModeHint': 'Chแบฟ ฤ‘แป™ lแป‡nh chแป sแปญ dแปฅng lแป‡nh giแป›i hแบกn, phรญ thแบฅp hฦกn; chแบฟ ฤ‘แป™ lแป‡nh thแป‹ trฦฐแปng thแปฑc hiแป‡n ngay lแบญp tแปฉc, phรญ cao hฦกn', - -'ai-trading-assistant.form.makerWaitSec': 'Thแปi gian chแป lแป‡nh (giรขy)', - -'ai-trading-assistant.form.makerWaitSecHint': 'Thแปi gian chแป sau khi ฤ‘แบทt lแป‡nh;', -'ai-trading-assistant.form.makerRetries': 'Sแป‘ lแบงn thแปญ lแบกi cho lแป‡nh ฤ‘ang chแป', - -'ai-trading-assistant.form.makerRetriesHint': 'Sแป‘ lแบงn thแปญ lแบกi tแป‘i ฤ‘a khi lแป‡nh ฤ‘ang chแป khรดng ฤ‘ฦฐแปฃc khแป›p', - -'ai-trading-assistant.form.fallbackToMarket': 'Hแบก cแบฅp lแป‡nh ฤ‘ang chแป thแบฅt bแบกi thร nh lแป‡nh thแป‹ trฦฐแปng', - -'ai-trading-assistant.form.fallbackToMarketHint': 'Cรณ nรชn hแบก cแบฅp lแป‡nh ฤ‘ang chแป mแปŸ/ฤ‘รณng thร nh lแป‡nh thแป‹ trฦฐแปng ฤ‘แปƒ ฤ‘แบฃm bแบฃo thแปฑc hiแป‡n khi chรบng khรดng ฤ‘ฦฐแปฃc khแป›p hay khรดng', - -'ai-trading-assistant.form.marginMode': 'Chแบฟ ฤ‘แป™ kรฝ quแปน', - -'ai-trading-assistant.form.marginModeCross': 'Kรฝ quแปน chรฉo', - -'ai-trading-assistant.form.marginModeIsolated': 'Kรฝ quแปน riรชng biแป‡t Margin', - -'ai-analysis.title': 'Hแป‡ thแป‘ng giao dแป‹ch lฦฐแปฃng tแปญ', - -'ai-analysis.system.online': 'Trแปฑc tuyแบฟn', - -'ai-analysis.system.agents': 'Nhรขn viรชn', - -'ai-analysis.system.active': 'Hoแบกt ฤ‘แป™ng', - -'ai-analysis.system.stage': 'Giai ฤ‘oแบกn', - -'ai-analysis.panel.roster': 'Danh sรกch nhรขn viรชn', - -'ai-analysis.panel.thinking': 'ฤang suy nghฤฉ...', - -'ai-analysis.panel.done': 'Hoร n tแบฅt', - -'ai-analysis.panel.standby': 'Chแป', - -'ai-analysis.input.title': 'Hแป‡ thแป‘ng giao dแป‹ch lฦฐแปฃng tแปญ', - -'ai-analysis.input.placeholder': 'Chแปn tร i sแบฃn mแปฅc tiรชu (vรญ dแปฅ: BTC/USDT)', - -'ai-analysis.input.watchlist': 'Danh sรกch theo dรตi', - -'ai-analysis.input.start': 'Bแบฏt โ€‹โ€‹ฤ‘แบงu phรขn tรญch', - -'ai-analysis.input.recent': 'Cรกc tรกc vแปฅ gแบงn ฤ‘รขy:', - -'ai-analysis.vis.stage': 'Giai ฤ‘oแบกn', - -'ai-analysis.vis.processing': 'ฤang xแปญ lรฝ', - -'ai-analysis.result.complete': 'Phรขn tรญch hoร n tแบฅt', - -'ai-analysis.result.signal': 'Tรญn hiแป‡u cuแป‘i cรนng', - -'ai-analysis.result.confidence': 'Mแปฉc ฤ‘แป™ tin cแบญy:', - -'ai-analysis.result.new': 'Phรขn tรญch mแป›i', - -'ai-analysis.result.full': 'Xem bรกo cรกo ฤ‘แบงy ฤ‘แปง', - -'ai-analysis.logs.title': 'Nhแบญt kรฝ hแป‡ thแป‘ng', - -'ai-analysis.modal.title': 'Bรกo cรกo bแบฃo mแบญt', - -'ai-analysis.modal.fundamental': 'Phรขn tรญch cฦก bแบฃn', - -'ai-analysis.modal.technical': 'Phรขn tรญch kแปน thuแบญt', - -'ai-analysis.modal.sentiment': 'Phรขn tรญch tรขm lรฝ', - -'ai-analysis.modal.risk': 'ฤรกnh giรก rแปงi ro', - -'ai-analysis.stage.idle': 'Chแบฟ ฤ‘แป™ chแป', - -'ai-analysis.stage.1': 'Giai ฤ‘oแบกn 1: Phรขn tรญch ฤ‘a chiแปu', - -'ai-analysis.stage.2': 'Giai ฤ‘oแบกn 2: Thแบฃo luแบญn vแป xu hฦฐแป›ng tฤƒng/giแบฃm', - -'ai-analysis.stage.3': 'Giai ฤ‘oแบกn 3: Lแบญp kแบฟ hoแบกch chiแบฟn lฦฐแปฃc', - -'ai-analysis.stage.4': 'Giai ฤ‘oแบกn 4: Xem xรฉt kiแปƒm soรกt rแปงi ro', - -'ai-analysis.stage.complete': 'ฤรฃ hoร n thร nh', - -'ai-analysis.agent.investment_director': 'Giรกm ฤ‘แป‘c ฤ‘แบงu tฦฐ Giรกm ฤ‘แป‘c', - -'ai-analysis.agent.role.investment_director': 'Phรขn tรญch toร n diแป‡n & Kแบฟt luแบญn cuแป‘i cรนng', - -'ai-analysis.agent.market': 'Nhร  phรขn tรญch thแป‹ trฦฐแปng', - -'ai-analysis.agent.role.market': 'Dแปฏ liแป‡u kแปน thuแบญt & thแป‹ trฦฐแปng', - -'ai-analysis.agent.fundamental': 'Nhร  phรขn tรญch cฦก bแบฃn', - -'ai-analysis.agent.role.fundamental': 'Tร i chรญnh & ฤแป‹nh giรก', - -'ai-analysis.agent.technical': 'Nhร  phรขn tรญch kแปน thuแบญt', - -'ai-analysis.agent.role.technical': 'Cรกc chแป‰ bรกo & biแปƒu ฤ‘แป“ kแปน thuแบญt', - -'ai-analysis.agent.news': 'Nhร  phรขn tรญch tin tแปฉc', - -'ai-analysis.agent.role.news': 'Bแป™ lแปc tin tแปฉc toร n cแบงu', - -'ai-analysis.agent.sentiment': 'Tรขm lรฝ thแป‹ trฦฐแปng Nhร  phรขn tรญch', - -'ai-analysis.agent.role.sentiment': 'Phรขn tรญch xรฃ hแป™i & cแบฃm xรบc', - -'ai-analysis.agent.risk': 'Nhร  phรขn tรญch rแปงi ro', - -'ai-analysis.agent.role.risk': 'Kiแปƒm tra rแปงi ro cฦก bแบฃn', - -'ai-analysis.agent.bull': 'Nhร  phรขn tรญch lแบกc quan', - -'ai-analysis.agent.role.bull': 'Khรกm phรก ฤ‘แป™ng lแปฑc tฤƒng trฦฐแปŸng', - -'ai-analysis.agent.bear': 'Nhร  phรขn tรญch bi quan', - -'ai-analysis.agent.role.bear': 'Khรกm phรก rแปงi ro & ฤ‘iแปƒm yแบฟu', - -'ai-analysis.agent.manager': 'Quแบฃn lรฝ nghiรชn cแปฉu', - -'ai-analysis.agent.role.manager': 'Ngฦฐแปi ฤ‘iแปu phแป‘i tranh luแบญn', - -'ai-analysis.agent.trader': 'Nhร  giao dแป‹ch', - -'ai-analysis.agent.role.trader': 'Chiแบฟn lฦฐแปฃc gia ฤ‘iแปu hร nh', - -'ai-analysis.agent.risky': 'Nhร  phรขn tรญch nฤƒng ฤ‘แป™ng', - -'ai-analysis.agent.role.risky': 'Chiแบฟn lฦฐแปฃc nฤƒng ฤ‘แป™ng', - -'ai-analysis.agent.neutral': 'Nhร  phรขn tรญch cรขn bแบฑng', - -'ai-analysis.agent.role.neutral': 'Chiแบฟn lฦฐแปฃc cรขn bแบฑng', - -'ai-analysis.agent.safe': 'Nhร  phรขn tรญch thแบญn trแปng', - -'ai-analysis.agent.role.safe': 'Chiแบฟn lฦฐแปฃc thแบญn trแปng', - -'ai-analysis.agent.cro': 'Cรขn nhแบฏc Quแบฃn lรฝ rแปงi ro (CRO)', - -'ai-analysis.agent.role.cro': 'Ngฦฐแปi cรณ thแบฉm quyแปn quyแบฟt ฤ‘แป‹nh cuแป‘i cรนng', - -'ai-analysis.script.market': 'ฤang truy xuแบฅt dแปฏ liแป‡u OHLCV tแปซ cรกc sร n giao dแป‹ch lแป›n...', - -'ai-analysis.script.fundamental': 'ฤang truy xuแบฅt bรกo cรกo tร i chรญnh hร ng quรฝ...', - -'ai-analysis.script.technical': 'Phรขn tรญch cรกc chแป‰ bรกo kแปน thuแบญt vร  mรด hรฌnh biแปƒu ฤ‘แป“...', - -'ai-analysis.script.news': 'ฤang quรฉt tin tแปฉc tร i chรญnh toร n cแบงu...', - -'ai-analysis.script.sentiment': 'Phรขn tรญch xu hฦฐแป›ng mแบกng xรฃ hแป™i...', - -'ai-analysis.script.risk': 'ฤang tรญnh toรกn biแบฟn ฤ‘แป™ng lแป‹ch sแปญ...', - -'invite.inviteLink': 'Liรชn kแบฟt mแปi', - -'invite.copy': 'Sao chรฉp liรชn kแบฟt', - -'invite.copySuccess': 'Sao chรฉp thร nh cรดng!', - -'invite.copyFailed': 'Sao chรฉp thแบฅt bแบกi, vui lรฒng sao chรฉp thแปง cรดng', - -'invite.noInviteLink': 'Khรดng tแบกo ฤ‘ฦฐแปฃc liรชn kแบฟt mแปi', - -'invite.totalInvites': 'Tแป•ng sแป‘ lแปi mแปi', - -'invite.totalReward': 'Tแป•ng sแป‘ phแบงn thฦฐแปŸng', - -'invite.rules': 'Quy tแบฏc mแปi', - -'invite.rule1': 'Bแบกn sแบฝ nhแบญn ฤ‘ฦฐแปฃc phแบงn thฦฐแปŸng cho mแป—i ngฦฐแปi bแบกn mแปi ฤ‘ฤƒng kรฝ thร nh cรดng', - -'invite.rule2': 'Bแบกn sแบฝ nhแบญn ฤ‘ฦฐแปฃc phแบงn thฦฐแปŸng bแป• sung khi ngฦฐแปi bแบกn ฤ‘ฦฐแปฃc mแปi hoร n tแบฅt giao dแป‹ch ฤ‘แบงu tiรชn', - -'invite.rule3': 'Phแบงn thฦฐแปŸng mแปi sแบฝ ฤ‘ฦฐแปฃc cแป™ng trแปฑc tiแบฟp vร o tร i khoแบฃn cแปงa bแบกn', - -'invite.inviteList': 'Danh sรกch ngฦฐแปi ฤ‘ฦฐแปฃc mแปi', - -'invite.tasks': 'Trung tรขm nhiแป‡m vแปฅ', - -'invite.inviteeName': 'Ngฦฐแปi ฤ‘ฦฐแปฃc mแปi', - -'invite.inviteTime': 'Thแปi gian mแปi', - -'invite.status': 'Trแบกng thรกi', - -'invite.reward': 'Phแบงn thฦฐแปŸng', - -'invite.active': 'ฤang hoแบกt ฤ‘แป™ng', - -'invite.inactive': 'Khรดng hoแบกt ฤ‘แป™ng', - -'invite.completed': 'ฤรฃ hoร n thร nh', - -'invite.claimed': 'ฤรฃ nhแบญn', - -'invite.pending': 'ฤang chแป hoร n thร nh', - -'invite.goToTask': 'Chuyแปƒn ฤ‘แบฟn hoร n thร nh', - -'invite.claimReward': 'Nhแบญn phแบงn thฦฐแปŸng', - -'invite.verify': 'Xรกc minh hoร n tแบฅt', - -'invite.verifySuccess': 'Xรกc minh thร nh cรดng Nhiแป‡m vแปฅ hoร n thร nh', - -'invite.verifyNotCompleted': 'Nhiแป‡m vแปฅ chฦฐa hoร n thร nh, vui lรฒng hoร n thร nh nhiแป‡m vแปฅ trฦฐแป›c', - -'invite.verifyFailed': 'Xรกc minh thแบฅt bแบกi, vui lรฒng thแปญ lแบกi sau', - -'invite.claimSuccess': 'ฤรฃ nhแบญn thร nh cรดng {reward} QDT!', - -'invite.claimFailed': 'Khรดng thแปƒ xรกc nhแบญn, vui lรฒng thแปญ lแบกi sau', - -'invite.totalRecords': 'Tแป•ng sแป‘ {total} bแบฃn ghi', - -'invite.task.twitter.title': 'Chia sแบป lแบกi bร i ฤ‘ฤƒng trรชn Twitter cแปงa chรบng tรดi lรชn X (Twitter)', - -'invite.task.twitter.desc': 'Chia sแบป bร i ฤ‘ฤƒng chรญnh thแปฉc cแปงa chรบng tรดi lรชn tร i khoแบฃn Twitter cแปงa bแบกn (X)', - -'invite.task.youtube.title': 'ฤฤƒng kรฝ kรชnh YouTube cแปงa chรบng tรดi', - -'invite.task.youtube.desc': 'ฤฤƒng kรฝ vร  theo dรตi kรชnh YouTube chรญnh thแปฉc cแปงa chรบng tรดi', - -'invite.task.telegram.title': 'Tham gia nhรณm Telegram cแปงa chรบng tรดi', - -'invite.task.telegram.desc': 'Tham gia nhรณm cแป™ng ฤ‘แป“ng Telegram chรญnh thแปฉc cแปงa chรบng tรดi', - -'invite.task.discord.title': 'Tham gia Discord Mรกy chแปง', - -'invite.task.discord.desc': 'Tham gia mรกy chแปง cแป™ng ฤ‘แป“ng Discord cแปงa chรบng tรดi', - -'message': '-', - -'layouts.usermenu.dialog.title': 'Thรดng tin', - -'layouts.usermenu.dialog.content': 'Bแบกn cรณ chแบฏc chแบฏn muแป‘n ฤ‘ฤƒng xuแบฅt khรดng?', - -'layouts.userLayout.title': 'Tรฌm kiแบฟm sแปฑ thแบญt trong sแปฑ khรดng chแบฏc chแบฏn', - -// Settings (Memory/Reflection) -'settings.group.agent_memory': 'Bแป™ nhแป›/Phแบฃn tฦฐ', -'settings.group.reflection_worker': 'Worker xรกc minh phแบฃn tฦฐ tแปฑ ฤ‘แป™ng', -'settings.field.ENABLE_AGENT_MEMORY': 'Bแบญt bแป™ nhแป› tรกc nhรขn', -'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'Bแบญt truy vแบฅn vector (cแปฅc bแป™)', -'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Kรญch thฦฐแป›c embedding', -'settings.field.AGENT_MEMORY_TOP_K': 'Sแป‘ lฦฐแปฃng Top-K', -'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'Kรญch thฦฐแป›c cแปญa sแป• แปฉng viรชn', -'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'Chu kแปณ bรกn rรฃ theo thแปi gian (ngร y)', -'settings.field.AGENT_MEMORY_W_SIM': 'Trแปng sแป‘ tฦฐฦกng ฤ‘แป“ng', -'settings.field.AGENT_MEMORY_W_RECENCY': 'Trแปng sแป‘ thแปi gian', -'settings.field.AGENT_MEMORY_W_RETURNS': 'Trแปng sแป‘ lแปฃi nhuแบญn', -'settings.field.ENABLE_REFLECTION_WORKER': 'Bแบญt xรกc minh tแปฑ ฤ‘แป™ng', -'settings.field.REFLECTION_WORKER_INTERVAL_SEC': 'Khoแบฃng thแปi gian xรกc minh (giรขy)', - -// Profile - Notification Settings (Cร i ฤ‘แบทt thรดng bรกo) -'profile.notifications.title': 'Cร i ฤ‘แบทt thรดng bรกo', -'profile.notifications.hint': 'Cแบฅu hรฌnh phฦฐฦกng thแปฉc thรดng bรกo mแบทc ฤ‘แป‹nh, sแบฝ ฤ‘ฦฐแปฃc sแปญ dแปฅng tแปฑ ฤ‘แป™ng khi tแบกo giรกm sรกt tร i sแบฃn vร  cแบฃnh bรกo', -'profile.notifications.defaultChannels': 'Kรชnh thรดng bรกo mแบทc ฤ‘แป‹nh', -'profile.notifications.browser': 'Thรดng bรกo trong แปฉng dแปฅng', -'profile.notifications.email': 'Email', -'profile.notifications.phone': 'SMS', -'profile.notifications.telegramBotToken': 'Telegram Bot Token', -'profile.notifications.telegramBotTokenPlaceholder': 'Nhแบญp Telegram Bot Token cแปงa bแบกn', -'profile.notifications.telegramBotTokenHint': 'Tแบกo bot qua @BotFather ฤ‘แปƒ lแบฅy Token', -'profile.notifications.telegramChatId': 'Telegram Chat ID', -'profile.notifications.telegramPlaceholder': 'Nhแบญp Telegram Chat ID cแปงa bแบกn (vรญ dแปฅ: 123456789)', -'profile.notifications.telegramHint': 'Gแปญi /start cho @userinfobot ฤ‘แปƒ lแบฅy Chat ID', -'profile.notifications.notifyEmail': 'Email thรดng bรกo', -'profile.notifications.emailPlaceholder': 'ฤแป‹a chแป‰ email nhแบญn thรดng bรกo', -'profile.notifications.emailHint': 'Mแบทc ฤ‘แป‹nh sแปญ dแปฅng email tร i khoแบฃn, cรณ thแปƒ ฤ‘แบทt email khรกc', -'profile.notifications.phonePlaceholder': 'Nhแบญp sแป‘ ฤ‘iแป‡n thoแบกi (vรญ dแปฅ: +84123456789)', -'profile.notifications.phoneHint': 'Cแบงn quแบฃn trแป‹ viรชn cแบฅu hรฌnh dแป‹ch vแปฅ Twilio', -'profile.notifications.discordWebhook': 'Discord Webhook', -'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', -'profile.notifications.discordHint': 'Tแบกo Webhook trong cร i ฤ‘แบทt mรกy chแปง Discord', -'profile.notifications.webhookUrl': 'Webhook URL', -'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', -'profile.notifications.webhookHint': 'URL Webhook tรนy chแป‰nh, gแปญi thรดng bรกo qua POST JSON', -'profile.notifications.webhookToken': 'Webhook Token (Tรนy chแปn)', -'profile.notifications.webhookTokenPlaceholder': 'Bearer Token ฤ‘แปƒ xรกc thแปฑc yรชu cแบงu', -'profile.notifications.webhookTokenHint': 'Gแปญi dฦฐแป›i dแบกng Authorization: Bearer Token ฤ‘แบฟn Webhook', -'profile.notifications.testBtn': 'Gแปญi thรดng bรกo thแปญ nghiแป‡m', -'profile.notifications.saveSuccess': 'ฤรฃ lฦฐu cร i ฤ‘แบทt thรดng bรกo thร nh cรดng', -'profile.notifications.selectChannel': 'Vui lรฒng chแปn รญt nhแบฅt mแป™t kรชnh thรดng bรกo', -'profile.notifications.fillTelegramToken': 'Vui lรฒng ฤ‘iแปn Telegram Bot Token', -'profile.notifications.fillTelegram': 'Vui lรฒng ฤ‘iแปn Telegram Chat ID', -'profile.notifications.fillEmail': 'Vui lรฒng ฤ‘iแปn email thรดng bรกo', -'profile.notifications.testSent': 'ฤรฃ gแปญi thรดng bรกo thแปญ nghiแป‡m, vui lรฒng kiแปƒm tra cรกc kรชnh thรดng bรกo' - -} -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/zh-CN.js b/quantdinger_vue/src/locales/lang/zh-CN.js deleted file mode 100644 index 574a19c..0000000 --- a/quantdinger_vue/src/locales/lang/zh-CN.js +++ /dev/null @@ -1,2970 +0,0 @@ -import antd from 'ant-design-vue/es/locale-provider/zh_CN' -import momentCN from 'moment/locale/zh-cn' - -const components = { - antLocale: antd, - momentName: 'zh-cn', - momentLocale: momentCN -} - -const locale = { - // ้€š็”จ - 'common.confirm': '็กฎๅฎš', - 'common.cancel': 'ๅ–ๆถˆ', - 'common.save': 'ไฟๅญ˜', - 'common.delete': 'ๅˆ ้™ค', - 'common.edit': '็ผ–่พ‘', - 'common.add': 'ๆทปๅŠ ', - 'common.close': 'ๅ…ณ้—ญ', - 'common.ok': '็กฎๅฎš', - 'common.loading': 'ๅŠ ่ฝฝไธญ...', - 'common.noData': 'ๆš‚ๆ— ๆ•ฐๆฎ', - 'submit': 'ๆไบค', - 'save': 'ไฟๅญ˜', - 'submit.ok': 'ๆไบคๆˆๅŠŸ', - 'save.ok': 'ไฟๅญ˜ๆˆๅŠŸ', - 'menu.welcome': 'ๆฌข่ฟŽ', - 'menu.home': 'ไธป้กต', - 'menu.dashboard': 'ไปช่กจ็›˜', - 'menu.dashboard.indicator': 'ๆŒ‡ๆ ‡ๅˆ†ๆž', - 'menu.dashboard.community': 'ๆŒ‡ๆ ‡ๅธ‚ๅœบ', - 'menu.dashboard.analysis': 'AI ๅˆ†ๆž', - 'menu.dashboard.aiAssetAnalysis': 'AI่ต„ไบงๅˆ†ๆž', - 'menu.dashboard.aiQuant': 'AI ้‡ๅŒ–', - 'menu.dashboard.tradingAssistant': 'ไบคๆ˜“ๅŠฉๆ‰‹', - 'menu.dashboard.portfolio': '่ต„ไบง็›‘ๆต‹', - 'menu.dashboard.globalMarket': 'ๅ…จ็ƒ้‡‘่ž', - 'menu.settings': '็ณป็ปŸ่ฎพ็ฝฎ', - 'menu.dashboard.aiTradingAssistant': 'AIไบคๆ˜“ๅŠฉๆ‰‹', - 'menu.dashboard.signalRobot': 'ไฟกๅทๆœบๅ™จไบบ', - 'menu.dashboard.monitor': '็›‘ๆŽง้กต', - 'menu.dashboard.workplace': 'ๅทฅไฝœๅฐ', - 'aiAssetAnalysis.title': 'AI่ต„ไบงๅˆ†ๆž', - 'aiAssetAnalysis.subtitle': 'ๆŠŠ่ต„ไบง็›‘ๆต‹ใ€ๅณๆ—ถๅˆ†ๆžใ€ๅฎšๆ—ถไปปๅŠกๆ”พๅˆฐไธ€ไธชๅทฅไฝœๆต้‡Œ๏ผŒๆ“ไฝœๆ›ด็›ด่ง‚ใ€ๅ้ฆˆๆ›ดๅŠๆ—ถใ€‚', - 'aiAssetAnalysis.actions.quickAnalysis': '็ซ‹ๅณๅผ€ๅง‹ๅˆ†ๆž', - 'aiAssetAnalysis.actions.monitorTasks': '็ฎก็†็›‘ๆŽงไปปๅŠก', - 'aiAssetAnalysis.actions.openStandalone': 'ๅœจ็‹ฌ็ซ‹้กต้ขๆ‰“ๅผ€', - 'aiAssetAnalysis.quickBar.title': 'ๅฟซๆทๅˆ†ๆž', - 'aiAssetAnalysis.quickBar.placeholder': 'ไปŽ่ต„ไบงๆฑ ้€‰ๆ‹ฉๆ ‡็š„', - 'aiAssetAnalysis.quickBar.useInQuick': 'ๅธฆๅ…ฅๅณๆ—ถๅˆ†ๆž', - 'aiAssetAnalysis.quickBar.runNow': 'ไธ€้”ฎๅˆ†ๆž', - 'aiAssetAnalysis.history.title': 'ๆœ€่ฟ‘ๅˆ†ๆž', - 'aiAssetAnalysis.history.empty': 'ๆš‚ๆ— ๅˆ†ๆž่ฎฐๅฝ•', - 'aiAssetAnalysis.actions.enterQuick': '่ฟ›ๅ…ฅๅณๆ—ถๅˆ†ๆž', - 'aiAssetAnalysis.actions.enterMonitor': '่ฟ›ๅ…ฅๅฎšๆ—ถไปปๅŠกไธŽ่ต„ไบงๆฑ ', - 'aiAssetAnalysis.flow.poolTitle': 'ๆž„ๅปบ่ต„ไบงๆฑ ', - 'aiAssetAnalysis.flow.poolDesc': 'ๅ…ˆๆทปๅŠ ๆŒไป“ไธŽๅ…ณๆณจๆ ‡็š„๏ผŒๅฝขๆˆ็ปŸไธ€ๅˆ†ๆžๅฏน่ฑกๆฑ ใ€‚', - 'aiAssetAnalysis.flow.poolAction': 'ๅŽป็ฎก็†่ต„ไบงๆฑ ', - 'aiAssetAnalysis.flow.quickTitle': 'ๅณๆ—ถๅˆ†ๆž', - 'aiAssetAnalysis.flow.quickDesc': 'ๅฏนไปปๆ„ๆ ‡็š„ไธ€้”ฎๅ‘่ตท AI ๅˆ†ๆž๏ผŒๅฟซ้€Ÿๆ‹ฟๅˆฐๅ†ณ็ญ–ๅปบ่ฎฎใ€‚', - 'aiAssetAnalysis.flow.quickAction': 'ๅŽปๅณๆ—ถๅˆ†ๆž', - 'aiAssetAnalysis.flow.autoTitle': 'ๅฎšๆ—ถ็›‘ๆŽง', - 'aiAssetAnalysis.flow.autoDesc': '้…็ฝฎๅฎšๆ—ถไปปๅŠก่‡ชๅŠจ่ฟ่กŒ AI ๅˆ†ๆž๏ผŒๅนถๆŽจ้€ๆŠฅๅ‘Šๅˆฐ้€š็Ÿฅๆธ ้“ใ€‚', - 'aiAssetAnalysis.flow.autoAction': 'ๅŽป้…็ฝฎไปปๅŠก', - 'aiAssetAnalysis.tabs.quick': 'ๅณๆ—ถๅˆ†ๆž', - 'aiAssetAnalysis.tabs.monitor': '่ต„ไบงๆฑ ไธŽๅฎšๆ—ถไปปๅŠก', - 'aiAssetAnalysis.tabLead.quick': '้€‚ๅˆไธดๆ—ถๅˆคๆ–ญ๏ผš้€‰ๆ‹ฉๆ ‡็š„ๅŽ็ซ‹ๅˆปๅˆ†ๆžๅนถๆŸฅ็œ‹ๅކๅฒ็ป“ๆžœใ€‚', - 'aiAssetAnalysis.tabLead.monitor': '้€‚ๅˆๆŒ็ปญ่ทŸ่ธช๏ผš็ปดๆŠคๆŒไป“ใ€่ฎพ็ฝฎ็›‘ๆŽง่Œƒๅ›ดไธŽๆ‰ง่กŒ้ข‘็އใ€‚', - // AI่ต„ไบงๅˆ†ๆž - ๅ‡†็กฎ็އ็œ‹ๆฟ - 'aiAssetAnalysis.stats.totalAnalyses': 'ๅˆ†ๆžๆ€ปๆ•ฐ', - 'aiAssetAnalysis.stats.accuracy': 'ๅ‡†็กฎ็އ', - 'aiAssetAnalysis.stats.avgReturn': 'ๅนณๅ‡ๅ›žๆŠฅ', - 'aiAssetAnalysis.stats.satisfaction': '็”จๆˆทๆปกๆ„ๅบฆ', - 'aiAssetAnalysis.stats.decisions': 'ๅ†ณ็ญ–ๅˆ†ๅธƒ', - // AI่ต„ไบงๅˆ†ๆž - ไบคๆ˜“ๆœบไผš - 'aiAssetAnalysis.opportunities.title': 'AI ไบคๆ˜“ๆœบไผš้›ท่พพ', - 'aiAssetAnalysis.opportunities.empty': 'ๆš‚ๆ— ไบคๆ˜“ๆœบไผš', - 'aiAssetAnalysis.opportunities.analyze': 'ๅˆ†ๆž', - 'aiAssetAnalysis.opportunities.updateHint': 'ๆฏๅฐๆ—ถๆ›ดๆ–ฐ', - 'aiAssetAnalysis.opportunities.signal.overbought': '่ถ…ไนฐ', - 'aiAssetAnalysis.opportunities.signal.oversold': '่ถ…ๅ–', - 'aiAssetAnalysis.opportunities.signal.bullish_momentum': '็œ‹ๆถจ', - 'aiAssetAnalysis.opportunities.signal.bearish_momentum': '็œ‹่ทŒ', - 'aiAssetAnalysis.opportunities.market.Crypto': '๐Ÿช™ ๅŠ ๅฏ†', - 'aiAssetAnalysis.opportunities.market.USStock': '๐Ÿ“ˆ ็พŽ่‚ก', - 'aiAssetAnalysis.opportunities.market.Forex': '๐Ÿ’ฑ ๅค–ๆฑ‡', - 'aiAssetAnalysis.opportunities.reason.crypto.overbought': '24hๆถจๅน…{change}%๏ผŒ7ๆ—ฅๆถจๅน…{change7d}%๏ผŒ็ŸญๆœŸ่ถ…ไนฐ้ฃŽ้™ฉ', - 'aiAssetAnalysis.opportunities.reason.crypto.bullish_momentum': '24hๆถจๅน…{change}%๏ผŒไธŠๆถจๅŠจ่ƒฝๅผบๅŠฒ', - 'aiAssetAnalysis.opportunities.reason.crypto.oversold': '24h่ทŒๅน…{change}%๏ผŒๅฏ่ƒฝ่ถ…ๅ–ๅๅผน', - 'aiAssetAnalysis.opportunities.reason.crypto.bearish_momentum': '24h่ทŒๅน…{change}%๏ผŒไธ‹่ทŒ่ถ‹ๅŠฟๆ˜Žๆ˜พ', - 'aiAssetAnalysis.opportunities.reason.usstock.overbought': 'ๆ—ฅๆถจๅน…{change}%๏ผŒ็ŸญๆœŸๆถจๅน…่พƒๅคง๏ผŒๆณจๆ„ๅ›ž่ฐƒ้ฃŽ้™ฉ', - 'aiAssetAnalysis.opportunities.reason.usstock.bullish_momentum': 'ๆ—ฅๆถจๅน…{change}%๏ผŒไธŠๆถจๅŠจ่ƒฝๅผบๅŠฒ', - 'aiAssetAnalysis.opportunities.reason.usstock.oversold': 'ๆ—ฅ่ทŒๅน…{change}%๏ผŒๅฏ่ƒฝ่ถ…ๅ–ๅๅผน', - 'aiAssetAnalysis.opportunities.reason.usstock.bearish_momentum': 'ๆ—ฅ่ทŒๅน…{change}%๏ผŒไธ‹่ทŒ่ถ‹ๅŠฟๆ˜Žๆ˜พ', - 'aiAssetAnalysis.opportunities.reason.forex.overbought': 'ๆ—ฅๆถจๅน…{change}%๏ผŒๆฑ‡็އๆณขๅŠจๅ‰ง็ƒˆ๏ผŒๆณจๆ„ๅ›ž่ฐƒ', - 'aiAssetAnalysis.opportunities.reason.forex.bullish_momentum': 'ๆ—ฅๆถจๅน…{change}%๏ผŒไธŠๆถจๅŠจ่ƒฝ่พƒๅผบ', - 'aiAssetAnalysis.opportunities.reason.forex.oversold': 'ๆ—ฅ่ทŒๅน…{change}%๏ผŒๆฑ‡็އๆณขๅŠจๅ‰ง็ƒˆ๏ผŒๅฏ่ƒฝๅๅผน', - 'aiAssetAnalysis.opportunities.reason.forex.bearish_momentum': 'ๆ—ฅ่ทŒๅน…{change}%๏ผŒไธ‹่ทŒ่ถ‹ๅŠฟๆ˜Žๆ˜พ', - // AI่ต„ไบงๅˆ†ๆž - ไธ€้”ฎ็ป„ๅˆไฝ“ๆฃ€ - 'aiAssetAnalysis.checkup.title': '็ป„ๅˆไฝ“ๆฃ€', - 'aiAssetAnalysis.checkup.btn': '็ป„ๅˆไฝ“ๆฃ€', - 'aiAssetAnalysis.checkup.desc': 'ไธ€้”ฎๅฏนๆ‚จ่ต„ไบงๆฑ ไธญ็š„ๆ‰€ๆœ‰ๆŒไป“่ฟ›่กŒ AI ๅˆ†ๆž๏ผŒๅฟซ้€Ÿไบ†่งฃๆฏไธชๆ ‡็š„็š„ๅฝ“ๅ‰็Šถๆ€ๅ’Œๆ“ไฝœๅปบ่ฎฎใ€‚', - 'aiAssetAnalysis.checkup.start': 'ๅผ€ๅง‹ไฝ“ๆฃ€', - 'aiAssetAnalysis.checkup.progress': 'ๆญฃๅœจๅˆ†ๆž {current}/{total}...', - 'aiAssetAnalysis.checkup.noPositions': '่ต„ไบงๆฑ ไธญๆš‚ๆ— ๆŒไป“๏ผŒ่ฏทๅ…ˆๆทปๅŠ ่ต„ไบงใ€‚', - 'aiAssetAnalysis.checkup.complete': 'ไฝ“ๆฃ€ๅฎŒๆˆ', - 'aiAssetAnalysis.checkup.failed': 'ๅˆ†ๆžๅคฑ่ดฅ', - 'aiAssetAnalysis.checkup.rerun': '้‡ๆ–ฐไฝ“ๆฃ€', - // AI่ต„ไบงๅˆ†ๆž - ๅ…จๅฑ€ๆœ็ดข - 'aiAssetAnalysis.search.hint': 'ๆœ็ดข', - 'aiAssetAnalysis.search.placeholder': 'ๆœ็ดขไปปๆ„ๆ ‡็š„... (Ctrl+K)', - 'aiAssetAnalysis.search.noResults': 'ๆœชๆ‰พๅˆฐๅŒน้…็ป“ๆžœ๏ผŒ่ฏทๅฐ่ฏ•ๅ…ถไป–ๅ…ณ้”ฎ่ฏ', - 'menu.form': '่กจๅ•้กต', - 'menu.form.basic-form': 'ๅŸบ็ก€่กจๅ•', - 'menu.form.step-form': 'ๅˆ†ๆญฅ่กจๅ•', - 'menu.form.step-form.info': 'ๅˆ†ๆญฅ่กจๅ•๏ผˆๅกซๅ†™่ฝฌ่ดฆไฟกๆฏ๏ผ‰', - 'menu.form.step-form.confirm': 'ๅˆ†ๆญฅ่กจๅ•๏ผˆ็กฎ่ฎค่ฝฌ่ดฆไฟกๆฏ๏ผ‰', - 'menu.form.step-form.result': 'ๅˆ†ๆญฅ่กจๅ•๏ผˆๅฎŒๆˆ๏ผ‰', - 'menu.form.advanced-form': '้ซ˜็บง่กจๅ•', - 'menu.list': 'ๅˆ—่กจ้กต', - 'menu.list.table-list': 'ๆŸฅ่ฏข่กจๆ ผ', - 'menu.list.basic-list': 'ๆ ‡ๅ‡†ๅˆ—่กจ', - 'menu.list.card-list': 'ๅก็‰‡ๅˆ—่กจ', - 'menu.list.search-list': 'ๆœ็ดขๅˆ—่กจ', - 'menu.list.search-list.articles': 'ๆœ็ดขๅˆ—่กจ๏ผˆๆ–‡็ซ ๏ผ‰', - 'menu.list.search-list.projects': 'ๆœ็ดขๅˆ—่กจ๏ผˆ้กน็›ฎ๏ผ‰', - 'menu.list.search-list.applications': 'ๆœ็ดขๅˆ—่กจ๏ผˆๅบ”็”จ๏ผ‰', - 'menu.profile': '่ฏฆๆƒ…้กต', - 'menu.profile.basic': 'ๅŸบ็ก€่ฏฆๆƒ…้กต', - 'menu.profile.advanced': '้ซ˜็บง่ฏฆๆƒ…้กต', - 'menu.result': '็ป“ๆžœ้กต', - 'menu.result.success': 'ๆˆๅŠŸ้กต', - 'menu.result.fail': 'ๅคฑ่ดฅ้กต', - 'menu.exception': 'ๅผ‚ๅธธ้กต', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': '่งฆๅ‘้”™่ฏฏ', - 'menu.account': 'ไธชไบบ้กต', - 'menu.account.center': 'ไธชไบบไธญๅฟƒ', - 'menu.account.settings': 'ไธชไบบ่ฎพ็ฝฎ', - 'menu.account.trigger': '่งฆๅ‘ๆŠฅ้”™', - 'menu.account.logout': '้€€ๅ‡บ็™ปๅฝ•', - 'menu.wallet': 'ๆˆ‘็š„้’ฑๅŒ…', - 'menu.docs': 'ๆ–‡ๆกฃไธญๅฟƒ', - 'menu.docs.detail': 'ๆ–‡ๆกฃ่ฏฆๆƒ…', - 'menu.header.refreshPage': 'ๅˆทๆ–ฐ้กต้ข', - 'menu.invite.friends': '้‚€่ฏทๅฅฝๅ‹', - 'app.setting.pagestyle': 'ๆ•ดไฝ“้ฃŽๆ ผ่ฎพ็ฝฎ', - 'app.setting.pagestyle.light': 'ไบฎ่‰ฒ่œๅ•้ฃŽๆ ผ', - 'app.setting.pagestyle.dark': 'ๆš—่‰ฒ่œๅ•้ฃŽๆ ผ', - 'app.setting.pagestyle.realdark': 'ๆš—้ป‘ๆจกๅผ', - 'app.setting.themecolor': 'ไธป้ข˜่‰ฒ', - 'app.setting.navigationmode': 'ๅฏผ่ˆชๆจกๅผ', - 'app.setting.sidemenu.nav': 'ไพง่พนๆ ๅฏผ่ˆช', - 'app.setting.topmenu.nav': '้กถ้ƒจๆ ๅฏผ่ˆช', - 'app.setting.content-width': 'ๅ†…ๅฎนๅŒบๅŸŸๅฎฝๅบฆ', - 'app.setting.content-width.tooltip': '่ฏฅ่ฎพๅฎšไป… [้กถ้ƒจๆ ๅฏผ่ˆช] ๆ—ถๆœ‰ๆ•ˆ', - 'app.setting.content-width.fixed': 'ๅ›บๅฎš', - 'app.setting.content-width.fluid': 'ๆตๅผ', - 'app.setting.fixedheader': 'ๅ›บๅฎš Header', - 'app.setting.fixedheader.tooltip': 'ๅ›บๅฎš Header ๆ—ถๅฏ้…็ฝฎ', - 'app.setting.autoHideHeader': 'ไธ‹ๆป‘ๆ—ถ้š่— Header', - 'app.setting.fixedsidebar': 'ๅ›บๅฎšไพง่พน่œๅ•', - 'app.setting.sidemenu': 'ไพง่พน่œๅ•ๅธƒๅฑ€', - 'app.setting.topmenu': '้กถ้ƒจ่œๅ•ๅธƒๅฑ€', - 'app.setting.othersettings': 'ๅ…ถไป–่ฎพ็ฝฎ', - 'app.setting.weakmode': '่‰ฒๅผฑๆจกๅผ', - 'app.setting.multitab': 'ๅคš้กต็ญพๆจกๅผ', - 'app.setting.copy': 'ๆ‹ท่ด่ฎพ็ฝฎ', - 'app.setting.loading': 'ๅŠ ่ฝฝไธป้ข˜ไธญ', - 'app.setting.copyinfo': 'ๆ‹ท่ด่ฎพ็ฝฎๆˆๅŠŸ src/config/defaultSettings.js', - 'app.setting.copy.success': 'ๅคๅˆถๅฎŒๆฏ•', - 'app.setting.copy.fail': 'ๅคๅˆถๅคฑ่ดฅ', - 'app.setting.theme.switching': 'ๆญฃๅœจๅˆ‡ๆขไธป้ข˜๏ผ', - 'app.setting.production.hint': '้…็ฝฎๆ ๅชๅœจๅผ€ๅ‘็Žฏๅขƒ็”จไบŽ้ข„่งˆ๏ผŒ็”Ÿไบง็Žฏๅขƒไธไผšๅฑ•็Žฐ๏ผŒ่ฏทๆ‹ท่ดๅŽๆ‰‹ๅŠจไฟฎๆ”น้…็ฝฎๆ–‡ไปถ', - 'app.setting.themecolor.daybreak': 'ๆ‹‚ๆ™“่“๏ผˆ้ป˜่ฎค๏ผ‰', - 'app.setting.themecolor.dust': '่–„ๆšฎ', - 'app.setting.themecolor.volcano': '็ซๅฑฑ', - 'app.setting.themecolor.sunset': 'ๆ—ฅๆšฎ', - 'app.setting.themecolor.cyan': 'ๆ˜Ž้’', - 'app.setting.themecolor.green': 'ๆžๅ…‰็ปฟ', - 'app.setting.themecolor.geekblue': 'ๆžๅฎข่“', - 'app.setting.themecolor.purple': '้…ฑ็ดซ', - 'app.setting.tooltip': '้กต้ข่ฎพ็ฝฎ', - - // ้€š็Ÿฅไธญๅฟƒ - 'notice.title': '้€š็Ÿฅไธญๅฟƒ', - 'notice.empty': 'ๆš‚ๆ— ้€š็Ÿฅ', - 'notice.markAllRead': 'ๅ…จ้ƒจๅทฒ่ฏป', - 'notice.clear': 'ๆธ…็ฉบ้€š็Ÿฅ', - 'notice.close': 'ๅ…ณ้—ญ', - 'notice.justNow': 'ๅˆšๅˆš', - 'notice.minutesAgo': 'ๅˆ†้’Ÿๅ‰', - 'notice.hoursAgo': 'ๅฐๆ—ถๅ‰', - 'notice.daysAgo': 'ๅคฉๅ‰', - 'notice.detailInfo': '่ฏฆ็ป†ไฟกๆฏ', - 'notice.aiDecision': 'AIๅ†ณ็ญ–', - 'notice.confidence': '็ฝฎไฟกๅบฆ', - 'notice.reasoning': 'ๅˆ†ๆž็†็”ฑ', - 'notice.symbol': 'ๆ ‡็š„ไปฃ็ ', - 'notice.currentPrice': 'ๅฝ“ๅ‰ไปทๆ ผ', - 'notice.triggerPrice': '่งฆๅ‘ไปทๆ ผ', - 'notice.action': 'ๆ“ไฝœ', - 'notice.quantity': 'ๆ•ฐ้‡', - 'notice.viewPortfolio': 'ๆŸฅ็œ‹ๆŒไป“', - 'notice.type.aiMonitor': 'AI็›‘ๆŽง', - 'notice.type.priceAlert': 'ไปทๆ ผๆ้†’', - 'notice.type.signal': 'ไบคๆ˜“ไฟกๅท', - 'notice.type.buy': 'ไนฐๅ…ฅไฟกๅท', - 'notice.type.sell': 'ๅ–ๅ‡บไฟกๅท', - 'notice.type.hold': 'ๆŒๆœ‰ๅปบ่ฎฎ', - 'notice.type.trade': 'ไบคๆ˜“ๆ‰ง่กŒ', - 'notice.type.notification': '็ณป็ปŸ้€š็Ÿฅ', - - 'user.login.userName': '็”จๆˆทๅ', - 'user.login.password': 'ๅฏ†็ ', - 'user.login.username.placeholder': '่ดฆๆˆท: admin', - 'user.login.password.placeholder': 'ๅฏ†็ : admin or ant.design', - 'user.login.message-invalid-credentials': '็™ปๅฝ•ๅคฑ่ดฅ๏ผŒ่ฏทๆฃ€ๆŸฅ้‚ฎ็ฎฑๅ’Œ้ชŒ่ฏ็ ', - 'user.login.message-invalid-verification-code': '้ชŒ่ฏ็ ้”™่ฏฏ', - 'user.login.tab-login-credentials': '่ดฆๆˆทๅฏ†็ ็™ปๅฝ•', - 'user.login.tab-login-email': '้‚ฎ็ฎฑ็™ปๅฝ•', - 'user.login.tab-login-mobile': 'ๆ‰‹ๆœบๅท็™ปๅฝ•', - 'user.login.captcha.placeholder': '่ฏท่พ“ๅ…ฅๅ›พๅฝข้ชŒ่ฏ็ ', - 'user.login.mobile.placeholder': 'ๆ‰‹ๆœบๅท', - 'user.login.mobile.verification-code.placeholder': '้ชŒ่ฏ็ ', - 'user.login.email.placeholder': '่ฏท่พ“ๅ…ฅ้‚ฎ็ฎฑๅœฐๅ€', - 'user.login.email.verification-code.placeholder': '่ฏท่พ“ๅ…ฅ้ชŒ่ฏ็ ', - 'user.login.email.sending': '้ชŒ่ฏ็ ๅ‘้€ไธญ...', - 'user.login.email.send-success-title': 'ๆ็คบ', - 'user.login.email.send-success': '้ชŒ่ฏ็ ๅ‘้€ๆˆๅŠŸ๏ผŒ่ฏทๆŸฅๆ”ถ้‚ฎไปถ', - 'user.login.sms.send-success': '้ชŒ่ฏ็ ๅ‘้€ๆˆๅŠŸ๏ผŒ่ฏทๆŸฅๆ”ถ็Ÿญไฟก', - 'user.login.remember-me': '่‡ชๅŠจ็™ปๅฝ•', - 'user.login.forgot-password': 'ๅฟ˜่ฎฐๅฏ†็ ', - 'user.login.sign-in-with': 'ๅ…ถไป–็™ปๅฝ•ๆ–นๅผ', - 'user.login.signup': 'ๆณจๅ†Œ่ดฆๆˆท', - 'user.login.login': '็™ปๅฝ•', - 'user.register.register': 'ๆณจๅ†Œ', - 'user.register.email.placeholder': '้‚ฎ็ฎฑ', - 'user.register.password.placeholder': '่ฏท่‡ณๅฐ‘่พ“ๅ…ฅ 6 ไธชๅญ—็ฌฆใ€‚่ฏทไธ่ฆไฝฟ็”จๅฎนๆ˜“่ขซ็Œœๅˆฐ็š„ๅฏ†็ ใ€‚', - 'user.register.password.popover-message': '่ฏท่‡ณๅฐ‘่พ“ๅ…ฅ 6 ไธชๅญ—็ฌฆใ€‚่ฏทไธ่ฆไฝฟ็”จๅฎนๆ˜“่ขซ็Œœๅˆฐ็š„ๅฏ†็ ใ€‚', - 'user.register.confirm-password.placeholder': '็กฎ่ฎคๅฏ†็ ', - 'user.register.get-verification-code': '่Žทๅ–้ชŒ่ฏ็ ', - 'user.register.sign-in': 'ไฝฟ็”จๅทฒๆœ‰่ดฆๆˆท็™ปๅฝ•', - 'user.register-result.msg': 'ไฝ ็š„่ดฆๆˆท๏ผš{email} ๆณจๅ†ŒๆˆๅŠŸ', - 'user.register-result.activation-email': 'ๆฟ€ๆดป้‚ฎไปถๅทฒๅ‘้€ๅˆฐไฝ ็š„้‚ฎ็ฎฑไธญ๏ผŒ้‚ฎไปถๆœ‰ๆ•ˆๆœŸไธบ24ๅฐๆ—ถใ€‚่ฏทๅŠๆ—ถ็™ปๅฝ•้‚ฎ็ฎฑ๏ผŒ็‚นๅ‡ป้‚ฎไปถไธญ็š„้“พๆŽฅๆฟ€ๆดป่ดฆๆˆทใ€‚', - 'user.register-result.back-home': '่ฟ”ๅ›ž้ฆ–้กต', - 'user.register-result.view-mailbox': 'ๆŸฅ็œ‹้‚ฎ็ฎฑ', - 'user.email.required': '่ฏท่พ“ๅ…ฅ้‚ฎ็ฎฑๅœฐๅ€๏ผ', - 'user.email.wrong-format': '้‚ฎ็ฎฑๅœฐๅ€ๆ ผๅผ้”™่ฏฏ๏ผ', - 'user.userName.required': '่ฏท่พ“ๅ…ฅ่ดฆๆˆทๅๆˆ–้‚ฎ็ฎฑๅœฐๅ€', - 'user.password.required': '่ฏท่พ“ๅ…ฅๅฏ†็ ๏ผ', - 'user.password.twice.msg': 'ไธคๆฌก่พ“ๅ…ฅ็š„ๅฏ†็ ไธๅŒน้…!', - 'user.password.strength.msg': 'ๅฏ†็ ๅผบๅบฆไธๅคŸ ', - 'user.password.strength.strong': 'ๅผบๅบฆ๏ผšๅผบ', - 'user.password.strength.medium': 'ๅผบๅบฆ๏ผšไธญ', - 'user.password.strength.low': 'ๅผบๅบฆ๏ผšไฝŽ', - 'user.password.strength.short': 'ๅผบๅบฆ๏ผšๅคช็Ÿญ', - 'user.confirm-password.required': '่ฏท็กฎ่ฎคๅฏ†็ ๏ผ', - 'user.phone-number.required': '่ฏท่พ“ๅ…ฅๆญฃ็กฎ็š„ๆ‰‹ๆœบๅท', - 'user.phone-number.wrong-format': 'ๆ‰‹ๆœบๅทๆ ผๅผ้”™่ฏฏ๏ผ', - 'user.verification-code.required': '่ฏท่พ“ๅ…ฅ้ชŒ่ฏ็ ๏ผ', - 'user.captcha.required': '่ฏท่พ“ๅ…ฅๅ›พๅฝข้ชŒ่ฏ็ ๏ผ', - 'user.login.infos': 'QuantDinger ๆ˜ฏไธ€ไธช AI ๅคšๆ™บ่ƒฝไฝ“่‚ก็ฅจๅˆ†ๆž่พ…ๅŠฉๅทฅๅ…ท๏ผŒไธๅ…ทๅค‡่ฏๅˆธๆŠ•่ต„ๅ’จ่ฏข่ต„่ดจใ€‚ๅนณๅฐไธญ็š„ๆ‰€ๆœ‰ๅˆ†ๆž็ป“ๆžœใ€่ฏ„ๅˆ†ใ€ๅ‚่€ƒๆ„่งๅ‡็”ฑ AI ๅŸบไบŽๅކๅฒๆ•ฐๆฎ่‡ชๅŠจ็”Ÿๆˆ๏ผŒไป…ไพ›ๅญฆไน ใ€็ ”็ฉถไธŽๆŠ€ๆœฏไบคๆตไฝฟ็”จ,ไธๆž„ๆˆไปปไฝ•ๆŠ•่ต„ๅปบ่ฎฎๆˆ–ๅ†ณ็ญ–ไพๆฎใ€‚่‚ก็ฅจๆŠ•่ต„ๅญ˜ๅœจๅธ‚ๅœบ้ฃŽ้™ฉใ€ๆตๅŠจๆ€ง้ฃŽ้™ฉใ€ๆ”ฟ็ญ–้ฃŽ้™ฉ็ญ‰ๅคš็ง้ฃŽ้™ฉ๏ผŒๅฏ่ƒฝๅฏผ่‡ดๆœฌ้‡‘ๆŸๅคฑใ€‚็”จๆˆทๅบ”ๅŸบไบŽ่‡ช่บซ้ฃŽ้™ฉๆ‰ฟๅ—่ƒฝๅŠ›็‹ฌ็ซ‹ๅ†ณ็ญ–๏ผŒไฝฟ็”จๆœฌๅทฅๅ…ทไบง็”Ÿ็š„ไปปไฝ•ๆŠ•่ต„่กŒไธบๅŠๅ…ถๅŽๆžœ็”ฑ็”จๆˆท่‡ช่กŒๆ‰ฟๆ‹…ใ€‚ๅธ‚ๅœบๆœ‰้ฃŽ้™ฉ๏ผŒๆŠ•่ต„้œ€่ฐจๆ…Žใ€‚', - 'user.login.tab-login-web3': 'Web3 ็™ปๅฝ•', - 'user.login.web3.tip': 'ไฝฟ็”จ้’ฑๅŒ…่ฟ›่กŒ็ญพๅ็™ปๅฝ•', - 'user.login.web3.connect': '่ฟžๆŽฅ้’ฑๅŒ…ๅนถ็™ปๅฝ•', - 'user.login.web3.no-wallet': 'ๆœชๆฃ€ๆต‹ๅˆฐ้’ฑๅŒ…', - 'user.login.web3.no-address': 'ๆœช่Žทๅ–ๅˆฐ้’ฑๅŒ…ๅœฐๅ€', - 'user.login.web3.nonce-failed': '่Žทๅ–้šๆœบๆ•ฐๅคฑ่ดฅ', - 'user.login.web3.verify-failed': '็ญพๅ้ชŒ่ฏๅคฑ่ดฅ', - 'user.login.web3.success': '็™ปๅฝ•ๆˆๅŠŸ', - 'user.login.web3.failed': '้’ฑๅŒ…็™ปๅฝ•ๅคฑ่ดฅ', - 'nav.no_wallet': 'ๆœชๆฃ€ๆต‹ๅˆฐ้’ฑๅŒ…', - 'nav.copy': 'ๅคๅˆถ', - 'nav.copy_success': 'ๅคๅˆถๆˆๅŠŸ', - 'user.login.oauth.google': 'ไฝฟ็”จ Google ็™ปๅฝ•', - 'user.login.oauth.github': 'ไฝฟ็”จ GitHub ็™ปๅฝ•', - 'user.login.oauth.loading': 'ๆญฃๅœจ่ทณ่ฝฌๅˆฐๆŽˆๆƒ้กต้ข...', - 'user.login.oauth.failed': 'OAuth ็™ปๅฝ•ๅคฑ่ดฅ', - 'user.login.oauth.get-url-failed': '่Žทๅ–ๆŽˆๆƒ้“พๆŽฅๅคฑ่ดฅ', - 'user.login.subtitle': '้ฉฑๅŠจ็š„ๅ…จ็ƒๅธ‚ๅœบ้‡ๅŒ–ๆดžๅฏŸ', - 'user.login.legal.title': 'ๆณ•ๅพ‹ๅ…่ดฃๅฃฐๆ˜Ž', - 'user.login.legal.view': 'ๆŸฅ็œ‹ๆณ•ๅพ‹ๅ…่ดฃๅฃฐๆ˜Ž', - 'user.login.legal.collapse': 'ๆ”ถ่ตทๆณ•ๅพ‹ๅ…่ดฃๅฃฐๆ˜Ž', - 'user.login.legal.agree': 'ๆˆ‘ๅทฒ้˜…่ฏปๅนถๅŒๆ„ๆณ•ๅพ‹ๅ…่ดฃๅฃฐๆ˜Ž', - 'user.login.legal.required': '่ฏทๅ…ˆ้˜…่ฏปๅนถๅ‹พ้€‰ๆณ•ๅพ‹ๅ…่ดฃๅฃฐๆ˜Ž', - 'user.login.legal.content': 'QuantDinger ๆ˜ฏไธ€ไธช AI ๅคšๆ™บ่ƒฝไฝ“่‚ก็ฅจๅˆ†ๆž่พ…ๅŠฉๅทฅๅ…ท๏ผŒไธๅ…ทๅค‡่ฏๅˆธๆŠ•่ต„ๅ’จ่ฏข่ต„่ดจใ€‚ๅนณๅฐไธญ็š„ๆ‰€ๆœ‰ๅˆ†ๆž็ป“ๆžœใ€่ฏ„ๅˆ†ใ€ๅ‚่€ƒๆ„่งๅ‡็”ฑ AI ๅŸบไบŽๅކๅฒๆ•ฐๆฎ่‡ชๅŠจ็”Ÿๆˆ๏ผŒไป…ไพ›ๅญฆไน ใ€็ ”็ฉถไธŽๆŠ€ๆœฏไบคๆตไฝฟ็”จ๏ผŒไธๆž„ๆˆไปปไฝ•ๆŠ•่ต„ๅปบ่ฎฎๆˆ–ๅ†ณ็ญ–ไพๆฎใ€‚่‚ก็ฅจๆŠ•่ต„ๅญ˜ๅœจๅธ‚ๅœบ้ฃŽ้™ฉใ€ๆตๅŠจๆ€ง้ฃŽ้™ฉใ€ๆ”ฟ็ญ–้ฃŽ้™ฉ็ญ‰ๅคš็ง้ฃŽ้™ฉ๏ผŒๅฏ่ƒฝๅฏผ่‡ดๆœฌ้‡‘ๆŸๅคฑใ€‚็”จๆˆทๅบ”ๅŸบไบŽ่‡ช่บซ้ฃŽ้™ฉๆ‰ฟๅ—่ƒฝๅŠ›็‹ฌ็ซ‹ๅ†ณ็ญ–๏ผŒไฝฟ็”จๆœฌๅทฅๅ…ทไบง็”Ÿ็š„ไปปไฝ•ๆŠ•่ต„่กŒไธบๅŠๅ…ถๅŽๆžœ็”ฑ็”จๆˆท่‡ช่กŒๆ‰ฟๆ‹…ใ€‚ๅธ‚ๅœบๆœ‰้ฃŽ้™ฉ๏ผŒๆŠ•่ต„้œ€่ฐจๆ…Žใ€‚', - 'user.login.privacy.title': '็”จๆˆท้š็งๆกๆฌพ', - 'user.login.privacy.view': 'ๆŸฅ็œ‹็”จๆˆท้š็งๆกๆฌพ', - 'user.login.privacy.collapse': 'ๆ”ถ่ตท็”จๆˆท้š็งๆกๆฌพ', - 'user.login.privacy.content': 'ๆˆ‘ไปฌ้‡่ง†ๆ‚จ็š„้š็งไธŽๆ•ฐๆฎไฟๆŠคใ€‚1) ๆ”ถ้›†่Œƒๅ›ด๏ผšไป…ๆ”ถ้›†ๅฎž็ŽฐๅŠŸ่ƒฝๆ‰€้œ€็š„ไฟกๆฏ๏ผˆๅฆ‚้‚ฎ็ฎฑใ€ๆ‰‹ๆœบๅทใ€ๅŒบๅทใ€Web3 ้’ฑๅŒ…ๅœฐๅ€๏ผ‰ไปฅๅŠๅฟ…่ฆ็š„ๆ—ฅๅฟ—ไธŽ่ฎพๅค‡ไฟกๆฏใ€‚2) ไฝฟ็”จ็›ฎ็š„๏ผš็”จไบŽ่ดฆๆˆท็™ปๅฝ•ไธŽๅฎ‰ๅ…จๆ ก้ชŒใ€ๆœๅŠกๅŠŸ่ƒฝๆไพ›ใ€้—ฎ้ข˜ๆŽ’ๆŸฅไธŽๅˆ่ง„่ฆๆฑ‚ใ€‚3) ๅญ˜ๅ‚จไธŽๅฎ‰ๅ…จ๏ผšๆ•ฐๆฎๅŠ ๅฏ†ๅญ˜ๅ‚จ๏ผŒๅนถ้‡‡ๅ–ๅฟ…่ฆ็š„ๆƒ้™ไธŽ่ฎฟ้—ฎๆŽงๅˆถๆŽชๆ–ฝ๏ผŒๅฐฝๅŠ›้˜ฒๆญขๆœช็ปๆŽˆๆƒ็š„่ฎฟ้—ฎใ€ๆŠซ้œฒๆˆ–ไธขๅคฑใ€‚4) ๅ…ฑไบซไธŽ็ฌฌไธ‰ๆ–น๏ผš้™คๆณ•ๅพ‹ๆณ•่ง„่ฆๆฑ‚ๆˆ–ๅฑฅ่กŒๆœๅŠกๆ‰€ๅฟ…้œ€ๅค–๏ผŒไธไผšไธŽ็ฌฌไธ‰ๆ–นๅ…ฑไบซๆ‚จ็š„ไธชไบบไฟกๆฏ๏ผ›่‹ฅๆถ‰ๅŠ็ฌฌไธ‰ๆ–นๆœๅŠก๏ผˆๅฆ‚้’ฑๅŒ…ใ€็ŸญไฟกๆœๅŠกๅ•†๏ผ‰๏ผŒไป…ๅœจๅฎž็ŽฐๅŠŸ่ƒฝๆ‰€้œ€็š„ๆœ€ๅฐ่Œƒๅ›ดๅ†…ๅค„็†ใ€‚5) Cookies/ๆœฌๅœฐๅญ˜ๅ‚จ๏ผš็”จไบŽ็™ปๅฝ•ๆ€ไธŽๅฟ…่ฆ็š„ไผš่ฏ็ปดๆŒ๏ผˆๅฆ‚ไปค็‰Œใ€PHPSESSID๏ผ‰๏ผŒๆ‚จๅฏๅœจๆต่งˆๅ™จไธญ่ฟ›่กŒๆธ…็†ๆˆ–้™ๅˆถใ€‚6) ไธชไบบๆƒๅˆฉ๏ผšๆ‚จๅฏๆ นๆฎๆณ•ๅพ‹ๆณ•่ง„่กŒไฝฟๆŸฅ่ฏขใ€ๆ›ดๆญฃใ€ๅˆ ้™คใ€ๆ’คๅ›žๅŒๆ„็ญ‰ๆƒๅˆฉใ€‚7) ๅ˜ๆ›ดไธŽ้€š็Ÿฅ๏ผšๆœฌๆกๆฌพๆ›ดๆ–ฐๅŽๅฐ†ๅœจ้กต้ขๆ˜พ่‘—ไฝ็ฝฎๆ็คบใ€‚็ปง็ปญไฝฟ็”จๆœฌๆœๅŠกๅณ่กจ็คบๆ‚จๅทฒ้˜…่ฏปๅนถๅŒๆ„ๆ›ดๆ–ฐๅ†…ๅฎนใ€‚่‹ฅๆ‚จไธๅŒๆ„ๆœฌๆกๆฌพๆˆ–ๅ…ถไธญไปปไฝ•ๆ›ดๆ–ฐ๏ผŒ่ฏทๅœๆญขไฝฟ็”จๆœฌๆœๅŠกๅนถ่”็ณปๆˆ‘ไปฌใ€‚', - - // Login page additions - 'user.login.username': '็”จๆˆทๅ', - 'user.login.usernameRequired': '่ฏท่พ“ๅ…ฅ็”จๆˆทๅ', - 'user.login.passwordRequired': '่ฏท่พ“ๅ…ฅๅฏ†็ ', - 'user.login.tab': '็™ปๅฝ•', - 'user.login.submit': '็™ปๅฝ•', - 'user.login.register': 'ๆณจๅ†Œ่ดฆๆˆท', - 'user.login.forgotPassword': 'ๅฟ˜่ฎฐๅฏ†็ ?', - 'user.login.orLoginWith': 'ๆˆ–ไฝฟ็”จไปฅไธ‹ๆ–นๅผ็™ปๅฝ•', - 'user.login.methodPassword': 'ๅฏ†็ ็™ปๅฝ•', - 'user.login.methodCode': '้ชŒ่ฏ็ ็™ปๅฝ•', - 'user.login.email': '้‚ฎ็ฎฑ', - 'user.login.emailRequired': '่ฏท่พ“ๅ…ฅ้‚ฎ็ฎฑ', - 'user.login.emailInvalid': '้‚ฎ็ฎฑๆ ผๅผไธๆญฃ็กฎ', - 'user.login.verificationCode': '้ชŒ่ฏ็ ', - 'user.login.codeRequired': '่ฏท่พ“ๅ…ฅ้ชŒ่ฏ็ ', - 'user.login.sendCode': 'ๅ‘้€', - 'user.login.codeSent': '้ชŒ่ฏ็ ๅทฒๅ‘้€', - 'user.login.codeLoginHint': 'ๆ–ฐ็”จๆˆทๅฐ†่‡ชๅŠจๆณจๅ†Œ', - 'user.login.welcomeNew': 'ๆฌข่ฟŽ!', - 'user.login.accountCreated': 'ๆ‚จ็š„่ดฆๆˆทๅทฒๅˆ›ๅปบๆˆๅŠŸ', - - // OAuth - 'user.oauth.processing': 'ๆญฃๅœจๅค„็†็™ปๅฝ•...', - 'user.oauth.error.missing_params': '็ผบๅฐ‘ๅฟ…่ฆๅ‚ๆ•ฐ', - 'user.oauth.error.invalid_state': 'ๆ— ๆ•ˆ็š„็Šถๆ€ๅ‚ๆ•ฐ', - 'user.oauth.error.user_creation_failed': 'ๅˆ›ๅปบ็”จๆˆทๅคฑ่ดฅ', - 'user.oauth.error.server_error': 'ๆœๅŠกๅ™จ้”™่ฏฏ', - - // Register page - 'user.register.tab': 'ๆณจๅ†Œ', - 'user.register.title': 'ๅˆ›ๅปบ่ดฆๆˆท', - 'user.register.email': '้‚ฎ็ฎฑ', - 'user.register.emailRequired': '่ฏท่พ“ๅ…ฅ้‚ฎ็ฎฑ', - 'user.register.emailInvalid': '้‚ฎ็ฎฑๆ ผๅผไธๆญฃ็กฎ', - 'user.register.verificationCode': '้ชŒ่ฏ็ ', - 'user.register.codeRequired': '่ฏท่พ“ๅ…ฅ้ชŒ่ฏ็ ', - 'user.register.sendCode': 'ๅ‘้€้ชŒ่ฏ็ ', - 'user.register.codeSent': '้ชŒ่ฏ็ ๅทฒๅ‘้€', - 'user.register.username': '็”จๆˆทๅ', - 'user.register.usernameRequired': '่ฏท่พ“ๅ…ฅ็”จๆˆทๅ', - 'user.register.usernameLength': '็”จๆˆทๅ้œ€่ฆ3-30ไธชๅญ—็ฌฆ', - 'user.register.usernamePattern': 'ไปฅๅญ—ๆฏๅผ€ๅคด๏ผŒๅช่ƒฝๅŒ…ๅซๅญ—ๆฏใ€ๆ•ฐๅญ—ๅ’Œไธ‹ๅˆ’็บฟ', - 'user.register.password': 'ๅฏ†็ ', - 'user.register.passwordRequired': '่ฏท่พ“ๅ…ฅๅฏ†็ ', - 'user.register.confirmPassword': '็กฎ่ฎคๅฏ†็ ', - 'user.register.confirmPasswordRequired': '่ฏท็กฎ่ฎคๅฏ†็ ', - 'user.register.passwordMismatch': 'ไธคๆฌก่พ“ๅ…ฅ็š„ๅฏ†็ ไธไธ€่‡ด', - 'user.register.submit': 'ๅˆ›ๅปบ่ดฆๆˆท', - 'user.register.haveAccount': 'ๅทฒๆœ‰่ดฆๆˆท?', - 'user.register.login': '็™ปๅฝ•', - 'user.register.success': 'ๆณจๅ†ŒๆˆๅŠŸ', - 'user.register.pleaseLogin': '่ฏทไฝฟ็”จๆ–ฐ่ดฆๆˆท็™ปๅฝ•', - 'user.register.pwdMinLength': '่‡ณๅฐ‘8ไธชๅญ—็ฌฆ', - 'user.register.pwdUppercase': '่‡ณๅฐ‘ๅŒ…ๅซไธ€ไธชๅคงๅ†™ๅญ—ๆฏ', - 'user.register.pwdLowercase': '่‡ณๅฐ‘ๅŒ…ๅซไธ€ไธชๅฐๅ†™ๅญ—ๆฏ', - 'user.register.pwdNumber': '่‡ณๅฐ‘ๅŒ…ๅซไธ€ไธชๆ•ฐๅญ—', - - // Reset password page - 'user.resetPassword.title': '้‡็ฝฎๅฏ†็ ', - 'user.resetPassword.email': '้‚ฎ็ฎฑ', - 'user.resetPassword.emailRequired': '่ฏท่พ“ๅ…ฅ้‚ฎ็ฎฑ', - 'user.resetPassword.emailInvalid': '้‚ฎ็ฎฑๆ ผๅผไธๆญฃ็กฎ', - 'user.resetPassword.verificationCode': '้ชŒ่ฏ็ ', - 'user.resetPassword.codeRequired': '่ฏท่พ“ๅ…ฅ้ชŒ่ฏ็ ', - 'user.resetPassword.sendCode': 'ๅ‘้€้ชŒ่ฏ็ ', - 'user.resetPassword.codeSent': '้ชŒ่ฏ็ ๅทฒๅ‘้€', - 'user.resetPassword.next': 'ไธ‹ไธ€ๆญฅ', - 'user.resetPassword.backToLogin': '่ฟ”ๅ›ž็™ปๅฝ•', - 'user.resetPassword.resettingFor': 'ๆญฃๅœจไธบไปฅไธ‹้‚ฎ็ฎฑ้‡็ฝฎๅฏ†็ ', - 'user.resetPassword.newPassword': 'ๆ–ฐๅฏ†็ ', - 'user.resetPassword.passwordRequired': '่ฏท่พ“ๅ…ฅๆ–ฐๅฏ†็ ', - 'user.resetPassword.confirmPassword': '็กฎ่ฎคๆ–ฐๅฏ†็ ', - 'user.resetPassword.confirmPasswordRequired': '่ฏท็กฎ่ฎคๆ–ฐๅฏ†็ ', - 'user.resetPassword.submit': '้‡็ฝฎๅฏ†็ ', - 'user.resetPassword.back': '่ฟ”ๅ›ž', - 'user.resetPassword.successTitle': 'ๅฏ†็ ้‡็ฝฎๆˆๅŠŸ', - 'user.resetPassword.successSubtitle': 'ๆ‚จ็Žฐๅœจๅฏไปฅไฝฟ็”จๆ–ฐๅฏ†็ ็™ปๅฝ•ไบ†', - 'user.resetPassword.goToLogin': 'ๅ‰ๅพ€็™ปๅฝ•', - - // Security - 'user.security.retry': '้‡่ฏ•', - - // Profile - change password - 'profile.passwordHintNew': 'ไธบไบ†ๅฎ‰ๅ…จ๏ผŒไฟฎๆ”นๅฏ†็ ้œ€่ฆ้‚ฎ็ฎฑ้ชŒ่ฏใ€‚ๅฏ†็ ่‡ณๅฐ‘8ไธชๅญ—็ฌฆ๏ผŒๅŒ…ๅซๅคงๅฐๅ†™ๅญ—ๆฏๅ’Œๆ•ฐๅญ—ใ€‚', - 'profile.verificationCode': '้ชŒ่ฏ็ ', - 'profile.codeRequired': '่ฏท่พ“ๅ…ฅ้ชŒ่ฏ็ ', - 'profile.codePlaceholder': '่พ“ๅ…ฅ้ชŒ่ฏ็ ', - 'profile.sendCode': 'ๅ‘้€้ชŒ่ฏ็ ', - 'profile.codeSent': '้ชŒ่ฏ็ ๅทฒๅ‘้€', - 'profile.codeWillSendTo': '้ชŒ่ฏ็ ๅฐ†ๅ‘้€่‡ณ', - 'profile.noEmailWarning': '่ฏทๅ…ˆๅœจๅŸบๆœฌไฟกๆฏไธญ่ฎพ็ฝฎ้‚ฎ็ฎฑ', - - 'account.basicInfo': 'ๅŸบ็ก€ไฟกๆฏ', - 'account.id': '็”จๆˆทID', - 'account.username': '็”จๆˆทๅ', - 'account.nickname': 'ๆ˜ต็งฐ', - 'account.email': '้‚ฎ็ฎฑ', - 'account.mobile': 'ๆ‰‹ๆœบๅท', - 'account.web3address': '้’ฑๅŒ…ๅœฐๅ€', - 'account.pid': 'ๆŽจ่ไบบID', - 'account.level': '็”จๆˆท็ญ‰็บง', - 'account.money': 'ไฝ™้ข', - 'account.qdtBalance': 'QDT ไฝ™้ข', - 'account.score': '็งฏๅˆ†', - 'account.createtime': 'ๆณจๅ†Œๆ—ถ้—ด', - 'account.inviteLink': '้‚€่ฏท้“พๆŽฅ', - 'account.recharge': 'ๅ……ๅ€ผ', - 'account.rechargeTip': '่ฏทไฝฟ็”จๅพฎไฟกๆˆ–ๆ”ฏไป˜ๅฎๆ‰ซๆไธ‹ๆ–นไบŒ็ปด็ ่ฟ›่กŒๅ……ๅ€ผ', - 'account.qrCodePlaceholder': 'ไบŒ็ปด็ ๅ ไฝ็ฌฆ๏ผˆๆจกๆ‹Ÿ๏ผ‰', - 'account.rechargeAmount': 'ๅ……ๅ€ผ้‡‘้ข', - 'account.enterAmount': '่ฏท่พ“ๅ…ฅๅ……ๅ€ผ้‡‘้ข', - 'account.rechargeHint': 'ๆœ€ๅฐๅ……ๅ€ผ้‡‘้ข๏ผš1 QDT', - 'account.confirmRecharge': '็กฎ่ฎคๅ……ๅ€ผ', - 'account.enterValidAmount': '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆ็š„ๅ……ๅ€ผ้‡‘้ข', - 'account.rechargeSuccess': 'ๅ……ๅ€ผๆˆๅŠŸ๏ผๅทฒๅ……ๅ€ผ {amount} QDT', - 'account.settings.menuMap.basic': 'ๅŸบๆœฌ่ฎพ็ฝฎ', - 'account.settings.menuMap.security': 'ๅฎ‰ๅ…จ่ฎพ็ฝฎ', - 'account.settings.menuMap.notification': 'ๆ–ฐๆถˆๆฏ้€š็Ÿฅ', - 'account.settings.menuMap.moneyLog': '่ต„้‡‘ๆ˜Ž็ป†', - 'account.moneyLog.empty': 'ๆš‚ๆ— ่ต„้‡‘ๆ˜Ž็ป†', - 'account.moneyLog.total': 'ๅ…ฑ {total} ๆก่ฎฐๅฝ•', - 'account.moneyLog.type.purchase': '่ดญไนฐๆŒ‡ๆ ‡', - 'account.moneyLog.type.recharge': 'ๅ……ๅ€ผ', - 'account.moneyLog.type.refund': '้€€ๆฌพ', - 'account.moneyLog.type.reward': 'ๅฅ–ๅŠฑ', - 'account.moneyLog.type.income': 'ๆŒ‡ๆ ‡ๆ”ถๅ…ฅ', - 'account.moneyLog.type.commission': 'ๅนณๅฐๆ‰‹็ปญ่ดน', - 'wallet.balance': 'QDT ไฝ™้ข', - 'wallet.recharge': 'ๅ……ๅ€ผ', - 'wallet.withdraw': 'ๆ็Žฐ', - 'wallet.filter': '็ญ›้€‰', - 'wallet.reset': '้‡็ฝฎ', - 'wallet.totalRecharge': '็ดฏ่ฎกๅ……ๅ€ผ', - 'wallet.totalWithdraw': '็ดฏ่ฎกๆ็Žฐ', - 'wallet.totalIncome': '็ดฏ่ฎกๆ”ถๅ…ฅ', - 'wallet.records': 'ไบคๆ˜“่ฎฐๅฝ•ไธŽ่ต„้‡‘ๆ˜Ž็ป†', - 'wallet.tradingRecords': 'ไบคๆ˜“่ฎฐๅฝ•', - 'wallet.moneyLog': '่ต„้‡‘ๆ˜Ž็ป†', - 'wallet.rechargeTip': '่ฏทไฝฟ็”จๅพฎไฟกๆˆ–ๆ”ฏไป˜ๅฎๆ‰ซๆไธ‹ๆ–นไบŒ็ปด็ ่ฟ›่กŒๅ……ๅ€ผ', - 'wallet.qrCodePlaceholder': 'ไบŒ็ปด็ ๅ ไฝ็ฌฆ๏ผˆๆจกๆ‹Ÿ๏ผ‰', - 'wallet.rechargeAmount': 'ๅ……ๅ€ผ้‡‘้ข', - 'wallet.enterAmount': '่ฏท่พ“ๅ…ฅๅ……ๅ€ผ้‡‘้ข', - 'wallet.rechargeHint': 'ๆœ€ๅฐๅ……ๅ€ผ้‡‘้ข๏ผš1 QDT', - 'wallet.confirmRecharge': '็กฎ่ฎคๅ……ๅ€ผ', - 'wallet.enterValidAmount': '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆ็š„ๅ……ๅ€ผ้‡‘้ข', - 'wallet.rechargeSuccess': 'ๅ……ๅ€ผๆˆๅŠŸ๏ผๅทฒๅ……ๅ€ผ {amount} QDT', - 'wallet.rechargeFailed': 'ๅ……ๅ€ผๅคฑ่ดฅ', - 'wallet.withdrawTip': '่ฏท่พ“ๅ…ฅๆ็Žฐ้‡‘้ขๅ’Œๆ็Žฐๅœฐๅ€', - 'wallet.withdrawAmount': 'ๆ็Žฐ้‡‘้ข', - 'wallet.enterWithdrawAmount': '่ฏท่พ“ๅ…ฅๆ็Žฐ้‡‘้ข', - 'wallet.withdrawHint': 'ๆœ€ๅฐๆ็Žฐ้‡‘้ข๏ผš1 QDT', - 'wallet.withdrawAddress': 'ๆ็Žฐๅœฐๅ€๏ผˆๅฏ้€‰๏ผ‰', - 'wallet.enterWithdrawAddress': '่ฏท่พ“ๅ…ฅๆ็Žฐๅœฐๅ€', - 'wallet.confirmWithdraw': '็กฎ่ฎคๆ็Žฐ', - 'wallet.enterValidWithdrawAmount': '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆ็š„ๆ็Žฐ้‡‘้ข', - 'wallet.insufficientBalance': 'ไฝ™้ขไธ่ถณ', - 'wallet.withdrawSuccess': 'ๆ็ŽฐๆˆๅŠŸ๏ผๅทฒๆ็Žฐ {amount} QDT', - 'wallet.withdrawFailed': 'ๆ็Žฐๅคฑ่ดฅ', - 'wallet.noTradingRecords': 'ๆš‚ๆ— ไบคๆ˜“่ฎฐๅฝ•', - 'wallet.noMoneyLog': 'ๆš‚ๆ— ่ต„้‡‘ๆ˜Ž็ป†', - 'wallet.loadTradingRecordsFailed': 'ๅŠ ่ฝฝไบคๆ˜“่ฎฐๅฝ•ๅคฑ่ดฅ', - 'wallet.loadMoneyLogFailed': 'ๅŠ ่ฝฝ่ต„้‡‘ๆ˜Ž็ป†ๅคฑ่ดฅ', - 'wallet.moneyLogTotal': 'ๅ…ฑ {total} ๆก่ฎฐๅฝ•', - 'wallet.moneyLogTypeTitle': '็ฑปๅž‹', - 'wallet.moneyLogType.all': 'ๅ…จ้ƒจ็ฑปๅž‹', - 'wallet.table.time': 'ๆ—ถ้—ด', - 'wallet.table.type': '็ฑปๅž‹', - 'wallet.table.price': 'ไปทๆ ผ', - 'wallet.table.amount': 'ๆ•ฐ้‡', - 'wallet.table.money': '้‡‘้ข', - 'wallet.table.balance': 'ไฝ™้ข', - 'wallet.table.memo': 'ๅค‡ๆณจ', - 'wallet.table.value': 'ไปทๅ€ผ', - 'wallet.table.profit': '็›ˆไบ', - 'wallet.table.commission': 'ๆ‰‹็ปญ่ดน', - 'wallet.table.total': 'ๅ…ฑ {total} ๆก่ฎฐๅฝ•', - 'wallet.tradeType.buy': 'ไนฐๅ…ฅ', - 'wallet.tradeType.sell': 'ๅ–ๅ‡บ', - 'wallet.tradeType.liquidation': 'ๅผบๅนณ', - 'wallet.tradeType.openLong': 'ๅผ€ๅคš', - 'wallet.tradeType.addLong': 'ๅŠ ๅคš', - 'wallet.tradeType.closeLong': 'ๅนณๅคš', - 'wallet.tradeType.closeLongStop': 'ๆญขๆŸๅนณๅคš', - 'wallet.tradeType.closeLongProfit': 'ๆญข็›ˆๅนณๅคš', - 'wallet.tradeType.openShort': 'ๅผ€็ฉบ', - 'wallet.tradeType.addShort': 'ๅŠ ็ฉบ', - 'wallet.tradeType.closeShort': 'ๅนณ็ฉบ', - 'wallet.tradeType.closeShortStop': 'ๆญขๆŸๅนณ็ฉบ', - 'wallet.tradeType.closeShortProfit': 'ๆญข็›ˆๅนณ็ฉบ', - 'wallet.moneyLogType.purchase': '่ดญไนฐๆŒ‡ๆ ‡', - 'wallet.moneyLogType.recharge': 'ๅ……ๅ€ผ', - 'wallet.moneyLogType.withdraw': 'ๆ็Žฐ', - 'wallet.moneyLogType.refund': '้€€ๆฌพ', - 'wallet.moneyLogType.reward': 'ๅฅ–ๅŠฑ', - 'wallet.moneyLogType.income': 'ๆ”ถๅ…ฅ', - 'wallet.moneyLogType.commission': 'ๆ‰‹็ปญ่ดน', - 'wallet.web3Address.required': '่ฏทๅ…ˆๅกซๅ†™Web3้’ฑๅŒ…ๅœฐๅ€', - 'wallet.web3Address.requiredDescription': 'ๅ……ๅ€ผๅ‰้œ€่ฆๅ…ˆ็ป‘ๅฎšๆ‚จ็š„Web3้’ฑๅŒ…ๅœฐๅ€๏ผŒ็”จไบŽๆŽฅๆ”ถๅ……ๅ€ผ', - 'wallet.web3Address.placeholder': '่ฏท่พ“ๅ…ฅๆ‚จ็š„Web3้’ฑๅŒ…ๅœฐๅ€๏ผˆ0xๅผ€ๅคด๏ผ‰', - 'wallet.web3Address.save': 'ไฟๅญ˜้’ฑๅŒ…ๅœฐๅ€', - 'wallet.web3Address.saveSuccess': '้’ฑๅŒ…ๅœฐๅ€ไฟๅญ˜ๆˆๅŠŸ', - 'wallet.web3Address.saveFailed': 'ไฟๅญ˜้’ฑๅŒ…ๅœฐๅ€ๅคฑ่ดฅ', - 'wallet.web3Address.invalidFormat': '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆ็š„Web3้’ฑๅŒ…ๅœฐๅ€๏ผˆไปฅๅคชๅŠๆ ผๅผ๏ผš0xๅผ€ๅคด42ไฝๅญ—็ฌฆ๏ผŒๆˆ–TRC20ๆ ผๅผ๏ผšTๅผ€ๅคด34ไฝๅญ—็ฌฆ๏ผ‰', - 'wallet.selectCoin': '้€‰ๆ‹ฉๅธ็ง', - 'wallet.selectChain': '้€‰ๆ‹ฉ้“พ', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'ๆƒณ่ฆๅ…‘ๆข็š„QDTๆ•ฐ้‡๏ผˆๅฏ้€‰๏ผ‰', - 'wallet.targetQdtAmount.placeholder': '่ฏท่พ“ๅ…ฅๆƒณ่ฆๅ…‘ๆข็š„QDTๆ•ฐ้‡๏ผŒๅฝ“ๅ‰QDTไปทๆ ผ๏ผš{price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': '้œ€่ฆๅ……ๅ€ผ๏ผš{amount} USDT', - 'wallet.rechargeAddress': 'ๅ……ๅ€ผๅœฐๅ€', - 'wallet.copyAddress': 'ๅคๅˆถ', - 'wallet.copySuccess': 'ๅคๅˆถๆˆๅŠŸ๏ผ', - 'wallet.copyFailed': 'ๅคๅˆถๅคฑ่ดฅ๏ผŒ่ฏทๆ‰‹ๅŠจๅคๅˆถ', - 'wallet.rechargeAddressHint': '่ฏท็กฎไฟไฝฟ็”จ{chain}้“พๅ‘ๆญคๅœฐๅ€ๅ……ๅ€ผ{coin}', - 'wallet.qdtPrice.loading': 'ๅŠ ่ฝฝไธญ...', - 'wallet.rechargeTip.new': '่ฏท้€‰ๆ‹ฉๅธ็งๅ’Œ้“พ๏ผŒ็„ถๅŽๆ‰ซๆไธ‹ๆ–นไบŒ็ปด็ ่ฟ›่กŒๅ……ๅ€ผ', - 'wallet.exchangeRate': '1 QDT โ‰ˆ {rate} USDT', - 'wallet.withdrawableAmount': 'ๅฏๆ็Žฐ้‡‘้ข', - 'wallet.totalBalance': 'ๆ€ปไฝ™้ข', - 'wallet.insufficientWithdrawable': 'ๅฏๆ็Žฐ้‡‘้ขไธ่ถณ๏ผŒๅฝ“ๅ‰ๅฏๆ็Žฐ๏ผš{amount} QDT', - 'wallet.withdrawAddressRequired': '่ฏท่พ“ๅ…ฅๆ็Žฐๅœฐๅ€', - 'wallet.withdrawAddressHint': '่ฏท็กฎไฟๅœฐๅ€ๆญฃ็กฎ๏ผŒๆ็ŽฐๅŽๆ— ๆณ•ๆ’ค้”€', - 'wallet.withdrawSubmitSuccess': 'ๆ็Žฐ็”ณ่ฏทๆไบคๆˆๅŠŸ๏ผŒ่ฏท็ญ‰ๅพ…ๅฎกๆ ธ', - 'menu.footer.contactUs': '่”็ณปๆˆ‘ไปฌ', - 'menu.footer.getSupport': '่Žทๅ–ๆ”ฏๆŒ', - 'menu.footer.socialAccounts': '็คพไบค่ดฆๆˆท', - 'menu.footer.userAgreement': '็”จๆˆทๅ่ฎฎ', - 'menu.footer.privacyPolicy': '้š็งๆกไพ‹', - 'menu.footer.support': 'Support', - 'menu.footer.featureRequest': 'Feature request', - 'menu.footer.email': 'Email', - 'menu.footer.liveChat': '24/7 live chat', - 'dashboard.analysis.title': 'Multi-Dimensional Analysis', - 'dashboard.analysis.subtitle': 'AI้ฉฑๅŠจ็š„็ปผๅˆ้‡‘่žๅˆ†ๆžๅนณๅฐ', - 'dashboard.analysis.selectSymbol': '้€‰ๆ‹ฉๆˆ–่พ“ๅ…ฅๆ ‡็š„ไปฃ็ ', - 'dashboard.analysis.selectModel': '้€‰ๆ‹ฉๆจกๅž‹', - 'dashboard.analysis.startAnalysis': 'ๅผ€ๅง‹ๅˆ†ๆž', - 'dashboard.analysis.history': 'ๅކๅฒ่ฎฐๅฝ•', - 'dashboard.analysis.tab.overview': '็ปผๅˆๅˆ†ๆž', - 'dashboard.analysis.tab.fundamental': 'ๅŸบๆœฌ้ข', - 'dashboard.analysis.tab.technical': 'ๆŠ€ๆœฏ', - 'dashboard.analysis.tab.news': 'ๆ–ฐ้—ป', - 'dashboard.analysis.tab.sentiment': 'ๆƒ…็ปช', - 'dashboard.analysis.tab.risk': '้ฃŽ้™ฉ', - 'dashboard.analysis.tab.debate': 'ๅคš็ฉบ่พฉ่ฎบ', - 'dashboard.analysis.tab.decision': 'ๆœ€็ปˆๅ†ณ็ญ–', - 'dashboard.analysis.empty.selectSymbol': '้€‰ๆ‹ฉๆ ‡็š„ๅผ€ๅง‹ๅˆ†ๆž', - 'dashboard.analysis.empty.selectSymbolDesc': 'ไปŽ่‡ช้€‰่‚กๅˆ—่กจไธญ้€‰ๆ‹ฉๆˆ–่พ“ๅ…ฅๆ ‡็š„ไปฃ็ ๏ผŒ่Žทๅ–ๅคš็ปดๅบฆAIๅˆ†ๆžๆŠฅๅ‘Š', - 'dashboard.analysis.empty.startAnalysis': '็‚นๅ‡ป"ๅผ€ๅง‹ๅˆ†ๆž"ๆŒ‰้’ฎ่ฟ›่กŒๅคš็ปดๅบฆๅˆ†ๆž', - 'dashboard.analysis.empty.startAnalysisDesc': 'ๆˆ‘ไปฌๅฐ†ไปŽๅŸบๆœฌ้ขใ€ๆŠ€ๆœฏใ€ๆ–ฐ้—ปใ€ๆƒ…็ปชๅ’Œ้ฃŽ้™ฉ็ญ‰ๅคšไธช็ปดๅบฆไธบๆ‚จๆไพ›ๅ…จ้ข็š„ๅˆ†ๆž', - 'dashboard.analysis.empty.noData': 'ๆš‚ๆ— {type}ๅˆ†ๆžๆ•ฐๆฎ๏ผŒ่ฏทๅ…ˆ่ฟ›่กŒ็ปผๅˆๅˆ†ๆž', - 'dashboard.analysis.empty.noWatchlist': 'ๆš‚ๆ— ่‡ช้€‰่‚ก', - 'dashboard.analysis.empty.noHistory': 'ๆš‚ๆ— ๅކๅฒ่ฎฐๅฝ•', - 'dashboard.analysis.empty.watchlistHint': 'ๆš‚ๆ— ่‡ช้€‰่‚ก๏ผŒ่ฏทๅ…ˆ', - 'dashboard.analysis.empty.noDebateData': 'ๆš‚ๆ— ่พฉ่ฎบๆ•ฐๆฎ', - 'dashboard.analysis.empty.noDecisionData': 'ๆš‚ๆ— ๅ†ณ็ญ–ๆ•ฐๆฎ', - 'dashboard.analysis.empty.selectAgent': '่ฏท้€‰ๆ‹ฉไธ€ไธช Agent ๆŸฅ็œ‹ๅˆ†ๆž็ป“ๆžœ', - 'dashboard.analysis.loading.analyzing': 'ๆญฃๅœจๅˆ†ๆžไธญ๏ผŒ่ฏท็จๅ€™...', - 'dashboard.analysis.loading.fundamental': 'ๆญฃๅœจๅˆ†ๆžๅŸบๆœฌ้ขๆ•ฐๆฎ...', - 'dashboard.analysis.loading.technical': 'ๆญฃๅœจๅˆ†ๆžๆŠ€ๆœฏๆŒ‡ๆ ‡...', - 'dashboard.analysis.loading.news': 'ๆญฃๅœจๅˆ†ๆžๆ–ฐ้—ปๆ•ฐๆฎ...', - 'dashboard.analysis.loading.sentiment': 'ๆญฃๅœจๅˆ†ๆžๅธ‚ๅœบๆƒ…็ปช...', - 'dashboard.analysis.loading.risk': 'ๆญฃๅœจ่ฏ„ไผฐ้ฃŽ้™ฉ...', - 'dashboard.analysis.loading.debate': 'ๆญฃๅœจ่ฟ›่กŒๅคš็ฉบ่พฉ่ฎบ...', - 'dashboard.analysis.loading.decision': 'ๆญฃๅœจ็”Ÿๆˆๆœ€็ปˆๅ†ณ็ญ–...', - 'dashboard.analysis.score.overall': '็ปผๅˆ่ฏ„ๅˆ†', - 'dashboard.analysis.score.recommendation': 'ๆŠ•่ต„ๅปบ่ฎฎ', - 'dashboard.analysis.score.confidence': '็ฝฎไฟกๅบฆ', - 'dashboard.analysis.dimension.fundamental': 'ๅŸบๆœฌ้ข', - 'dashboard.analysis.dimension.technical': 'ๆŠ€ๆœฏ', - 'dashboard.analysis.dimension.news': 'ๆ–ฐ้—ป', - 'dashboard.analysis.dimension.sentiment': 'ๆƒ…็ปช', - 'dashboard.analysis.dimension.risk': '้ฃŽ้™ฉ', - 'dashboard.analysis.card.dimensionScores': 'ๅ„็ปดๅบฆ่ฏ„ๅˆ†', - 'dashboard.analysis.card.overviewReport': '็ปผๅˆๅˆ†ๆžๆŠฅๅ‘Š', - 'dashboard.analysis.card.financialMetrics': '่ดขๅŠกๆŒ‡ๆ ‡', - 'dashboard.analysis.card.fundamentalReport': 'ๅŸบๆœฌ้ขๅˆ†ๆžๆŠฅๅ‘Š', - 'dashboard.analysis.card.technicalIndicators': 'ๆŠ€ๆœฏๆŒ‡ๆ ‡', - 'dashboard.analysis.card.technicalReport': 'ๆŠ€ๆœฏๅˆ†ๆžๆŠฅๅ‘Š', - 'dashboard.analysis.card.newsList': '็›ธๅ…ณๆ–ฐ้—ป', - 'dashboard.analysis.card.newsReport': 'ๆ–ฐ้—ปๅˆ†ๆžๆŠฅๅ‘Š', - 'dashboard.analysis.card.sentimentIndicators': 'ๆƒ…็ปชๆŒ‡ๆ ‡', - 'dashboard.analysis.card.sentimentReport': 'ๆƒ…็ปชๅˆ†ๆžๆŠฅๅ‘Š', - 'dashboard.analysis.card.riskMetrics': '้ฃŽ้™ฉๆŒ‡ๆ ‡', - 'dashboard.analysis.card.riskReport': '้ฃŽ้™ฉ่ฏ„ไผฐๆŠฅๅ‘Š', - 'dashboard.analysis.card.bullView': '็œ‹ๆถจ่ง‚็‚น (Bull)', - 'dashboard.analysis.card.bearView': '็œ‹่ทŒ่ง‚็‚น (Bear)', - 'dashboard.analysis.card.researchConclusion': '็ ”็ฉถๅ‘˜็ป“่ฎบ', - 'dashboard.analysis.card.traderPlan': 'ไบคๆ˜“ๅ‘˜่ฎกๅˆ’', - 'dashboard.analysis.card.riskDebate': '้ฃŽ้™ฉๅง”ๅ‘˜ไผš่พฉ่ฎบ', - 'dashboard.analysis.card.finalDecision': 'ๆœ€็ปˆๅ†ณ็ญ– (Final Decision)', - 'dashboard.analysis.card.tradePlanDetail': 'ไบคๆ˜“่ฎกๅˆ’่ฏฆๆƒ…', - 'dashboard.analysis.tradingPlan.entry_price': 'ๅ…ฅๅœบไปทๆ ผ', - 'dashboard.analysis.tradingPlan.position_size': 'ไป“ไฝๅคงๅฐ', - 'dashboard.analysis.tradingPlan.stop_loss': 'ๆญขๆŸ', - 'dashboard.analysis.tradingPlan.take_profit': 'ๆญข็›ˆ', - 'dashboard.analysis.label.confidence': '็ฝฎไฟกๅบฆ', - 'dashboard.analysis.label.keyPoints': 'ๆ ธๅฟƒ่ฆ็‚น', - 'dashboard.analysis.label.riskWarning': '้ฃŽ้™ฉๆ็คบ', - 'dashboard.analysis.risk.risky': 'ๆฟ€่ฟ›ๆดพ่ง‚็‚น (Risky)', - 'dashboard.analysis.risk.neutral': 'ไธญ็ซ‹ๆดพ่ง‚็‚น (Neutral)', - 'dashboard.analysis.risk.safe': 'ไฟๅฎˆๆดพ่ง‚็‚น (Safe)', - 'dashboard.analysis.risk.conclusion': '็ป“่ฎบ', - 'dashboard.analysis.feature.fundamental': 'ๅŸบๆœฌ้ขๅˆ†ๆž', - 'dashboard.analysis.feature.technical': 'ๆŠ€ๆœฏๅˆ†ๆž', - 'dashboard.analysis.feature.news': 'ๆ–ฐ้—ปๅˆ†ๆž', - 'dashboard.analysis.feature.sentiment': 'ๆƒ…็ปชๅˆ†ๆž', - 'dashboard.analysis.feature.risk': '้ฃŽ้™ฉ่ฏ„ไผฐ', - 'dashboard.analysis.watchlist.title': 'ๆˆ‘็š„่‡ช้€‰่‚ก', - 'dashboard.analysis.watchlist.add': 'ๆทปๅŠ ', - 'dashboard.analysis.watchlist.addStock': 'ๆทปๅŠ ่‚ก็ฅจ', - 'dashboard.analysis.modal.addStock.title': 'ๆทปๅŠ ่‡ช้€‰่‚ก', - 'dashboard.analysis.modal.addStock.confirm': '็กฎๅฎš', - 'dashboard.analysis.modal.addStock.cancel': 'ๅ–ๆถˆ', - 'dashboard.analysis.modal.addStock.market': 'ๅธ‚ๅœบ็ฑปๅž‹', - 'dashboard.analysis.modal.addStock.marketPlaceholder': '่ฏท้€‰ๆ‹ฉๅธ‚ๅœบ', - 'dashboard.analysis.modal.addStock.marketRequired': '่ฏท้€‰ๆ‹ฉๅธ‚ๅœบ็ฑปๅž‹', - 'dashboard.analysis.modal.addStock.symbol': '่‚ก็ฅจไปฃ็ ', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'ไพ‹ๅฆ‚: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': '่ฏท่พ“ๅ…ฅ่‚ก็ฅจไปฃ็ ', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'ๆœ็ดขๆ ‡็š„ไปฃ็ ๆˆ–ๅ็งฐ', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'ๆœ็ดขๆˆ–่พ“ๅ…ฅๆ ‡็š„ไปฃ็ ๏ผˆๅฆ‚๏ผšAAPLใ€BTC/USDTใ€EUR/USD๏ผ‰', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'ๆ”ฏๆŒๆœ็ดขๆ•ฐๆฎๅบ“ไธญ็š„ๆ ‡็š„๏ผŒๆˆ–็›ดๆŽฅ่พ“ๅ…ฅไปฃ็ ๏ผˆ็ณป็ปŸๅฐ†่‡ชๅŠจ่Žทๅ–ๅ็งฐ๏ผ‰', - 'dashboard.analysis.modal.addStock.search': 'ๆœ็ดข', - 'dashboard.analysis.modal.addStock.searchResults': 'ๆœ็ดข็ป“ๆžœ', - 'dashboard.analysis.modal.addStock.hotSymbols': '็ƒญ้—จๆ ‡็š„', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'ๆš‚ๆ— ็ƒญ้—จๆ ‡็š„', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'ๅทฒ้€‰ๆ ‡็š„', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': '่ฏทๅ…ˆ้€‰ๆ‹ฉไธ€ไธชๆ ‡็š„', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': '่ฏทๅ…ˆ้€‰ๆ‹ฉไธ€ไธชๆ ‡็š„ๆˆ–่พ“ๅ…ฅๆ ‡็š„ไปฃ็ ', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': '่ฏท่พ“ๅ…ฅๆ ‡็š„ไปฃ็ ', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': '่ฏทๅ…ˆ้€‰ๆ‹ฉๅธ‚ๅœบ็ฑปๅž‹', - 'dashboard.analysis.modal.addStock.searchFailed': 'ๆœ็ดขๅคฑ่ดฅ๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'dashboard.analysis.modal.addStock.noSearchResults': 'ๆœชๆ‰พๅˆฐๅŒน้…็š„ๆ ‡็š„', - 'dashboard.analysis.modal.addStock.willAutoFetchName': '็ณป็ปŸๅฐ†่‡ชๅŠจ่Žทๅ–ๅ็งฐ', - 'dashboard.analysis.modal.addStock.addDirectly': '็›ดๆŽฅๆทปๅŠ ', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'ๅ็งฐๅฐ†ๅœจๆทปๅŠ ๆ—ถ่‡ชๅŠจ่Žทๅ–', - 'dashboard.analysis.market.USStock': '็พŽ่‚ก', - 'dashboard.analysis.market.Crypto': 'ๅŠ ๅฏ†่ดงๅธ', - 'dashboard.analysis.market.Forex': 'ๅค–ๆฑ‡', - 'dashboard.analysis.market.Futures': 'ๆœŸ่ดง', - 'dashboard.analysis.modal.history.title': 'ๅކๅฒๅˆ†ๆž่ฎฐๅฝ•', - 'dashboard.analysis.modal.history.viewResult': 'ๆŸฅ็œ‹็ป“ๆžœ', - 'dashboard.analysis.modal.history.completeTime': 'ๅฎŒๆˆๆ—ถ้—ด', - 'dashboard.analysis.modal.history.error': '้”™่ฏฏ', - 'dashboard.analysis.status.pending': 'ๅพ…ๅค„็†', - 'dashboard.analysis.status.processing': 'ๅค„็†ไธญ', - 'dashboard.analysis.status.completed': 'ๅทฒๅฎŒๆˆ', - 'dashboard.analysis.status.failed': 'ๅคฑ่ดฅ', - 'dashboard.analysis.message.selectSymbol': '่ฏทๅ…ˆ้€‰ๆ‹ฉๆ ‡็š„', - 'dashboard.analysis.message.taskCreated': 'ๅˆ†ๆžไปปๅŠกๅทฒๅˆ›ๅปบ๏ผŒๆญฃๅœจๅŽๅฐๆ‰ง่กŒ...', - 'dashboard.analysis.message.analysisComplete': 'ๅˆ†ๆžๅฎŒๆˆ', - 'dashboard.analysis.message.analysisCompleteCache': 'ๅˆ†ๆžๅฎŒๆˆ๏ผˆไฝฟ็”จ็ผ“ๅญ˜ๆ•ฐๆฎ๏ผ‰', - 'dashboard.analysis.message.analysisFailed': 'ๅˆ†ๆžๅคฑ่ดฅ๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'dashboard.analysis.message.addStockSuccess': 'ๆทปๅŠ ๆˆๅŠŸ', - 'dashboard.analysis.message.addStockFailed': 'ๆทปๅŠ ๅคฑ่ดฅ', - 'dashboard.analysis.message.removeStockSuccess': '็งป้™คๆˆๅŠŸ', - 'dashboard.analysis.message.removeStockFailed': '็งป้™คๅคฑ่ดฅ', - 'dashboard.analysis.message.resumingAnalysis': 'ๆญฃๅœจๆขๅคๅˆ†ๆžไปปๅŠก...', - 'dashboard.analysis.message.deleteSuccess': 'ๅˆ ้™คๆˆๅŠŸ', - 'dashboard.analysis.message.deleteFailed': 'ๅˆ ้™คๅคฑ่ดฅ', - 'dashboard.analysis.modal.history.delete': 'ๅˆ ้™ค', - 'dashboard.analysis.modal.history.deleteConfirm': '็กฎๅฎš่ฆๅˆ ้™ค่ฟ™ๆกๅˆ†ๆž่ฎฐๅฝ•ๅ—๏ผŸ', - 'dashboard.analysis.test': 'ๅทฅไธ“่ทฏ {no} ๅทๅบ—', - 'dashboard.analysis.introduce': 'ๆŒ‡ๆ ‡่ฏดๆ˜Ž', - 'dashboard.analysis.total-sales': 'ๆ€ป้”€ๅ”ฎ้ข', - 'dashboard.analysis.day-sales': 'ๆ—ฅๅ‡้”€ๅ”ฎ้ข๏ฟฅ', - 'dashboard.analysis.visits': '่ฎฟ้—ฎ้‡', - 'dashboard.analysis.visits-trend': '่ฎฟ้—ฎ้‡่ถ‹ๅŠฟ', - 'dashboard.analysis.visits-ranking': '้—จๅบ—่ฎฟ้—ฎ้‡ๆŽ’ๅ', - 'dashboard.analysis.day-visits': 'ๆ—ฅ่ฎฟ้—ฎ้‡', - 'dashboard.analysis.week': 'ๅ‘จๅŒๆฏ”', - 'dashboard.analysis.day': 'ๆ—ฅๅŒๆฏ”', - 'dashboard.analysis.payments': 'ๆ”ฏไป˜็ฌ”ๆ•ฐ', - 'dashboard.analysis.conversion-rate': '่ฝฌๅŒ–็އ', - 'dashboard.analysis.operational-effect': '่ฟ่ฅๆดปๅŠจๆ•ˆๆžœ', - 'dashboard.analysis.sales-trend': '้”€ๅ”ฎ่ถ‹ๅŠฟ', - 'dashboard.analysis.sales-ranking': '้—จๅบ—้”€ๅ”ฎ้ขๆŽ’ๅ', - 'dashboard.analysis.all-year': 'ๅ…จๅนด', - 'dashboard.analysis.all-month': 'ๆœฌๆœˆ', - 'dashboard.analysis.all-week': 'ๆœฌๅ‘จ', - 'dashboard.analysis.all-day': 'ไปŠๆ—ฅ', - 'dashboard.analysis.search-users': 'ๆœ็ดข็”จๆˆทๆ•ฐ', - 'dashboard.analysis.per-capita-search': 'ไบบๅ‡ๆœ็ดขๆฌกๆ•ฐ', - 'dashboard.analysis.online-top-search': '็บฟไธŠ็ƒญ้—จๆœ็ดข', - 'dashboard.analysis.the-proportion-of-sales': '้”€ๅ”ฎ้ข็ฑปๅˆซๅ ๆฏ”', - 'dashboard.analysis.dropdown-option-one': 'ๆ“ไฝœไธ€', - 'dashboard.analysis.dropdown-option-two': 'ๆ“ไฝœไบŒ', - 'dashboard.analysis.channel.all': 'ๅ…จ้ƒจๆธ ้“', - 'dashboard.analysis.channel.online': '็บฟไธŠ', - 'dashboard.analysis.channel.stores': '้—จๅบ—', - 'dashboard.analysis.sales': '้”€ๅ”ฎ้ข', - 'dashboard.analysis.traffic': 'ๅฎขๆต้‡', - 'dashboard.analysis.table.rank': 'ๆŽ’ๅ', - 'dashboard.analysis.table.search-keyword': 'ๆœ็ดขๅ…ณ้”ฎ่ฏ', - 'dashboard.analysis.table.users': '็”จๆˆทๆ•ฐ', - 'dashboard.analysis.table.weekly-range': 'ๅ‘จๆถจๅน…', - 'dashboard.indicator.selectSymbol': '้€‰ๆ‹ฉๆˆ–่พ“ๅ…ฅๆ ‡็š„ไปฃ็ ', - 'dashboard.indicator.emptyWatchlistHint': 'ๆš‚ๆ— ่‡ช้€‰่‚ก๏ผŒ่ฏทๅ…ˆๆทปๅŠ ', - 'dashboard.indicator.hint.selectSymbol': '่ฏท้€‰ๆ‹ฉๆ ‡็š„ๅผ€ๅง‹ๅˆ†ๆž', - 'dashboard.indicator.hint.selectSymbolDesc': 'ๅœจไธŠๆ–นๆœ็ดขๆก†ไธญ้€‰ๆ‹ฉๆˆ–่พ“ๅ…ฅ่‚ก็ฅจไปฃ็ ๏ผŒๆŸฅ็œ‹K็บฟๅ›พ่กจๅ’ŒๆŠ€ๆœฏๆŒ‡ๆ ‡', - 'dashboard.indicator.retry': '้‡่ฏ•', - 'dashboard.indicator.panel.title': 'ๆŠ€ๆœฏๆŒ‡ๆ ‡', - 'dashboard.indicator.panel.realtimeOn': 'ๅ…ณ้—ญๅฎžๆ—ถๆ›ดๆ–ฐ', - 'dashboard.indicator.panel.realtimeOff': 'ๅผ€ๅฏๅฎžๆ—ถๆ›ดๆ–ฐ', - 'dashboard.indicator.panel.themeLight': 'ๅˆ‡ๆขๅˆฐๆทฑ่‰ฒไธป้ข˜', - 'dashboard.indicator.panel.themeDark': 'ๅˆ‡ๆขๅˆฐๆต…่‰ฒไธป้ข˜', - 'dashboard.indicator.section.enabled': 'ๅทฒๅฏ็”จ', - 'dashboard.indicator.section.added': 'ๆˆ‘ๆทปๅŠ ็š„ๆŒ‡ๆ ‡', - 'dashboard.indicator.section.custom': '่‡ชๅทฑๅˆ›ๅปบ็š„ๆŒ‡ๆ ‡', - 'dashboard.indicator.section.bought': 'ๆˆ‘้€‰่ดญ็š„ๆŒ‡ๆ ‡', - 'dashboard.indicator.section.myCreated': 'ๆˆ‘ๅˆ›ๅปบ็š„ๆŒ‡ๆ ‡', - 'dashboard.indicator.section.purchased': 'ๆˆ‘่ดญไนฐ็š„ๆŒ‡ๆ ‡', - 'dashboard.indicator.empty': 'ๆš‚ๆ— ๆŒ‡ๆ ‡๏ผŒ่ฏทๅ…ˆๆทปๅŠ ๆˆ–ๅˆ›ๅปบๆŒ‡ๆ ‡', - 'dashboard.indicator.emptyPurchased': 'ๆš‚ๆ— ่ดญไนฐ็š„ๆŒ‡ๆ ‡๏ผŒๅŽปๆŒ‡ๆ ‡ๅธ‚ๅœบ็œ‹็œ‹', - 'dashboard.indicator.buy': '่ดญไนฐๆŒ‡ๆ ‡', - 'dashboard.indicator.action.start': 'ๅฏๅŠจ', - 'dashboard.indicator.action.stop': 'ๅ…ณ้—ญ', - 'dashboard.indicator.action.edit': '็ผ–่พ‘', - 'dashboard.indicator.action.delete': 'ๅˆ ้™ค', - 'dashboard.indicator.action.backtest': 'ๅ›žๆต‹', - 'dashboard.indicator.action.publish': 'ๅ‘ๅธƒๅˆฐ็คพๅŒบ', - 'dashboard.indicator.action.unpublish': 'ๅทฒๅ‘ๅธƒ๏ผˆ็‚นๅ‡ป็ฎก็†๏ผ‰', - 'dashboard.indicator.status.normal': 'ๆญฃๅธธ', - 'dashboard.indicator.status.normalPermanent': 'ๆญฃๅธธ๏ผˆๆฐธไน…ๆœ‰ๆ•ˆ๏ผ‰', - 'dashboard.indicator.status.expired': 'ๅทฒ่ฟ‡ๆœŸ', - 'dashboard.indicator.expiry.permanent': 'ๆฐธไน…ๆœ‰ๆ•ˆ', - 'dashboard.indicator.expiry.noExpiry': 'ๆ— ๅˆฐๆœŸๆ—ถ้—ด', - 'dashboard.indicator.expiry.expired': 'ๅทฒ่ฟ‡ๆœŸ๏ผš{date}', - 'dashboard.indicator.expiry.expiresOn': 'ๅˆฐๆœŸๆ—ถ้—ด๏ผš{date}', - 'dashboard.indicator.delete.confirmTitle': '็กฎ่ฎคๅˆ ้™ค', - 'dashboard.indicator.delete.confirmContent': '็กฎๅฎš่ฆๅˆ ้™คๆŒ‡ๆ ‡"{name}"ๅ—๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅคใ€‚', - 'dashboard.indicator.delete.confirmOk': 'ๅˆ ้™ค', - 'dashboard.indicator.delete.confirmCancel': 'ๅ–ๆถˆ', - 'dashboard.indicator.delete.success': 'ๅˆ ้™คๆˆๅŠŸ', - 'dashboard.indicator.delete.failed': 'ๅˆ ้™คๅคฑ่ดฅ', - 'dashboard.indicator.save.success': 'ไฟๅญ˜ๆˆๅŠŸ', - 'dashboard.indicator.save.failed': 'ไฟๅญ˜ๅคฑ่ดฅ', - 'dashboard.indicator.publish.title': 'ๅ‘ๅธƒๅˆฐ็คพๅŒบ', - 'dashboard.indicator.publish.editTitle': '็ฎก็†ๅ‘ๅธƒ', - 'dashboard.indicator.publish.hint': 'ๅ‘ๅธƒๅŽ๏ผŒๅ…ถไป–็”จๆˆทๅฏไปฅๅœจ"ๆŒ‡ๆ ‡็คพๅŒบ"ไธญ็œ‹ๅˆฐๅนถ่ดญไนฐๆ‚จ็š„ๆŒ‡ๆ ‡', - 'dashboard.indicator.publish.pricingType': 'ๅฎšไปทๆ–นๅผ', - 'dashboard.indicator.publish.free': 'ๅ…่ดน', - 'dashboard.indicator.publish.paid': 'ไป˜่ดน', - 'dashboard.indicator.publish.price': 'ไปทๆ ผ', - 'dashboard.indicator.publish.description': 'ๆŒ‡ๆ ‡ๆ่ฟฐ', - 'dashboard.indicator.publish.descriptionPlaceholder': '่ฏท่พ“ๅ…ฅๆŒ‡ๆ ‡็š„่ฏฆ็ป†ๆ่ฟฐ๏ผŒๅธฎๅŠฉๅ…ถไป–็”จๆˆทไบ†่งฃๆŒ‡ๆ ‡ๅŠŸ่ƒฝ...', - 'dashboard.indicator.publish.confirm': '็กฎ่ฎคๅ‘ๅธƒ', - 'dashboard.indicator.publish.update': 'ๆ›ดๆ–ฐๅ‘ๅธƒ', - 'dashboard.indicator.publish.unpublish': 'ๅ–ๆถˆๅ‘ๅธƒ', - 'dashboard.indicator.publish.success': 'ๅ‘ๅธƒๆˆๅŠŸ', - 'dashboard.indicator.publish.failed': 'ๅ‘ๅธƒๅคฑ่ดฅ', - 'dashboard.indicator.publish.unpublishSuccess': 'ๅทฒๅ–ๆถˆๅ‘ๅธƒ', - 'dashboard.indicator.publish.unpublishFailed': 'ๅ–ๆถˆๅ‘ๅธƒๅคฑ่ดฅ', - 'dashboard.indicator.error.loadWatchlistFailed': 'ๅŠ ่ฝฝ่‡ช้€‰่‚กๅคฑ่ดฅ', - 'dashboard.indicator.error.chartNotReady': 'ๅ›พ่กจ็ป„ไปถๆœชๅˆๅง‹ๅŒ–๏ผŒ่ฏทๅ…ˆ้€‰ๆ‹ฉๆ ‡็š„ๅนถ็ญ‰ๅพ…ๅ›พ่กจๅŠ ่ฝฝๅฎŒๆˆ', - 'dashboard.indicator.error.chartMethodNotReady': 'ๅ›พ่กจ็ป„ไปถๆ–นๆณ•ๆœชๅฐฑ็ปช๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'dashboard.indicator.error.chartExecuteNotReady': 'ๅ›พ่กจ็ป„ไปถๆ‰ง่กŒๆ–นๆณ•ๆœชๅฐฑ็ปช๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'dashboard.indicator.error.parseFailed': 'ๆ— ๆณ•่งฃๆžPythonไปฃ็ ', - 'dashboard.indicator.error.parseFailedCheck': 'ๆ— ๆณ•่งฃๆžPythonไปฃ็ ๏ผŒ่ฏทๆฃ€ๆŸฅไปฃ็ ๆ ผๅผ', - 'dashboard.indicator.error.addIndicatorFailed': 'ๆทปๅŠ ๆŒ‡ๆ ‡ๅคฑ่ดฅ', - 'dashboard.indicator.error.runIndicatorFailed': '่ฟ่กŒๆŒ‡ๆ ‡ๅคฑ่ดฅ', - 'dashboard.indicator.error.pleaseLogin': '่ฏทๅ…ˆ็™ปๅฝ•', - 'dashboard.indicator.error.loadDataFailed': 'ๆ•ฐๆฎๅŠ ่ฝฝๅคฑ่ดฅ', - 'dashboard.indicator.error.loadDataFailedDesc': '่ฏทๆฃ€ๆŸฅ็ฝ‘็ปœ่ฟžๆŽฅ', - 'dashboard.indicator.error.tiingoSubscription': 'ๅค–ๆฑ‡1ๅˆ†้’Ÿๆ•ฐๆฎ้œ€่ฆ Tiingo ไป˜่ดน่ฎข้˜…๏ผŒ่ฏทไฝฟ็”จๅ…ถไป–ๆ—ถ้—ดๅ‘จๆœŸๆˆ–ๅ‡็บง่ฎข้˜…', - 'dashboard.indicator.error.pythonEngineFailed': 'Python ๅผ•ๆ“ŽๅŠ ่ฝฝๅคฑ่ดฅ๏ผŒๆŒ‡ๆ ‡ๅŠŸ่ƒฝๅฏ่ƒฝๆ— ๆณ•ไฝฟ็”จ', - 'dashboard.indicator.error.chartInitFailed': 'ๅ›พ่กจๅˆๅง‹ๅŒ–ๅคฑ่ดฅ', - 'dashboard.indicator.warning.enterCode': '่ฏทๅ…ˆ่พ“ๅ…ฅๆŒ‡ๆ ‡ไปฃ็ ', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python ๅผ•ๆ“ŽๅŠ ่ฝฝๅคฑ่ดฅ', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'ๆ‚จๅฝ“ๅ‰ๆ‰€ๅœจๅŒบๅŸŸๆˆ–็ฝ‘็ปœ็Žฏๅขƒๆ— ๆณ•ไฝฟ็”จ่ฏฅๅŠŸ่ƒฝ', - 'dashboard.indicator.warning.chartNotInitialized': 'ๅ›พ่กจๆœชๅˆๅง‹ๅŒ–๏ผŒๆ— ๆณ•ไฝฟ็”จ็”ป็บฟๅทฅๅ…ท', - 'dashboard.indicator.success.runIndicator': 'ๆŒ‡ๆ ‡่ฟ่กŒๆˆๅŠŸ', - 'dashboard.indicator.success.clearDrawings': 'ๅทฒๆธ…้™คๆ‰€ๆœ‰็”ป็บฟ', - 'dashboard.indicator.sma': 'SMA (ๅ‡็บฟ็ป„ๅˆ)', - 'dashboard.indicator.ema': 'EMA (ๆŒ‡ๆ•ฐๅ‡็บฟ็ป„ๅˆ)', - 'dashboard.indicator.rsi': 'RSI (็›ธๅฏนๅผบๅผฑ)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'ๅธƒๆž—ๅธฆ (Bollinger Bands)', - 'dashboard.indicator.atr': 'ATR (ๅนณๅ‡็œŸๅฎžๆณขๅน…)', - 'dashboard.indicator.cci': 'CCI (ๅ•†ๅ“้€š้“ๆŒ‡ๆ•ฐ)', - 'dashboard.indicator.williams': 'Williams %R (ๅจๅป‰ๆŒ‡ๆ ‡)', - 'dashboard.indicator.mfi': 'MFI (่ต„้‡‘ๆต้‡ๆŒ‡ๆ ‡)', - 'dashboard.indicator.adx': 'ADX (ๅนณๅ‡่ถ‹ๅ‘ๆŒ‡ๆ•ฐ)', - 'dashboard.indicator.obv': 'OBV (่ƒฝ้‡ๆฝฎ)', - 'dashboard.indicator.adosc': 'ADOSC (็งฏ็ดฏ/ๆดพๅ‘ๆŒฏ่กๅ™จ)', - 'dashboard.indicator.ad': 'AD (็งฏ็ดฏ/ๆดพๅ‘็บฟ)', - 'dashboard.indicator.kdj': 'KDJ (้šๆœบๆŒ‡ๆ ‡)', - 'dashboard.indicator.signal.buy': 'BUY', - 'dashboard.indicator.signal.sell': 'SELL', - 'dashboard.indicator.signal.supertrendBuy': 'SuperTrend Buy', - 'dashboard.indicator.signal.supertrendSell': 'SuperTrend Sell', - 'dashboard.indicator.chart.kline': 'K็บฟ', - 'dashboard.indicator.chart.volume': 'ๆˆไบค้‡', - 'dashboard.indicator.chart.uptrend': 'Up Trend', - 'dashboard.indicator.chart.downtrend': 'Down Trend', - 'dashboard.indicator.tooltip.time': 'ๆ—ถ้—ด', - 'dashboard.indicator.tooltip.open': 'ๅผ€', - 'dashboard.indicator.tooltip.close': 'ๆ”ถ', - 'dashboard.indicator.tooltip.high': '้ซ˜', - 'dashboard.indicator.tooltip.low': 'ไฝŽ', - 'dashboard.indicator.tooltip.volume': 'ๆˆไบค้‡', - 'dashboard.indicator.drawing.line': '็บฟๆฎต', - 'dashboard.indicator.drawing.horizontalLine': 'ๆฐดๅนณ็บฟ', - 'dashboard.indicator.drawing.verticalLine': 'ๅž‚็›ด็บฟ', - 'dashboard.indicator.drawing.ray': 'ๅฐ„็บฟ', - 'dashboard.indicator.drawing.straightLine': '็›ด็บฟ', - 'dashboard.indicator.drawing.parallelLine': 'ๅนณ่กŒ็บฟ', - 'dashboard.indicator.drawing.priceLine': 'ไปทๆ ผ็บฟ', - 'dashboard.indicator.drawing.priceChannel': 'ไปทๆ ผ้€š้“', - 'dashboard.indicator.drawing.fibonacciLine': 'ๆ–ๆณข้‚ฃๅฅ‘็บฟ', - 'dashboard.indicator.drawing.clearAll': 'ๆธ…้™คๆ‰€ๆœ‰็”ป็บฟ', - 'dashboard.indicator.market.USStock': '็พŽ่‚ก', - 'dashboard.indicator.market.Crypto': 'ๅŠ ๅฏ†่ดงๅธ', - 'dashboard.indicator.market.Forex': 'ๅค–ๆฑ‡', - 'dashboard.indicator.market.Futures': 'ๆœŸ่ดง', - 'dashboard.indicator.create': 'ๅˆ›ๅปบๆŒ‡ๆ ‡', - 'dashboard.indicator.editor.title': 'ๅˆ›ๅปบ/็ผ–่พ‘ๆŒ‡ๆ ‡', - 'dashboard.indicator.editor.name': 'ๆŒ‡ๆ ‡ๅ็งฐ', - 'dashboard.indicator.editor.nameRequired': '่ฏท่พ“ๅ…ฅๆŒ‡ๆ ‡ๅ็งฐ', - 'dashboard.indicator.editor.namePlaceholder': '่ฏท่พ“ๅ…ฅๆŒ‡ๆ ‡ๅ็งฐ', - 'dashboard.indicator.editor.description': 'ๆŒ‡ๆ ‡ๆ่ฟฐ', - 'dashboard.indicator.editor.descriptionPlaceholder': '่ฏท่พ“ๅ…ฅๆŒ‡ๆ ‡ๆ่ฟฐ๏ผˆๅฏ้€‰๏ผ‰', - 'dashboard.indicator.editor.code': 'ๆŒ‡ๆ ‡่„šๆœฌ๏ผˆPython๏ผ‰', - 'dashboard.indicator.editor.codeRequired': '่ฏท่พ“ๅ…ฅๆŒ‡ๆ ‡ไปฃ็ ', - 'dashboard.indicator.editor.codePlaceholder': '่ฏท่พ“ๅ…ฅPythonไปฃ็ ', - 'dashboard.indicator.editor.run': '่ฟ่กŒ', - 'dashboard.indicator.editor.runHint': '็‚นๅ‡ป่ฟ่กŒๆŒ‰้’ฎๅฏไปฅๅœจK็บฟๅ›พไธŠ้ข„่งˆๆŒ‡ๆ ‡ๆ•ˆๆžœ', - 'dashboard.indicator.editor.guide': 'ๅผ€ๅ‘ๆŒ‡ๅ—', - 'dashboard.indicator.editor.guideTitle': 'Python ๆŒ‡ๆ ‡ๅผ€ๅ‘ๆŒ‡ๅ—', - 'dashboard.indicator.editor.save': 'ไฟๅญ˜', - 'dashboard.indicator.editor.cancel': 'ๅ–ๆถˆ', - 'dashboard.indicator.editor.unnamed': 'ๆœชๅ‘ฝๅๆŒ‡ๆ ‡', - 'dashboard.indicator.editor.publishToCommunity': 'ๅ‘ๅธƒๅˆฐ็คพๅŒบ', - 'dashboard.indicator.editor.publishToCommunityHint': 'ๅ‘ๅธƒๅŽ๏ผŒๅ…ถไป–็”จๆˆทๅฏไปฅๅœจ็คพๅŒบไธญๆŸฅ็œ‹ๅ’Œไฝฟ็”จๆ‚จ็š„ๆŒ‡ๆ ‡', - 'dashboard.indicator.editor.indicatorType': 'ๆŒ‡ๆ ‡็ฑปๅž‹', - 'dashboard.indicator.editor.indicatorTypeRequired': '่ฏท้€‰ๆ‹ฉๆŒ‡ๆ ‡็ฑปๅž‹', - 'dashboard.indicator.editor.indicatorTypePlaceholder': '่ฏท้€‰ๆ‹ฉๆŒ‡ๆ ‡็ฑปๅž‹', - 'dashboard.indicator.editor.previewImage': '้ข„่งˆๅ›พ', - 'dashboard.indicator.editor.uploadImage': 'ไธŠไผ ๅ›พ็‰‡', - 'dashboard.indicator.editor.previewImageHint': 'ๅปบ่ฎฎๅฐบๅฏธ๏ผš800x400๏ผŒๅคงๅฐไธ่ถ…่ฟ‡2MB', - 'dashboard.indicator.editor.pricing': 'ๅ”ฎไปท๏ผˆQDT๏ผ‰', - 'dashboard.indicator.editor.pricingType.free': 'ๅ…่ดน', - 'dashboard.indicator.editor.pricingType.permanent': 'ๆฐธไน…', - 'dashboard.indicator.editor.pricingType.monthly': 'ๆœˆไป˜', - 'dashboard.indicator.editor.price': 'ไปทๆ ผ', - 'dashboard.indicator.editor.priceRequired': '่ฏท่พ“ๅ…ฅไปทๆ ผ', - 'dashboard.indicator.editor.pricePlaceholder': '่ฏท่พ“ๅ…ฅไปทๆ ผ', - 'dashboard.indicator.editor.pricingHint': 'ๅ…่ดนๆŒ‡ๆ ‡่™ฝ็„ถไปทๆ ผไธบ0๏ผŒไฝ†ๅนณๅฐไผšๆ นๆฎๆ‚จ็š„ๆŒ‡ๆ ‡ไฝฟ็”จ้‡ๅ’Œๅฅฝ่ฏ„็އ็ป™ไบˆๅฅ–ๅŠฑ๏ผˆQDT๏ผ‰', - 'dashboard.indicator.editor.aiGenerate': 'ๆ™บ่ƒฝ็”Ÿๆˆ', - 'dashboard.indicator.editor.aiPromptPlaceholder': '่ฏทๆ่ฟฐไฝ ็š„ไฟกๅท้€ป่พ‘๏ผˆๅช่พ“ๅ‡บ buy/sell๏ผ‰ไธŽ็ป˜ๅ›พ๏ผˆplots๏ผ‰ใ€‚ไป“ไฝ/้ฃŽๆŽง/ๅŠ ๅ‡ไป“่ฏทๅœจๅ›žๆต‹้…็ฝฎไธญ่ฎพๅฎšใ€‚', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI็”Ÿๆˆไปฃ็ ', - 'dashboard.indicator.editor.aiPromptRequired': '่ฏท่พ“ๅ…ฅๆ‚จ็š„ๆƒณๆณ•', - 'dashboard.indicator.editor.aiGenerateSuccess': 'ไปฃ็ ็”ŸๆˆๆˆๅŠŸ', - 'dashboard.indicator.editor.aiGenerateError': 'ไปฃ็ ็”Ÿๆˆๅคฑ่ดฅ๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'dashboard.indicator.editor.verifyCode': 'ไปฃ็ ๆฃ€ๆŸฅ', - 'dashboard.indicator.editor.verifyCodeSuccess': 'ไปฃ็ ๆฃ€ๆŸฅ้€š่ฟ‡', - 'dashboard.indicator.editor.verifyCodeFailed': 'ไปฃ็ ๆฃ€ๆŸฅๆœช้€š่ฟ‡', - 'dashboard.indicator.editor.verifyCodeEmpty': 'ไปฃ็ ไธ่ƒฝไธบ็ฉบ', - 'dashboard.indicator.boundary.message': 'ๆ็คบ๏ผšๆŒ‡ๆ ‡่„šๆœฌๅช่ดŸ่ดฃโ€œ่ฎก็ฎ— + ็ป˜ๅ›พ + buy/sell ไฟกๅทโ€๏ผ›ไป“ไฝใ€้ฃŽๆŽงใ€ๅŠ ๅ‡ไป“ใ€ๆ‰‹็ปญ่ดน/ๆป‘็‚นๅฑžไบŽ็ญ–็•ฅๆ‰ง่กŒ้…็ฝฎใ€‚', - 'dashboard.indicator.boundary.indicatorRule': "ๆŒ‡ๆ ‡่„šๆœฌ่ฏทๅช่พ“ๅ‡บ buy/sell๏ผˆๅนถ่ฎพๅฎš df['buy']/df['sell']๏ผ‰ใ€‚ไธ่ฆๅœจ่„šๆœฌๅ†…ๆ’ฐๅ†™ไป“ไฝ็ฎก็†ใ€ๆญข็›ˆๆญขๆŸใ€ๅŠ ๅ‡ไป“ใ€‚", - 'dashboard.indicator.boundary.backtestRule': '่ง„ๅˆ™๏ผšๅŒไธ€ๆ นK็บฟ่‹ฅๅ‡บ็Žฐไธปไฟกๅท๏ผˆbuy/sellโ†’ๅผ€/ๅนณไป“/ๅๆ‰‹๏ผ‰๏ผŒๆœฌK็บฟๅฐ†่ทณ่ฟ‡ๆ‰€ๆœ‰ๅŠ ไป“ไธŽๅ‡ไป“ใ€‚', - 'dashboard.indicator.paramsConfig.title': 'ๆŒ‡ๆ ‡ๅ‚ๆ•ฐ้…็ฝฎ', - 'dashboard.indicator.paramsConfig.noParams': '่ฏฅๆŒ‡ๆ ‡ๆฒกๆœ‰ๅฏ้…็ฝฎ็š„ๅ‚ๆ•ฐ', - 'dashboard.indicator.paramsConfig.hint': '่ฎพ็ฝฎๅ‚ๆ•ฐๅŽ็‚นๅ‡ป็กฎๅฎš่ฟ่กŒๆŒ‡ๆ ‡', - 'dashboard.indicator.backtest.title': 'ๆŒ‡ๆ ‡ๅ›žๆต‹', - 'dashboard.indicator.backtest.config': 'ๅ›žๆต‹ๅ‚ๆ•ฐ', - 'dashboard.indicator.backtest.startDate': 'ๅผ€ๅง‹ๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.endDate': '็ป“ๆŸๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.selectStartDate': '้€‰ๆ‹ฉๅผ€ๅง‹ๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.selectEndDate': '้€‰ๆ‹ฉ็ป“ๆŸๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.startDateRequired': '่ฏท้€‰ๆ‹ฉๅผ€ๅง‹ๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.endDateRequired': '่ฏท้€‰ๆ‹ฉ็ป“ๆŸๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.initialCapital': 'ๅˆๅง‹่ต„้‡‘', - 'dashboard.indicator.backtest.initialCapitalRequired': '่ฏท่พ“ๅ…ฅๅˆๅง‹่ต„้‡‘', - 'dashboard.indicator.backtest.commission': 'ๆ‰‹็ปญ่ดน็އ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.commissionHint': 'ๆŒ‰ๅไน‰ไปทๅ€ผ๏ผˆๅซๆ ๆ†๏ผ‰ๆ”ถๅ–๏ผ›ๆฏ็ฌ”ๆˆไบค๏ผˆๅผ€/ๅนณไป“๏ผ‰้ƒฝไผšไปŽไฝ™้ขๆ‰ฃ้™คใ€‚', - 'dashboard.indicator.backtest.leverage': 'ๆ ๆ†ๅ€็އ', - 'dashboard.indicator.backtest.timeframe': 'K็บฟๅ‘จๆœŸ', - 'dashboard.indicator.backtest.tradeDirection': 'ไบคๆ˜“ๆ–นๅ‘', - 'dashboard.indicator.backtest.longOnly': 'ๅšๅคš', - 'dashboard.indicator.backtest.shortOnly': 'ๅš็ฉบ', - 'dashboard.indicator.backtest.both': 'ๅŒๅ‘', - 'dashboard.indicator.backtest.run': 'ๅผ€ๅง‹ๅ›žๆต‹', - 'dashboard.indicator.backtest.rerun': '้‡ๆ–ฐๅ›žๆต‹', - 'dashboard.indicator.backtest.close': 'ๅ…ณ้—ญ', - 'dashboard.indicator.backtest.running': 'ๆญฃๅœจ่ฟ›่กŒๆŒ‡ๆ ‡ๅ›žๆต‹...', - 'dashboard.indicator.backtest.loadingTip1': 'ๆญฃๅœจ่Žทๅ–ๅކๅฒK็บฟๆ•ฐๆฎ...', - 'dashboard.indicator.backtest.loadingTip2': 'ๆญฃๅœจๆ‰ง่กŒ็ญ–็•ฅไฟกๅท่ฎก็ฎ—...', - 'dashboard.indicator.backtest.loadingTip3': 'ๆญฃๅœจๆจกๆ‹Ÿไบคๆ˜“ๆ‰ง่กŒ...', - 'dashboard.indicator.backtest.loadingTip4': 'ๆญฃๅœจ่ฎก็ฎ—ๅ›žๆต‹ๆŒ‡ๆ ‡...', - 'dashboard.indicator.backtest.loadingTip5': 'ๅณๅฐ†ๅฎŒๆˆ๏ผŒ่ฏท็จๅ€™...', - 'dashboard.indicator.backtest.results': 'ๅ›žๆต‹็ป“ๆžœ', - 'dashboard.indicator.backtest.totalReturn': 'ๆ€ปๆ”ถ็›Š็އ', - 'dashboard.indicator.backtest.annualReturn': 'ๅนดๅŒ–ๆ”ถ็›Š', - 'dashboard.indicator.backtest.maxDrawdown': 'ๆœ€ๅคงๅ›žๆ’ค', - 'dashboard.indicator.backtest.sharpeRatio': 'ๅคๆ™ฎๆฏ”็އ', - 'dashboard.indicator.backtest.winRate': '่ƒœ็އ', - 'dashboard.indicator.backtest.profitFactor': '็›ˆไบๆฏ”', - 'dashboard.indicator.backtest.totalTrades': 'ไบคๆ˜“ๆฌกๆ•ฐ', - 'dashboard.indicator.totalReturn': 'ๆ€ปๆ”ถ็›Š็އ', - 'dashboard.indicator.annualReturn': 'ๅนดๅŒ–ๆ”ถ็›Š็އ', - 'dashboard.indicator.maxDrawdown': 'ๆœ€ๅคงๅ›žๆ’ค', - 'dashboard.indicator.sharpeRatio': 'ๅคๆ™ฎๆฏ”็އ', - 'dashboard.indicator.winRate': '่ƒœ็އ', - 'dashboard.indicator.profitFactor': '็›ˆไบๆฏ”', - 'dashboard.indicator.totalTrades': 'ๆ€ปไบคๆ˜“ๆฌกๆ•ฐ', - 'dashboard.indicator.backtest.totalCommission': 'ๆ€ปๆ‰‹็ปญ่ดน', - 'dashboard.indicator.backtest.equityCurve': 'ๆ”ถ็›Šๆ›ฒ็บฟ', - 'dashboard.indicator.backtest.strategy': 'ๆŒ‡ๆ ‡ๆ”ถ็›Š', - 'dashboard.indicator.backtest.benchmark': 'ๅŸบๅ‡†ๆ”ถ็›Š', - 'dashboard.indicator.backtest.tradeHistory': 'ไบคๆ˜“่ฎฐๅฝ•', - 'dashboard.indicator.backtest.tradeTime': 'ๆ—ถ้—ด', - 'dashboard.indicator.backtest.tradeType': '็ฑปๅž‹', - 'dashboard.indicator.backtest.buy': 'ไนฐๅ…ฅ', - 'dashboard.indicator.backtest.sell': 'ๅ–ๅ‡บ', - 'dashboard.indicator.backtest.liquidation': '็ˆ†ไป“', - 'dashboard.indicator.backtest.openLong': 'ๅผ€ๅคš', - 'dashboard.indicator.backtest.closeLong': 'ๅนณๅคš', - 'dashboard.indicator.backtest.closeLongStop': 'ๅนณๅคš(ๆญขๆŸ)', - 'dashboard.indicator.backtest.closeLongProfit': 'ๅนณๅคš(ๆญข็›ˆ)', - 'dashboard.indicator.backtest.addLong': 'ๅŠ ๅคšไป“', - 'dashboard.indicator.backtest.openShort': 'ๅผ€็ฉบ', - 'dashboard.indicator.backtest.closeShort': 'ๅนณ็ฉบ', - 'dashboard.indicator.backtest.closeShortStop': 'ๅนณ็ฉบ(ๆญขๆŸ)', - 'dashboard.indicator.backtest.closeShortProfit': 'ๅนณ็ฉบ(ๆญข็›ˆ)', - 'dashboard.indicator.backtest.addShort': 'ๅŠ ็ฉบไป“', - 'dashboard.indicator.backtest.price': 'ไปทๆ ผ', - 'dashboard.indicator.backtest.amount': 'ๆ•ฐ้‡', - 'dashboard.indicator.backtest.balance': '่ดฆๆˆทไฝ™้ข', - 'dashboard.indicator.backtest.profit': '็›ˆไบ', - 'dashboard.indicator.backtest.success': 'ๅ›žๆต‹ๅฎŒๆˆ', - 'dashboard.indicator.backtest.failed': 'ๅ›žๆต‹ๅคฑ่ดฅ๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'dashboard.indicator.backtest.quickSelect': 'ๅฟซ้€Ÿ้€‰ๆ‹ฉ', - // ๅคšๆ—ถ้—ดๆก†ๆžถๅ›žๆต‹็ฒพๅบฆๆ็คบ - 'dashboard.indicator.backtest.precisionMode': 'ๅ›žๆต‹็ฒพๅบฆๆจกๅผ', - 'dashboard.indicator.backtest.estimatedCandles': '้ข„่ฎกๅค„็†็บฆ {count} ๆ นK็บฟ', - 'dashboard.indicator.backtest.highPrecisionDesc': 'ไฝฟ็”จ1ๅˆ†้’Ÿ็บงๅˆซK็บฟ่ฟ›่กŒ้ซ˜็ฒพๅบฆๅ›žๆต‹๏ผŒๆญขๆŸๆญข็›ˆ่งฆๅ‘ๆ›ด็ฒพ็กฎ', - 'dashboard.indicator.backtest.mediumPrecisionDesc': 'ๅ›žๆต‹ๅŒบ้—ด่ถ…่ฟ‡30ๅคฉ๏ผŒไฝฟ็”จ5ๅˆ†้’Ÿ็บงๅˆซK็บฟไปฅๅนณ่กก็ฒพๅบฆไธŽๆ€ง่ƒฝ', - 'dashboard.indicator.backtest.standardModeWarning': 'ไฝฟ็”จๆ ‡ๅ‡†ๅ›žๆต‹ๆจกๅผ', - 'dashboard.indicator.backtest.standardModeDesc': 'ๅฝ“ๅ‰้…็ฝฎไธๆ”ฏๆŒ้ซ˜็ฒพๅบฆๅ›žๆต‹๏ผŒๅฐ†ไฝฟ็”จ็ญ–็•ฅK็บฟ่ฟ›่กŒๅ›žๆต‹', - 'dashboard.indicator.backtest.onlyCryptoSupported': '้ซ˜็ฒพๅบฆๅ›žๆต‹ไป…ๆ”ฏๆŒๅŠ ๅฏ†่ดงๅธๅธ‚ๅœบ', - 'dashboard.indicator.backtest.noIndicatorCode': '่ฏฅๆŒ‡ๆ ‡ๆฒกๆœ‰ๅฏๅ›žๆต‹็š„ไปฃ็ ', - 'dashboard.indicator.backtest.noSymbol': '่ฏทๅ…ˆ้€‰ๆ‹ฉไบคๆ˜“ๆ ‡็š„', - 'dashboard.indicator.backtest.dateRangeExceeded': 'ๅ›žๆต‹ๆ—ถ้—ด่Œƒๅ›ด่ถ…ๅ‡บ้™ๅˆถ๏ผš{timeframe}ๅ‘จๆœŸๆœ€ๅคšๅฏๅ›žๆต‹{maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'ๅ›žๆต‹ๆ—ถ้—ด่Œƒๅ›ด่ถ…ๅ‡บ้™ๅˆถ๏ผš{timeframe}ๅ‘จๆœŸๆœ€ๅคšๅฏๅ›žๆต‹{maxRange}๏ผˆ{maxDays}ๅคฉ๏ผ‰', - 'dashboard.indicator.backtest.metaLine': 'ๆ ‡็š„๏ผš{symbol} | ๅธ‚ๅœบ๏ผš{market} | ๅ‘จๆœŸ๏ผš{timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'ๅ›žๆต‹ๅทฒไฟๅญ˜๏ผŒ่ฎฐๅฝ•ID๏ผš{id}', - 'dashboard.indicator.backtest.historyTitle': 'ๅ›žๆต‹่ฎฐๅฝ•', - 'dashboard.indicator.backtest.historyRefresh': 'ๅˆทๆ–ฐ', - 'dashboard.indicator.backtest.historyView': 'ๆŸฅ็œ‹', - 'dashboard.indicator.backtest.historyNoData': 'ๆš‚ๆ— ๅ›žๆต‹่ฎฐๅฝ•', - 'dashboard.indicator.backtest.historyUseCurrent': 'ไป…็›ฎๅ‰ๅธ็ง/ๅ‘จๆœŸ', - 'dashboard.indicator.backtest.historyFilterSymbol': 'ๅธ็ง๏ผˆSymbol๏ผ‰', - 'dashboard.indicator.backtest.historyFilterTimeframe': 'ๅ‘จๆœŸ๏ผˆTimeframe๏ผ‰', - 'dashboard.indicator.backtest.historyApply': 'ๅบ”็”จ็ญ›้€‰', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AIๅˆ†ๆž', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI ๅˆ†ๆžๅปบ่ฎฎ', - 'dashboard.indicator.backtest.historyNoAIResult': 'ๆš‚ๆ—  AI ๅˆ†ๆž็ป“ๆžœ', - 'dashboard.indicator.backtest.historyRunId': '่ฎฐๅฝ•ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'ๆ—ถ้—ด', - 'dashboard.indicator.backtest.historyRange': 'ๅŒบ้—ด', - 'dashboard.indicator.backtest.historyStatus': '็Šถๆ€', - 'dashboard.indicator.backtest.historyStatusSuccess': 'ๆˆๅŠŸ', - 'dashboard.indicator.backtest.historyStatusFailed': 'ๅคฑ่ดฅ', - 'dashboard.indicator.backtest.historyActions': 'ๆ“ไฝœ', - 'dashboard.indicator.backtest.prev': 'ไธŠไธ€ๆญฅ', - 'dashboard.indicator.backtest.next': 'ไธ‹ไธ€ๆญฅ', - 'dashboard.indicator.backtest.steps.strategy.title': 'ๆ‰ง่กŒ้…็ฝฎ', - 'dashboard.indicator.backtest.steps.strategy.desc': 'ไป“ไฝ/้ฃŽๆŽง/ๅŠ ๅ‡ไป“๏ผˆ็ญ–็•ฅๅฑ‚๏ผ‰', - 'dashboard.indicator.backtest.steps.trading.title': 'ๅ›žๆต‹็Žฏๅขƒ', - 'dashboard.indicator.backtest.steps.trading.desc': 'ๆ—ถ้—ด/่ต„้‡‘/่ดน็އ/ๆ ๆ†/ๆป‘็‚น', - 'dashboard.indicator.backtest.steps.results.title': '็ป“ๆžœ', - 'dashboard.indicator.backtest.steps.results.desc': '็ปŸ่ฎกไธŽไบคๆ˜“ๆ˜Ž็ป†', - 'dashboard.indicator.backtest.panel.risk': 'ๆ‰ง่กŒ้…็ฝฎ๏ผš้ฃŽๆŽง๏ผˆๆญขๆŸ/็งปๅŠจๆญข็›ˆ๏ผ‰', - 'dashboard.indicator.backtest.panel.scale': 'ๆ‰ง่กŒ้…็ฝฎ๏ผšๅŠ ไป“๏ผˆ้กบๅŠฟ/้€†ๅŠฟ๏ผ‰', - 'dashboard.indicator.backtest.panel.reduce': 'ๆ‰ง่กŒ้…็ฝฎ๏ผšๅ‡ไป“๏ผˆ้กบๅŠฟ/้€†ๅŠฟ๏ผ‰', - 'dashboard.indicator.backtest.panel.position': 'ๆ‰ง่กŒ้…็ฝฎ๏ผšๅผ€ไป“ไป“ไฝ', - 'dashboard.indicator.backtest.field.stopLossPct': 'ๆญขๆŸ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.takeProfitPct': 'ๆญข็›ˆ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trailingEnabled': '็งปๅŠจๆญข็›ˆ', - 'dashboard.indicator.backtest.field.trailingStopPct': '็งปๅŠจๅ›žๆ’ค๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trailingActivationPct': '็งปๅŠจๆญข็›ˆๆฟ€ๆดป๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.slippage': 'ๆป‘็‚น๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendAddEnabled': '้กบๅŠฟๅŠ ไป“', - 'dashboard.indicator.backtest.field.dcaAddEnabled': '้€†ๅŠฟๅŠ ไป“', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'ๅŠ ไป“่งฆๅ‘๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'ๅŠ ไป“่งฆๅ‘๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'ๆฏๆฌกๅŠ ไป“่ต„้‡‘ๅ ๆฏ”๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'ๆฏๆฌกๅŠ ไป“่ต„้‡‘ๅ ๆฏ”๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'ๆœ€ๅคšๅŠ ไป“ๆฌกๆ•ฐ', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'ๆœ€ๅคšๅŠ ไป“ๆฌกๆ•ฐ', - 'dashboard.indicator.backtest.field.trendReduceEnabled': '้กบๅŠฟๅ‡ไป“', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': '้€†ๅŠฟๅ‡ไป“', - 'dashboard.indicator.backtest.field.trendReduceStepPct': '้กบๅŠฟ่งฆๅ‘๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': '้€†ๅŠฟ่งฆๅ‘๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'ๆฏๆฌกๅ‡ไป“ๆฏ”ไพ‹๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'ๆฏๆฌก้€†ๅŠฟๅ‡ไป“ๆฏ”ไพ‹๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'ๆœ€ๅคš้กบๅŠฟๅ‡ไป“ๆฌกๆ•ฐ', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'ๆœ€ๅคš้€†ๅŠฟๅ‡ไป“ๆฌกๆ•ฐ', - 'dashboard.indicator.backtest.field.entryPct': 'ๅผ€ไป“่ต„้‡‘ๅ ๆฏ”๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.minOrderPct': 'ๅ•ๆฌกๆœ€ๅฐ่ต„้‡‘ๅ ๆฏ”๏ผˆ%๏ผ‰๏ผˆๅฏ้€‰๏ผ‰', - 'dashboard.indicator.backtest.hint.entryPctMax': 'ๆœ€ๅคงๅฏๅผ€ไป“๏ผš{maxPct}%๏ผˆไธบๅŽ็ปญๅŠ ไป“้ข„็•™่ต„้‡‘๏ผ‰', - 'dashboard.indicator.backtest.closeLongTrailing': 'ๅนณๅคš(็งปๅŠจๆญขๆŸ/ๆญข็›ˆ)', - 'dashboard.indicator.backtest.reduceLong': 'ๅคšๅคดๅ‡ไป“', - 'dashboard.indicator.backtest.closeShortTrailing': 'ๅนณ็ฉบ(็งปๅŠจๆญขๆŸ/ๆญข็›ˆ)', - 'dashboard.indicator.backtest.reduceShort': '็ฉบๅคดๅ‡ไป“', - 'dashboard.docs.title': 'ๆ–‡ๆกฃไธญๅฟƒ', - 'dashboard.docs.search.placeholder': 'ๆœ็ดขๆ–‡ๆกฃ...', - 'dashboard.docs.category.all': 'ๅ…จ้ƒจ', - 'dashboard.docs.category.guide': 'ๅผ€ๅ‘ๆŒ‡ๅ—', - 'dashboard.docs.category.api': 'APIๆ–‡ๆกฃ', - 'dashboard.docs.category.tutorial': 'ๆ•™็จ‹', - 'dashboard.docs.category.faq': 'ๅธธ่ง้—ฎ้ข˜', - 'dashboard.docs.featured.title': 'ๆŽจ่ๆ–‡ๆกฃ', - 'dashboard.docs.featured.tag': 'ๆŽจ่', - 'dashboard.docs.list.views': 'ๆต่งˆ', - 'dashboard.docs.list.author': 'ไฝœ่€…', - 'dashboard.docs.list.empty': 'ๆš‚ๆ— ๆ–‡ๆกฃ', - 'dashboard.docs.list.backToAll': '่ฟ”ๅ›žๅ…จ้ƒจๆ–‡ๆกฃ', - 'dashboard.docs.list.total': 'ๅ…ฑ {count} ็ฏ‡ๆ–‡ๆกฃ', - 'dashboard.docs.detail.back': '่ฟ”ๅ›žๆ–‡ๆกฃๅˆ—่กจ', - 'dashboard.docs.detail.updatedAt': 'ๆ›ดๆ–ฐไบŽ', - 'dashboard.docs.detail.related': '็›ธๅ…ณๆ–‡ๆกฃ', - 'dashboard.docs.detail.notFound': 'ๆ–‡ๆกฃไธๅญ˜ๅœจ', - 'dashboard.docs.detail.error': 'ๆ–‡ๆกฃไธๅญ˜ๅœจๆˆ–ๅทฒ่ขซๅˆ ้™ค', - 'dashboard.docs.search.result': 'ๆœ็ดข็ป“ๆžœ', - 'dashboard.docs.search.keyword': 'ๅ…ณ้”ฎ่ฏ', - 'dashboard.totalEquity': 'ๆ€ปๆƒ็›Š', - 'dashboard.totalPnL': 'ๆ€ป็›ˆไบ', - 'dashboard.aiStrategies': 'AI ็ญ–็•ฅ', - 'dashboard.indicatorStrategies': 'ๆŒ‡ๆ ‡็ญ–็•ฅ', - 'dashboard.running': '่ฟ่กŒไธญ', - 'dashboard.enabled': 'ๅทฒๅฏ็”จ', - 'dashboard.pnlHistory': 'ๅކๅฒ็›ˆไบ', - 'dashboard.strategyPerformance': '็ญ–็•ฅ็›ˆไบๅ ๆฏ”', - 'dashboard.drawdown': 'ๅ›žๆ’คๆ›ฒ็บฟ', - 'dashboard.strategyRanking': '็ญ–็•ฅๆŽ’่กŒๆฆœ', - // New KPI labels - 'dashboard.winRate': '่ƒœ็އ', - 'dashboard.profitFactor': '็›ˆไบๆฏ”', - 'dashboard.maxDrawdown': 'ๆœ€ๅคงๅ›žๆ’ค', - 'dashboard.totalTrades': 'ๆ€ปไบคๆ˜“', - 'dashboard.runningStrategies': '่ฟ่กŒไธญ็ญ–็•ฅ', - 'dashboard.equityCurve': 'ๆƒ็›Šๆ›ฒ็บฟ', - 'dashboard.strategyAllocation': '็ญ–็•ฅๅˆ†ๅธƒ', - 'dashboard.drawdownCurve': 'ๅ›žๆ’คๆ›ฒ็บฟ', - 'dashboard.hourlyDistribution': 'ไบคๆ˜“ๆ—ถๆฎต', - // Chart labels - 'dashboard.dailyPnl': 'ๆ—ฅ็›ˆไบ', - 'dashboard.cumulativePnl': '็ดฏ่ฎก็›ˆไบ', - 'dashboard.tradeCount': 'ไบคๆ˜“ๆฌกๆ•ฐ', - 'dashboard.profit': '็›ˆไบ', - 'dashboard.noData': 'ๆš‚ๆ— ๆ•ฐๆฎ', - 'dashboard.noStrategyData': 'ๆš‚ๆ— ็ญ–็•ฅๆ•ฐๆฎ', - // Ranking labels - 'dashboard.ranking.totalProfit': 'ๆ€ปๆ”ถ็›Š', - 'dashboard.ranking.roi': 'ๆ”ถ็›Š็އ', - 'dashboard.ranking.trades': 'ไบคๆ˜“ๆ•ฐ', - // Units and labels - 'dashboard.unit.trades': '็ฌ”', - 'dashboard.unit.strategies': 'ไธช', - 'dashboard.label.avgDaily': 'ๆ—ฅๅ‡', - 'dashboard.label.avgProfit': 'ๅนณๅ‡็›ˆๅˆฉ', - 'dashboard.label.win': '่ƒœ', - 'dashboard.label.lose': '่ดŸ', - 'dashboard.label.trade': 'ไบคๆ˜“', - 'dashboard.label.indicator': 'ๆŒ‡ๆ ‡', - 'dashboard.label.totalPnl': 'ๆ€ป็›ˆไบ', - 'dashboard.label.maxDrawdownPoint': 'ๆœ€ๅคงๅ›žๆ’ค', - 'dashboard.profitCalendar': 'ๆ”ถ็›Šๆ—ฅๅކ', - 'dashboard.recentTrades': 'ๆœ€่ฟ‘ไบคๆ˜“', - 'dashboard.currentPositions': 'ๅฝ“ๅ‰ๆŒไป“', - 'dashboard.table.time': 'ๆ—ถ้—ด', - 'dashboard.table.strategy': '็ญ–็•ฅๅ็งฐ', - 'dashboard.table.symbol': 'ๆ ‡็š„', - 'dashboard.table.type': '็ฑปๅž‹', - 'dashboard.table.side': 'ๆ–นๅ‘', - 'dashboard.table.size': 'ๆŒไป“้‡', - 'dashboard.table.entryPrice': 'ๅผ€ไป“ๅ‡ไปท', - 'dashboard.table.price': 'ไปทๆ ผ', - 'dashboard.table.amount': 'ๆ•ฐ้‡', - 'dashboard.table.profit': '็›ˆไบ', - 'dashboard.pendingOrders': '่ฎขๅ•ๆ‰ง่กŒ่ฎฐๅฝ•', - 'dashboard.totalOrders': 'ๅ…ฑ {total} ๆก', - 'dashboard.viewError': 'ๆŸฅ็œ‹้”™่ฏฏ', - 'dashboard.filled': 'ๅทฒๆˆไบค', - 'dashboard.orderTable.time': 'ๅˆ›ๅปบๆ—ถ้—ด', - 'dashboard.orderTable.strategy': '็ญ–็•ฅ', - 'dashboard.orderTable.symbol': 'ไบคๆ˜“ๅฏน', - 'dashboard.orderTable.signalType': 'ไฟกๅท็ฑปๅž‹', - 'dashboard.orderTable.amount': 'ๆ•ฐ้‡', - 'dashboard.orderTable.price': 'ๆˆไบคไปท', - 'dashboard.orderTable.status': '็Šถๆ€', - 'dashboard.orderTable.timeInfo': 'ๆ—ถ้—ด', - 'dashboard.orderTable.executedAt': 'ๆ‰ง่กŒๆ—ถ้—ด', - 'dashboard.orderTable.exchange': 'ไบคๆ˜“ๆ‰€', - 'dashboard.orderTable.notify': '้€š็Ÿฅๆ–นๅผ', - 'dashboard.orderTable.actions': 'ๆ“ไฝœ', - 'dashboard.orderTable.delete': 'ๅˆ ้™ค', - 'dashboard.orderTable.deleteConfirm': '็กฎ่ฎคๅˆ ้™ค่ฟ™ๆก่ฎฐๅฝ•๏ผŸ', - 'dashboard.orderTable.deleteSuccess': 'ๅˆ ้™คๆˆๅŠŸ', - 'dashboard.orderTable.deleteFailed': 'ๅˆ ้™คๅคฑ่ดฅ', - 'dashboard.newOrderNotify': 'ๆ–ฐ่ฎขๅ•ๆ้†’', - 'dashboard.newOrderDesc': 'ๆœ‰ๆ–ฐ็š„่ฎขๅ•ๆ‰ง่กŒ่ฎฐๅฝ•', - 'dashboard.soundEnabled': 'ๅฃฐ้Ÿณๆ้†’ๅทฒๅผ€ๅฏ', - 'dashboard.soundDisabled': 'ๅฃฐ้Ÿณๆ้†’ๅทฒๅ…ณ้—ญ', - 'dashboard.clickToMute': '็‚นๅ‡ปๅ…ณ้—ญๅฃฐ้Ÿณๆ้†’', - 'dashboard.clickToUnmute': '็‚นๅ‡ปๅผ€ๅฏๅฃฐ้Ÿณๆ้†’', - 'dashboard.signalType.openLong': 'ๅผ€ๅคš', - 'dashboard.signalType.openShort': 'ๅผ€็ฉบ', - 'dashboard.signalType.closeLong': 'ๅนณๅคš', - 'dashboard.signalType.closeShort': 'ๅนณ็ฉบ', - 'dashboard.signalType.addLong': 'ๅŠ ๅคš', - 'dashboard.signalType.addShort': 'ๅŠ ็ฉบ', - 'dashboard.status.pending': 'ๅพ…ๅค„็†', - 'dashboard.status.processing': 'ๅค„็†ไธญ', - 'dashboard.status.completed': 'ๅทฒๅฎŒๆˆ', - 'dashboard.status.failed': 'ๅคฑ่ดฅ', - 'dashboard.status.cancelled': 'ๅทฒๅ–ๆถˆ', - 'dashboard.table.pnl': 'ๆœชๅฎž็Žฐ็›ˆไบ', - 'form.basic-form.basic.title': 'ๅŸบ็ก€่กจๅ•', - 'form.basic-form.basic.description': '่กจๅ•้กต็”จไบŽๅ‘็”จๆˆทๆ”ถ้›†ๆˆ–้ชŒ่ฏไฟกๆฏ๏ผŒๅŸบ็ก€่กจๅ•ๅธธ่งไบŽๆ•ฐๆฎ้กน่พƒๅฐ‘็š„่กจๅ•ๅœบๆ™ฏใ€‚', - 'form.basic-form.title.label': 'ๆ ‡้ข˜', - 'form.basic-form.title.placeholder': '็ป™็›ฎๆ ‡่ตทไธชๅๅญ—', - 'form.basic-form.title.required': '่ฏท่พ“ๅ…ฅๆ ‡้ข˜', - 'form.basic-form.date.label': '่ตทๆญขๆ—ฅๆœŸ', - 'form.basic-form.placeholder.start': 'ๅผ€ๅง‹ๆ—ฅๆœŸ', - 'form.basic-form.placeholder.end': '็ป“ๆŸๆ—ฅๆœŸ', - 'form.basic-form.date.required': '่ฏท้€‰ๆ‹ฉ่ตทๆญขๆ—ฅๆœŸ', - 'form.basic-form.goal.label': '็›ฎๆ ‡ๆ่ฟฐ', - 'form.basic-form.goal.placeholder': '่ฏท่พ“ๅ…ฅไฝ ็š„้˜ถๆฎตๆ€งๅทฅไฝœ็›ฎๆ ‡', - 'form.basic-form.goal.required': '่ฏท่พ“ๅ…ฅ็›ฎๆ ‡ๆ่ฟฐ', - 'form.basic-form.standard.label': '่กก้‡ๆ ‡ๅ‡†', - 'form.basic-form.standard.placeholder': '่ฏท่พ“ๅ…ฅ่กก้‡ๆ ‡ๅ‡†', - 'form.basic-form.standard.required': '่ฏท่พ“ๅ…ฅ่กก้‡ๆ ‡ๅ‡†', - 'form.basic-form.client.label': 'ๅฎขๆˆท', - 'form.basic-form.client.required': '่ฏทๆ่ฟฐไฝ ๆœๅŠก็š„ๅฎขๆˆท', - 'form.basic-form.label.tooltip': '็›ฎๆ ‡็š„ๆœๅŠกๅฏน่ฑก', - 'form.basic-form.client.placeholder': '่ฏทๆ่ฟฐไฝ ๆœๅŠก็š„ๅฎขๆˆท๏ผŒๅ†…้ƒจๅฎขๆˆท็›ดๆŽฅ @ๅง“ๅ๏ผๅทฅๅท', - 'form.basic-form.invites.label': '้‚€่ฏ„ไบบ', - 'form.basic-form.invites.placeholder': '่ฏท็›ดๆŽฅ @ๅง“ๅ๏ผๅทฅๅท๏ผŒๆœ€ๅคšๅฏ้‚€่ฏท 5 ไบบ', - 'form.basic-form.weight.label': 'ๆƒ้‡', - 'form.basic-form.weight.placeholder': '่ฏท่พ“ๅ…ฅ', - 'form.basic-form.public.label': '็›ฎๆ ‡ๅ…ฌๅผ€', - 'form.basic-form.label.help': 'ๅฎขๆˆทใ€้‚€่ฏ„ไบบ้ป˜่ฎค่ขซๅˆ†ไบซ', - 'form.basic-form.radio.public': 'ๅ…ฌๅผ€', - 'form.basic-form.radio.partially-public': '้ƒจๅˆ†ๅ…ฌๅผ€', - 'form.basic-form.radio.private': 'ไธๅ…ฌๅผ€', - 'form.basic-form.publicUsers.placeholder': 'ๅ…ฌๅผ€็ป™', - 'form.basic-form.option.A': 'ๅŒไบ‹ไธ€', - 'form.basic-form.option.B': 'ๅŒไบ‹ไบŒ', - 'form.basic-form.option.C': 'ๅŒไบ‹ไธ‰', - 'form.basic-form.email.required': '่ฏท่พ“ๅ…ฅ้‚ฎ็ฎฑๅœฐๅ€๏ผ', - 'form.basic-form.email.wrong-format': '้‚ฎ็ฎฑๅœฐๅ€ๆ ผๅผ้”™่ฏฏ๏ผ', - 'form.basic-form.userName.required': '่ฏท่พ“ๅ…ฅ็”จๆˆทๅ!', - 'form.basic-form.password.required': '่ฏท่พ“ๅ…ฅๅฏ†็ ๏ผ', - 'form.basic-form.password.twice': 'ไธคๆฌก่พ“ๅ…ฅ็š„ๅฏ†็ ไธๅŒน้…!', - 'form.basic-form.strength.msg': '่ฏท่‡ณๅฐ‘่พ“ๅ…ฅ 6 ไธชๅญ—็ฌฆใ€‚่ฏทไธ่ฆไฝฟ็”จๅฎนๆ˜“่ขซ็Œœๅˆฐ็š„ๅฏ†็ ใ€‚', - 'form.basic-form.strength.strong': 'ๅผบๅบฆ๏ผšๅผบ', - 'form.basic-form.strength.medium': 'ๅผบๅบฆ๏ผšไธญ', - 'form.basic-form.strength.short': 'ๅผบๅบฆ๏ผšๅคช็Ÿญ', - 'form.basic-form.confirm-password.required': '่ฏท็กฎ่ฎคๅฏ†็ ๏ผ', - 'form.basic-form.phone-number.required': '่ฏท่พ“ๅ…ฅๆ‰‹ๆœบๅท๏ผ', - 'form.basic-form.phone-number.wrong-format': 'ๆ‰‹ๆœบๅทๆ ผๅผ้”™่ฏฏ๏ผ', - 'form.basic-form.verification-code.required': '่ฏท่พ“ๅ…ฅ้ชŒ่ฏ็ ๏ผ', - 'form.basic-form.form.get-captcha': '่Žทๅ–้ชŒ่ฏ็ ', - 'form.basic-form.captcha.second': '็ง’', - 'form.basic-form.form.optional': '๏ผˆ้€‰ๅกซ๏ผ‰', - 'form.basic-form.form.submit': 'ๆไบค', - 'form.basic-form.form.save': 'ไฟๅญ˜', - 'form.basic-form.email.placeholder': '้‚ฎ็ฎฑ', - 'form.basic-form.password.placeholder': '่‡ณๅฐ‘6ไฝๅฏ†็ ๏ผŒๅŒบๅˆ†ๅคงๅฐๅ†™', - 'form.basic-form.confirm-password.placeholder': '็กฎ่ฎคๅฏ†็ ', - 'form.basic-form.phone-number.placeholder': 'ๆ‰‹ๆœบๅท', - 'form.basic-form.verification-code.placeholder': '้ชŒ่ฏ็ ', - 'result.success.title': 'ๆไบคๆˆๅŠŸ', - 'result.success.description': 'ๆไบค็ป“ๆžœ้กต็”จไบŽๅ้ฆˆไธ€็ณปๅˆ—ๆ“ไฝœไปปๅŠก็š„ๅค„็†็ป“ๆžœ๏ผŒ ๅฆ‚ๆžœไป…ๆ˜ฏ็ฎ€ๅ•ๆ“ไฝœ๏ผŒไฝฟ็”จ Message ๅ…จๅฑ€ๆ็คบๅ้ฆˆๅณๅฏใ€‚ ๆœฌๆ–‡ๅญ—ๅŒบๅŸŸๅฏไปฅๅฑ•็คบ็ฎ€ๅ•็š„่กฅๅ……่ฏดๆ˜Ž๏ผŒๅฆ‚ๆžœๆœ‰็ฑปไผผๅฑ•็คบ โ€œๅ•ๆฎโ€็š„้œ€ๆฑ‚๏ผŒไธ‹้ข่ฟ™ไธช็ฐ่‰ฒๅŒบๅŸŸๅฏไปฅๅ‘ˆ็Žฐๆฏ”่พƒๅคๆ‚็š„ๅ†…ๅฎนใ€‚', - 'result.success.operate-title': '้กน็›ฎๅ็งฐ', - 'result.success.operate-id': '้กน็›ฎ ID', - 'result.success.principal': '่ดŸ่ดฃไบบ', - 'result.success.operate-time': '็”Ÿๆ•ˆๆ—ถ้—ด', - 'result.success.step1-title': 'ๅˆ›ๅปบ้กน็›ฎ', - 'result.success.step1-operator': 'ๆ›ฒไธฝไธฝ', - 'result.success.step2-title': '้ƒจ้—จๅˆๅฎก', - 'result.success.step2-operator': 'ๅ‘จๆฏ›ๆฏ›', - 'result.success.step2-extra': 'ๅ‚ฌไธ€ไธ‹', - 'result.success.step3-title': '่ดขๅŠกๅคๆ ธ', - 'result.success.step4-title': 'ๅฎŒๆˆ', - 'result.success.btn-return': '่ฟ”ๅ›žๅˆ—่กจ', - 'result.success.btn-project': 'ๆŸฅ็œ‹้กน็›ฎ', - 'result.success.btn-print': 'ๆ‰“ๅฐ', - 'result.fail.error.title': 'ๆไบคๅคฑ่ดฅ', - 'result.fail.error.description': '่ฏทๆ ธๅฏนๅนถไฟฎๆ”นไปฅไธ‹ไฟกๆฏๅŽ๏ผŒๅ†้‡ๆ–ฐๆไบคใ€‚', - 'result.fail.error.hint-title': 'ๆ‚จๆไบค็š„ๅ†…ๅฎนๆœ‰ๅฆ‚ไธ‹้”™่ฏฏ๏ผš', - 'result.fail.error.hint-text1': 'ๆ‚จ็š„่ดฆๆˆทๅทฒ่ขซๅ†ป็ป“', - 'result.fail.error.hint-btn1': '็ซ‹ๅณ่งฃๅ†ป', - 'result.fail.error.hint-text2': 'ๆ‚จ็š„่ดฆๆˆท่ฟ˜ไธๅ…ทๅค‡็”ณ่ฏท่ต„ๆ ผ', - 'result.fail.error.hint-btn2': '็ซ‹ๅณๅ‡็บง', - 'result.fail.error.btn-text': '่ฟ”ๅ›žไฟฎๆ”น', - 'account.settings.menuMap.custom': 'ไธชๆ€งๅŒ–', - 'account.settings.menuMap.binding': '่ดฆๅท็ป‘ๅฎš', - 'account.settings.basic.avatar': 'ๅคดๅƒ', - 'account.settings.basic.change-avatar': 'ๆ›ดๆขๅคดๅƒ', - 'account.settings.basic.email': '้‚ฎ็ฎฑ', - 'account.settings.basic.email-message': '่ฏท่พ“ๅ…ฅๆ‚จ็š„้‚ฎ็ฎฑ!', - 'account.settings.basic.nickname': 'ๆ˜ต็งฐ', - 'account.settings.basic.nickname-message': '่ฏท่พ“ๅ…ฅๆ‚จ็š„ๆ˜ต็งฐ!', - 'account.settings.basic.profile': 'ไธชไบบ็ฎ€ไป‹', - 'account.settings.basic.profile-message': '่ฏท่พ“ๅ…ฅไธชไบบ็ฎ€ไป‹!', - 'account.settings.basic.profile-placeholder': 'ไธชไบบ็ฎ€ไป‹', - 'account.settings.basic.country': 'ๅ›ฝๅฎถ/ๅœฐๅŒบ', - 'account.settings.basic.country-message': '่ฏท่พ“ๅ…ฅๆ‚จ็š„ๅ›ฝๅฎถๆˆ–ๅœฐๅŒบ!', - 'account.settings.basic.geographic': 'ๆ‰€ๅœจ็œๅธ‚', - 'account.settings.basic.geographic-message': '่ฏท่พ“ๅ…ฅๆ‚จ็š„ๆ‰€ๅœจ็œๅธ‚!', - 'account.settings.basic.address': '่ก—้“ๅœฐๅ€', - 'account.settings.basic.address-message': '่ฏท่พ“ๅ…ฅๆ‚จ็š„่ก—้“ๅœฐๅ€!', - 'account.settings.basic.phone': '่”็ณป็”ต่ฏ', - 'account.settings.basic.phone-message': '่ฏท่พ“ๅ…ฅๆ‚จ็š„่”็ณป็”ต่ฏ!', - 'account.settings.basic.update': 'ๆ›ดๆ–ฐๅŸบๆœฌไฟกๆฏ', - 'account.settings.basic.update.success': 'ๆ›ดๆ–ฐๅŸบๆœฌไฟกๆฏๆˆๅŠŸ', - 'account.settings.security.strong': 'ๅผบ', - 'account.settings.security.medium': 'ไธญ', - 'account.settings.security.weak': 'ๅผฑ', - 'account.settings.security.password': '่ดฆๆˆทๅฏ†็ ', - 'account.settings.security.password-description': 'ๅฝ“ๅ‰ๅฏ†็ ๅผบๅบฆ๏ผš', - 'account.settings.security.phone': 'ๅฏ†ไฟๆ‰‹ๆœบ', - 'account.settings.security.phone-description': 'ๅทฒ็ป‘ๅฎšๆ‰‹ๆœบ๏ผš', - 'account.settings.security.question': 'ๅฏ†ไฟ้—ฎ้ข˜', - 'account.settings.security.question-description': 'ๆœช่ฎพ็ฝฎๅฏ†ไฟ้—ฎ้ข˜๏ผŒๅฏ†ไฟ้—ฎ้ข˜ๅฏๆœ‰ๆ•ˆไฟๆŠค่ดฆๆˆทๅฎ‰ๅ…จ', - 'account.settings.security.email': '็ป‘ๅฎš้‚ฎ็ฎฑ', - 'account.settings.security.email-description': 'ๅทฒ็ป‘ๅฎš้‚ฎ็ฎฑ๏ผš', - 'account.settings.security.mfa': 'MFA ่ฎพๅค‡', - 'account.settings.security.mfa-description': 'ๆœช็ป‘ๅฎš MFA ่ฎพๅค‡๏ผŒ็ป‘ๅฎšๅŽ๏ผŒๅฏไปฅ่ฟ›่กŒไบŒๆฌก็กฎ่ฎค', - 'account.settings.security.modify': 'ไฟฎๆ”น', - 'account.settings.security.set': '่ฎพ็ฝฎ', - 'account.settings.security.bind': '็ป‘ๅฎš', - 'account.settings.binding.taobao': '็ป‘ๅฎšๆท˜ๅฎ', - 'account.settings.binding.taobao-description': 'ๅฝ“ๅ‰ๆœช็ป‘ๅฎšๆท˜ๅฎ่ดฆๅท', - 'account.settings.binding.alipay': '็ป‘ๅฎšๆ”ฏไป˜ๅฎ', - 'account.settings.binding.alipay-description': 'ๅฝ“ๅ‰ๆœช็ป‘ๅฎšๆ”ฏไป˜ๅฎ่ดฆๅท', - 'account.settings.binding.dingding': '็ป‘ๅฎš้’‰้’‰', - 'account.settings.binding.dingding-description': 'ๅฝ“ๅ‰ๆœช็ป‘ๅฎš้’‰้’‰่ดฆๅท', - 'account.settings.binding.bind': '็ป‘ๅฎš', - 'account.settings.notification.password': '่ดฆๆˆทๅฏ†็ ', - 'account.settings.notification.password-description': 'ๅ…ถไป–็”จๆˆท็š„ๆถˆๆฏๅฐ†ไปฅ็ซ™ๅ†…ไฟก็š„ๅฝขๅผ้€š็Ÿฅ', - 'account.settings.notification.messages': '็ณป็ปŸๆถˆๆฏ', - 'account.settings.notification.messages-description': '็ณป็ปŸๆถˆๆฏๅฐ†ไปฅ็ซ™ๅ†…ไฟก็š„ๅฝขๅผ้€š็Ÿฅ', - 'account.settings.notification.todo': 'ๅพ…ๅŠžไปปๅŠก', - 'account.settings.notification.todo-description': 'ๅพ…ๅŠžไปปๅŠกๅฐ†ไปฅ็ซ™ๅ†…ไฟก็š„ๅฝขๅผ้€š็Ÿฅ', - 'account.settings.settings.open': 'ๅผ€', - 'account.settings.settings.close': 'ๅ…ณ', - 'trading-assistant.title': 'ไบคๆ˜“ๅŠฉๆ‰‹', - 'trading-assistant.strategyList': '็ญ–็•ฅๅˆ—่กจ', - 'trading-assistant.createStrategy': 'ๅˆ›ๅปบ็ญ–็•ฅ', - 'trading-assistant.noStrategy': 'ๆš‚ๆ— ็ญ–็•ฅ', - 'trading-assistant.selectStrategy': '่ฏทไปŽๅทฆไพง้€‰ๆ‹ฉไธ€ไธช็ญ–็•ฅๆŸฅ็œ‹่ฏฆๆƒ…', - 'trading-assistant.startStrategy': 'ๅฏๅŠจ็ญ–็•ฅ', - 'trading-assistant.stopStrategy': 'ๅœๆญข็ญ–็•ฅ', - 'trading-assistant.editStrategy': '็ผ–่พ‘็ญ–็•ฅ', - 'trading-assistant.deleteStrategy': 'ๅˆ ้™ค็ญ–็•ฅ', - 'trading-assistant.startAll': 'ๅ…จ้ƒจๅฏๅŠจ', - 'trading-assistant.stopAll': 'ๅ…จ้ƒจๅœๆญข', - 'trading-assistant.deleteAll': 'ๅ…จ้ƒจๅˆ ้™ค', - 'trading-assistant.symbolCount': 'ไธชๅธ็ง', - 'trading-assistant.strategyCount': 'ไธช็ญ–็•ฅ', - 'trading-assistant.groupBy': 'ๅˆ†็ป„ๆ–นๅผ', - 'trading-assistant.groupByStrategy': 'ๆŒ‰็ญ–็•ฅ', - 'trading-assistant.groupBySymbol': 'ๆŒ‰ๆ ‡็š„', - 'trading-assistant.timeframe': 'ๅ‘จๆœŸ', - 'trading-assistant.indicator': 'ๆŒ‡ๆ ‡', - 'trading-assistant.status.running': '่ฟ่กŒไธญ', - 'trading-assistant.status.stopped': 'ๅทฒๅœๆญข', - 'trading-assistant.status.error': '้”™่ฏฏ', - 'trading-assistant.strategyType.IndicatorStrategy': 'ๆŠ€ๆœฏๆŒ‡ๆ ‡็ญ–็•ฅ', - 'trading-assistant.strategyType.PromptBasedStrategy': 'ๆ็คบ่ฏ็ญ–็•ฅ', - 'trading-assistant.strategyType.GridStrategy': '็ฝ‘ๆ ผ็ญ–็•ฅ', - 'trading-assistant.tabs.tradingRecords': 'ไบคๆ˜“่ฎฐๅฝ•', - 'trading-assistant.tabs.positions': 'ๆŒไป“่ฎฐๅฝ•', - 'trading-assistant.tabs.equityCurve': 'ๅ‡€ๅ€ผๆ›ฒ็บฟ', - 'trading-assistant.form.step1': '้€‰ๆ‹ฉๆŒ‡ๆ ‡', - 'trading-assistant.form.step2': 'ไบคๆ˜“ๆ‰€้…็ฝฎ', - 'trading-assistant.form.step3': '็ญ–็•ฅๅ‚ๆ•ฐ', - 'trading-assistant.form.step2Params': '็ญ–็•ฅๅ‚ๆ•ฐ', - 'trading-assistant.form.step3Signal': 'ไฟกๅท้€š็Ÿฅ', - 'trading-assistant.form.simpleMode': '็ฎ€ๆ˜“ๆจกๅผ', - 'trading-assistant.form.advancedMode': '้ซ˜็บงๆจกๅผ', - 'trading-assistant.form.simpleModeHint': 'ๅฟซ้€Ÿๅˆ›ๅปบ็ญ–็•ฅ๏ผŒไฝฟ็”จๆŽจ่้ป˜่ฎคๅ‚ๆ•ฐ', - 'trading-assistant.form.advancedModeHint': '่‡ชๅฎšไน‰ๅ…จ้ƒจๅ‚ๆ•ฐ๏ผŒ้€‚ๅˆไธ“ไธš็”จๆˆท', - 'trading-assistant.form.simpleStep1': '้€‰ๆ‹ฉๆŒ‡ๆ ‡ & ไบคๆ˜“ๅฏน', - 'trading-assistant.form.simpleStep2': 'ๅฏๅŠจๆ–นๅผ', - 'trading-assistant.form.simpleDefaultsHint': '้ป˜่ฎคๅ‚ๆ•ฐ๏ผˆๅฏๅฑ•ๅผ€ไฟฎๆ”น๏ผ‰', - 'trading-assistant.form.showAdvancedSettings': 'ๅฑ•ๅผ€้ซ˜็บง่ฎพ็ฝฎ', - 'trading-assistant.form.hideAdvancedSettings': 'ๆ”ถ่ตท้ซ˜็บง่ฎพ็ฝฎ', - 'trading-assistant.form.indicator': '้€‰ๆ‹ฉๆŒ‡ๆ ‡', - 'trading-assistant.form.indicatorHint': 'ๅช่ƒฝ้€‰ๆ‹ฉๆ‚จๅทฒ่ดญไนฐๆˆ–ๅˆ›ๅปบ็š„ๆŠ€ๆœฏๆŒ‡ๆ ‡', - 'trading-assistant.form.qdtCostHints': 'ไฝฟ็”จ็ญ–็•ฅๅฐ†ๆถˆ่€—QDT๏ผŒ่ฏท็กฎไฟ่ดฆๆˆทๆœ‰่ถณๅคŸ็š„QDTไฝ™้ข', - 'trading-assistant.form.indicatorDescription': 'ๆŒ‡ๆ ‡ๆ่ฟฐ', - 'trading-assistant.form.noDescription': 'ๆš‚ๆ— ๆ่ฟฐ', - 'trading-assistant.form.indicatorParams': 'ๆŒ‡ๆ ‡ๅ‚ๆ•ฐ', - 'trading-assistant.form.indicatorParamsHint': '่ฟ™ไบ›ๅ‚ๆ•ฐไผšไผ ้€’็ป™ๆŒ‡ๆ ‡ไปฃ็ ๏ผŒไธๅŒ็ญ–็•ฅๅฏไปฅไฝฟ็”จไธๅŒ็š„ๅ‚ๆ•ฐๅ€ผ', - 'trading-assistant.form.exchange': '้€‰ๆ‹ฉไบคๆ˜“ๆ‰€', - 'trading-assistant.form.apiKey': 'API Key', - 'trading-assistant.form.secretKey': 'Secret Key', - 'trading-assistant.form.passphrase': 'Passphrase', - 'trading-assistant.form.testConnection': 'ๆต‹่ฏ•่ฟžๆŽฅ', - 'trading-assistant.form.strategyName': '็ญ–็•ฅๅ็งฐ', - 'trading-assistant.form.symbol': 'ไบคๆ˜“ๅฏน', - 'trading-assistant.form.symbols': 'ไบคๆ˜“ๅฏน๏ผˆๅคš้€‰๏ผ‰', - 'trading-assistant.form.symbolHint': '็›ฎๅ‰ไป…ๆ”ฏๆŒๅŠ ๅฏ†่ดงๅธไบคๆ˜“ๅฏน', - 'trading-assistant.form.symbolHintCrypto': 'ๅŠ ๅฏ†่ดงๅธ๏ผšไฝฟ็”จBTC/USDT็ญ‰ไบคๆ˜“ๅฏนๆ ผๅผ', - 'trading-assistant.form.symbolsHint': '้€‰ๆ‹ฉๅคšไธชไบคๆ˜“ๅฏน๏ผŒๅฐ†่‡ชๅŠจๅˆ›ๅปบๅคšไธช็ญ–็•ฅ', - 'trading-assistant.form.strategyType': '็ญ–็•ฅ็ฑปๅž‹', - 'trading-assistant.form.strategyTypeSingle': 'ๅ•ๆ ‡็š„็ญ–็•ฅ', - 'trading-assistant.form.strategyTypeCrossSectional': 'ๆˆช้ข็ญ–็•ฅ', - 'trading-assistant.form.strategyTypeHint': 'ๅ•ๆ ‡็š„็ญ–็•ฅ๏ผš้’ˆๅฏนๅ•ไธชๆ ‡็š„่ฟ›่กŒไบคๆ˜“๏ผ›ๆˆช้ข็ญ–็•ฅ๏ผšๅŒๆ—ถ็ฎก็†ๅคšไธชๆ ‡็š„็š„็ป„ๅˆ', - 'trading-assistant.form.symbolList': 'ๆ ‡็š„ๅˆ—่กจ', - 'trading-assistant.form.symbolListHint': '้€‰ๆ‹ฉๅคšไธชๆ ‡็š„๏ผŒ็ญ–็•ฅๅฐ†ๆ นๆฎๆŒ‡ๆ ‡่ฏ„ๅˆ†่ฟ›่กŒๆŽ’ๅบๅ’Œ่ฐƒไป“', - 'trading-assistant.form.portfolioSize': 'ๆŒไป“็ป„ๅˆๅคงๅฐ', - 'trading-assistant.form.portfolioSizeHint': '็ญ–็•ฅๅŒๆ—ถๆŒๆœ‰็š„ๆ ‡็š„ๆ•ฐ้‡', - 'trading-assistant.form.longRatio': 'ๅšๅคšๆฏ”ไพ‹', - 'trading-assistant.form.longRatioHint': 'ๆŒไป“ไธญๅšๅคšๆ ‡็š„็š„ๆฏ”ไพ‹๏ผˆ0-1๏ผ‰๏ผŒไพ‹ๅฆ‚0.5่กจ็คบ50%ๅšๅคš๏ผŒ50%ๅš็ฉบ', - 'trading-assistant.form.rebalanceFrequency': '่ฐƒไป“้ข‘็އ', - 'trading-assistant.form.rebalanceDaily': 'ๆฏๆ—ฅ', - 'trading-assistant.form.rebalanceWeekly': 'ๆฏๅ‘จ', - 'trading-assistant.form.rebalanceMonthly': 'ๆฏๆœˆ', - 'trading-assistant.form.rebalanceFrequencyHint': '็ญ–็•ฅ้‡ๆ–ฐ่ฐƒๆ•ดๆŒไป“็ป„ๅˆ็š„้ข‘็އ', - 'trading-assistant.form.addSymbol': 'ๆทปๅŠ ไบคๆ˜“ๅฏน', - 'trading-assistant.form.addSymbolTitle': 'ๆทปๅŠ ไบคๆ˜“ๅฏนๅˆฐ่‡ช้€‰ๅˆ—่กจ', - 'trading-assistant.form.searchSymbolPlaceholder': '่พ“ๅ…ฅไปฃ็ ๆœ็ดข๏ผŒๅฆ‚ BTCใ€AAPL', - 'trading-assistant.form.noSymbolFound': 'ๆœชๆ‰พๅˆฐๅŒน้…็š„ไบคๆ˜“ๅฏน', - 'trading-assistant.form.canDirectAdd': 'ๅฏไปฅ็›ดๆŽฅ่พ“ๅ…ฅไปฃ็ ๆทปๅŠ ', - 'trading-assistant.form.searchSymbolHint': '่พ“ๅ…ฅไปฃ็ ๆœ็ดขไบคๆ˜“ๅฏน', - 'trading-assistant.form.confirmAdd': '็กฎ่ฎคๆทปๅŠ ', - 'trading-assistant.form.addSymbolSuccess': 'ไบคๆ˜“ๅฏนๆทปๅŠ ๆˆๅŠŸ', - 'trading-assistant.form.addSymbolFailed': 'ๆทปๅŠ ๅคฑ่ดฅ๏ผŒ่ฏท้‡่ฏ•', - 'trading-assistant.form.pleaseSelectSymbol': '่ฏท้€‰ๆ‹ฉๆˆ–่พ“ๅ…ฅไบคๆ˜“ๅฏน', - 'trading-assistant.form.initialCapital': 'ๆŠ•ๅ…ฅ้‡‘้ข', - 'trading-assistant.form.marketType': 'ๅธ‚ๅœบ็ฑปๅž‹', - 'trading-assistant.form.marketTypeFutures': 'ๅˆ็บฆ', - 'trading-assistant.form.marketTypeSpot': '็Žฐ่ดง', - 'trading-assistant.form.marketTypeHint': 'ๅˆ็บฆๆ”ฏๆŒๅŒๅ‘ไบคๆ˜“ๅ’Œๆ ๆ†๏ผŒ็Žฐ่ดงไป…ๆ”ฏๆŒๅšๅคšไธ”ๆ ๆ†ๅ›บๅฎšไธบ1ๅ€', - 'trading-assistant.form.leverage': 'ๆ ๆ†ๅ€ๆ•ฐ', - 'trading-assistant.form.leverageHint': 'ๅˆ็บฆ๏ผš1-125ๅ€๏ผŒ็Žฐ่ดง๏ผšๅ›บๅฎš1ๅ€', - 'trading-assistant.form.spotLeverageFixed': '็Žฐ่ดงไบคๆ˜“ๆ ๆ†ๅ›บๅฎšไธบ1ๅ€', - 'trading-assistant.form.spotOnlyLongHint': '็Žฐ่ดงไบคๆ˜“ไป…ๆ”ฏๆŒๅšๅคš', - 'trading-assistant.form.tradeDirection': 'ไบคๆ˜“ๆ–นๅ‘', - 'trading-assistant.form.tradeDirectionLong': 'ไป…ๅšๅคš', - 'trading-assistant.form.tradeDirectionShort': 'ไป…ๅš็ฉบ', - 'trading-assistant.form.tradeDirectionBoth': 'ๅŒๅ‘ไบคๆ˜“', - 'trading-assistant.form.timeframe': 'ๆ—ถ้—ดๅ‘จๆœŸ', - 'trading-assistant.form.klinePeriod': 'K็บฟๅ‘จๆœŸ', - 'trading-assistant.form.timeframe1m': '1ๅˆ†้’Ÿ', - 'trading-assistant.form.timeframe5m': '5ๅˆ†้’Ÿ', - 'trading-assistant.form.timeframe15m': '15ๅˆ†้’Ÿ', - 'trading-assistant.form.timeframe30m': '30ๅˆ†้’Ÿ', - 'trading-assistant.form.timeframe1H': '1ๅฐๆ—ถ', - 'trading-assistant.form.timeframe4H': '4ๅฐๆ—ถ', - 'trading-assistant.form.timeframe1D': '1ๅคฉ', - 'trading-assistant.form.selectStrategyType': '้€‰ๆ‹ฉ็ญ–็•ฅ็ฑปๅž‹', - 'trading-assistant.form.indicatorStrategy': 'ๆŒ‡ๆ ‡็ญ–็•ฅ', - 'trading-assistant.form.indicatorStrategyDesc': 'ๅŸบไบŽๆŠ€ๆœฏๆŒ‡ๆ ‡็š„่‡ชๅŠจๅŒ–ไบคๆ˜“็ญ–็•ฅ', - 'trading-assistant.form.aiStrategy': 'AI็ญ–็•ฅ', - 'trading-assistant.form.aiStrategyDesc': 'ๅŸบไบŽAIๆ™บ่ƒฝๅ†ณ็ญ–็š„่‡ชๅŠจๅŒ–ไบคๆ˜“็ญ–็•ฅ', - 'trading-assistant.form.enableAiFilter': 'ๅฏ็”จAIๆ™บ่ƒฝๅ†ณ็ญ–่ฟ‡ๆปค', - 'trading-assistant.form.enableAiFilterHint': 'ๅฏ็”จๅŽ๏ผŒๆŒ‡ๆ ‡ไฟกๅทๅฐ†็ป่ฟ‡AIๆ™บ่ƒฝ่ฟ‡ๆปค๏ผŒๆ้ซ˜ไบคๆ˜“่ดจ้‡', - 'trading-assistant.form.aiFilterPrompt': '่‡ชๅฎšไน‰ๆ็คบ่ฏ', - 'trading-assistant.form.aiFilterPromptHint': 'ไธบAI่ฟ‡ๆปคๆไพ›่‡ชๅฎšไน‰ๆŒ‡ไปค๏ผŒ็•™็ฉบๅˆ™ไฝฟ็”จ็ณป็ปŸ้ป˜่ฎค', - 'trading-assistant.form.executionMode': 'ๆ‰ง่กŒๆจกๅผ', - 'trading-assistant.form.executionModeSignal': 'ไป…ไฟกๅท้€š็Ÿฅ', - 'trading-assistant.form.executionModeLive': 'ๅฎž็›˜่‡ชๅŠจไบคๆ˜“', - 'trading-assistant.form.liveTradingCryptoOnlyHint': 'ๅฎž็›˜ไบคๆ˜“ๅŠŸ่ƒฝไป…ๆ”ฏๆŒๅŠ ๅฏ†่ดงๅธๅธ‚ๅœบ', - 'trading-assistant.form.liveTradingNotSupportedHint': 'ๅฝ“ๅ‰ๅธ‚ๅœบไธๆ”ฏๆŒๅฎž็›˜ไบคๆ˜“', - 'trading-assistant.form.broker': 'ๅˆธๅ•†', - 'trading-assistant.form.localDeploymentRequired': 'โš ๏ธ ้œ€่ฆๆœฌๅœฐ้ƒจ็ฝฒ่ฟ่กŒ', - 'trading-assistant.form.localDeploymentHint': 'IBKR ๅ’Œ MT5 ๅฑžไบŽๅค–ๆŒ‚็ฑปๅฎž็›˜ๆŽฅๅฃ๏ผŒ้œ€่ฆๆœฌๅœฐ้ƒจ็ฝฒ่ฟ่กŒ QuantDinger๏ผŒไธๆ”ฏๆŒไบ‘็ซฏ SaaS ๆจกๅผใ€‚่ฏท็กฎไฟๆ‚จๅทฒๅœจๆœฌๅœฐๅฎ‰่ฃ…ๅนถ้…็ฝฎ็›ธๅ…ณไบคๆ˜“่ฝฏไปถ๏ผˆTWS/IB Gateway ๆˆ– MT5 ็ปˆ็ซฏ๏ผ‰ใ€‚', - 'trading-assistant.form.ibkrConnectionTitle': '็›ˆ้€่ฏๅˆธ่ฟžๆŽฅ้…็ฝฎ', - 'trading-assistant.form.ibkrConnectionHint': '่ฏท็กฎไฟ TWS ๆˆ– IB Gateway ๅทฒๅฏๅŠจๅนถๅฏ็”จ API ่ฟžๆŽฅ', - 'trading-assistant.validation.brokerRequired': '่ฏท้€‰ๆ‹ฉๅˆธๅ•†', - 'trading-assistant.placeholders.selectBroker': '้€‰ๆ‹ฉๅˆธๅ•†', - 'trading-assistant.brokerNames': { - 'ibkr': '็›ˆ้€่ฏๅˆธ (Interactive Brokers)', - 'mt5': 'MetaTrader 5 (MT5)', - 'mt4': 'MetaTrader 4 (MT4)', - 'futu': 'ๅฏŒ้€”่ฏๅˆธ (Futu)', - 'tiger': '่€่™Ž่ฏๅˆธ (Tiger Brokers)', - 'td': 'TD Ameritrade', - 'schwab': 'Charles Schwab' - }, - 'trading-assistant.form.ibkrHost': 'ไธปๆœบๅœฐๅ€', - 'trading-assistant.form.ibkrPort': '็ซฏๅฃ', - 'trading-assistant.form.ibkrPortHint': 'TWSๅฎž็›˜:7497, TWSๆจกๆ‹Ÿ:7496, Gatewayๅฎž็›˜:4001, Gatewayๆจกๆ‹Ÿ:4002', - 'trading-assistant.form.ibkrClientId': 'ๅฎขๆˆท็ซฏID', - 'trading-assistant.form.ibkrAccount': '่ดฆๆˆทๅท', - 'trading-assistant.form.ibkrAccountHint': '็•™็ฉบ่‡ชๅŠจ้€‰ๆ‹ฉ็ฌฌไธ€ไธช่ดฆๆˆท๏ผŒๅคš่ดฆๆˆท็”จๆˆทๅฏๆŒ‡ๅฎš่ดฆๆˆทๅท', - 'trading-assistant.placeholders.ibkrAccount': 'ๅฏ้€‰๏ผŒๅฆ‚ U1234567', - 'trading-assistant.exchange.ibkrConnectionSuccess': '็›ˆ้€่ฏๅˆธ่ฟžๆŽฅๆˆๅŠŸ', - 'trading-assistant.exchange.ibkrConnectionFailed': '็›ˆ้€่ฏๅˆธ่ฟžๆŽฅๅคฑ่ดฅ๏ผŒ่ฏทๆฃ€ๆŸฅ TWS/Gateway ๆ˜ฏๅฆ่ฟ่กŒ', - 'trading-assistant.exchange.checkLocalDeployment': '่ฏท็กฎ่ฎคๆ‚จๅทฒๅœจๆœฌๅœฐ้ƒจ็ฝฒ่ฟ่กŒ๏ผŒไบ‘็ซฏ SaaS ไธๆ”ฏๆŒๆญค็ฑปๅค–ๆŒ‚ๅฎž็›˜', - // MT5/Forex ้…็ฝฎ - 'trading-assistant.form.forexBroker': 'ๅค–ๆฑ‡ๅˆธๅ•†', - 'trading-assistant.form.mt5ConnectionTitle': 'MetaTrader 5 ่ฟžๆŽฅ้…็ฝฎ', - 'trading-assistant.form.mt5ConnectionHint': '่ฏท็กฎไฟ MT5 ็ปˆ็ซฏๅทฒๅฏๅŠจๅนถ็™ปๅฝ•๏ผˆไป…ๆ”ฏๆŒ Windows๏ผ‰', - 'trading-assistant.form.mt5Server': 'ๆœๅŠกๅ™จ', - 'trading-assistant.form.mt5ServerHint': 'ๅˆธๅ•†ๆœๅŠกๅ™จๅ็งฐ๏ผˆๅฆ‚๏ผšICMarkets-Demo๏ผ‰', - 'trading-assistant.form.mt5Login': '่ดฆๆˆทๅท', - 'trading-assistant.form.mt5Password': 'ๅฏ†็ ', - 'trading-assistant.form.mt5TerminalPath': 'MT5 ็ปˆ็ซฏ่ทฏๅพ„๏ผˆๅฏ้€‰๏ผ‰', - 'trading-assistant.form.mt5TerminalPathHint': 'ๅฆ‚ๆžœ MT5 ็ปˆ็ซฏๆœชๅฎ‰่ฃ…ๅœจ้ป˜่ฎคไฝ็ฝฎ๏ผŒ่ฏทๆŒ‡ๅฎš terminal64.exe ็š„ๅฎŒๆ•ด่ทฏๅพ„๏ผˆไพ‹ๅฆ‚๏ผšC:\\Program Files\\MetaTrader 5\\terminal64.exe๏ผ‰', - 'trading-assistant.placeholders.mt5Server': 'ไพ‹ๅฆ‚๏ผšICMarkets-Demo', - 'trading-assistant.placeholders.mt5Login': 'ไพ‹ๅฆ‚๏ผš12345678', - 'trading-assistant.placeholders.mt5Password': 'ๆ‚จ็š„ MT5 ๅฏ†็ ', - 'trading-assistant.placeholders.mt5TerminalPath': 'ไพ‹ๅฆ‚๏ผšC:\\Program Files\\MetaTrader 5\\terminal64.exe', - 'trading-assistant.validation.mt5ServerRequired': '่ฏท่พ“ๅ…ฅ MT5 ๆœๅŠกๅ™จ', - 'trading-assistant.validation.mt5LoginRequired': '่ฏท่พ“ๅ…ฅ MT5 ่ดฆๆˆทๅท', - 'trading-assistant.validation.mt5PasswordRequired': '่ฏท่พ“ๅ…ฅ MT5 ๅฏ†็ ', - 'trading-assistant.validation.portfolioSizeRequired': '่ฏท่พ“ๅ…ฅๆŒไป“็ป„ๅˆๅคงๅฐ', - 'trading-assistant.validation.longRatioRequired': '่ฏท่พ“ๅ…ฅๅšๅคšๆฏ”ไพ‹', - 'trading-assistant.exchange.mt5ConnectionSuccess': 'MT5 ่ฟžๆŽฅๆˆๅŠŸ', - 'trading-assistant.exchange.mt5ConnectionFailed': 'MT5 ่ฟžๆŽฅๅคฑ่ดฅ๏ผŒ่ฏทๆฃ€ๆŸฅ็ปˆ็ซฏๆ˜ฏๅฆ่ฟ่กŒ', - 'trading-assistant.form.notifyChannels': '้€š็Ÿฅๆธ ้“', - 'trading-assistant.form.notifyChannelsHint': '้€‰ๆ‹ฉไฟกๅท่งฆๅ‘ๆ—ถ็š„้€š็Ÿฅๆ–นๅผ', - 'trading-assistant.form.notifyEmail': '้‚ฎ็ฎฑๅœฐๅ€', - 'trading-assistant.form.notifyPhone': 'ๆ‰‹ๆœบๅท็ ', - 'trading-assistant.form.notifyTelegram': 'Telegram ID', - 'trading-assistant.form.notifyDiscord': 'Discord Webhook', - 'trading-assistant.form.notifyWebhook': 'Webhook ๅœฐๅ€', - 'trading-assistant.form.liveTradingConfigTitle': 'ๅฎž็›˜ไบคๆ˜“้…็ฝฎ', - 'trading-assistant.form.liveTradingConfigHint': '่ฏทๅกซๅ†™ไบคๆ˜“ๆ‰€APIไฟกๆฏ๏ผŒๅฎž็›˜ไบคๆ˜“ๅฐ†ไฝฟ็”จๆ‚จ็š„API่ฟ›่กŒ็œŸๅฎžไบคๆ˜“', - 'trading-assistant.form.savedCredential': 'ๅทฒไฟๅญ˜็š„ๅ‡ญ่ฏ', - 'trading-assistant.form.savedCredentialHint': '้€‰ๆ‹ฉๅทฒไฟๅญ˜็š„ไบคๆ˜“ๆ‰€ๅ‡ญ่ฏ๏ผŒ่‡ชๅŠจๅกซๅ……API้…็ฝฎ', - 'trading-assistant.form.saveCredential': 'ไฟๅญ˜ๆญคๅ‡ญ่ฏไปฅไพฟไธ‹ๆฌกไฝฟ็”จ', - 'trading-assistant.form.credentialName': 'ๅ‡ญ่ฏๅ็งฐ', - 'trading-assistant.validation.strategyTypeRequired': '่ฏท้€‰ๆ‹ฉ็ญ–็•ฅ็ฑปๅž‹', - 'trading-assistant.form.advancedSettings': '้ซ˜็บง่ฎพ็ฝฎ', - 'trading-assistant.form.orderMode': 'ไธ‹ๅ•ๆจกๅผ', - 'trading-assistant.form.orderModeMaker': 'ๆŒ‚ๅ•๏ผˆMaker๏ผ‰', - 'trading-assistant.form.orderModeTaker': 'ๅธ‚ไปท๏ผˆTaker๏ผ‰', - 'trading-assistant.form.orderModeHint': 'ๆŒ‚ๅ•ๆจกๅผไฝฟ็”จ้™ไปทๅ•๏ผŒๆ‰‹็ปญ่ดนๆ›ดไฝŽ๏ผ›ๅธ‚ไปทๆจกๅผ็ซ‹ๅณๆˆไบค๏ผŒๆ‰‹็ปญ่ดน่พƒ้ซ˜', - 'trading-assistant.form.makerWaitSec': 'ๆŒ‚ๅ•็ญ‰ๅพ…ๆ—ถ้—ด๏ผˆ็ง’๏ผ‰', - 'trading-assistant.form.makerWaitSecHint': 'ๆŒ‚ๅ•ๅŽ็ญ‰ๅพ…ๆˆไบค็š„ๆ—ถ้—ด๏ผŒ่ถ…ๆ—ถๅŽๅ–ๆถˆๅนถ้‡่ฏ•', - 'trading-assistant.form.makerRetries': 'ๆŒ‚ๅ•้‡่ฏ•ๆฌกๆ•ฐ', - 'trading-assistant.form.makerRetriesHint': 'ๆŒ‚ๅ•ๆœชๆˆไบคๆ—ถ็š„ๆœ€ๅคง้‡่ฏ•ๆฌกๆ•ฐ', - 'trading-assistant.form.fallbackToMarket': 'ๆŒ‚ๅ•ๅคฑ่ดฅ้™็บงๅธ‚ไปท', - 'trading-assistant.form.fallbackToMarketHint': 'ๅผ€/ๅนณไป“ๆŒ‚ๅ•ๆœชๆˆไบคๆ—ถ๏ผŒๆ˜ฏๅฆ้™็บงไธบๅธ‚ไปทๅ•ไปฅ็กฎไฟๆˆไบค', - 'trading-assistant.form.marginMode': 'ไฟ่ฏ้‡‘ๆจกๅผ', - 'trading-assistant.form.marginModeCross': 'ๅ…จไป“', - 'trading-assistant.form.marginModeIsolated': '้€ไป“', - 'trading-assistant.form.stopLossPct': 'ๆญขๆŸๆฏ”ไพ‹๏ผˆ%๏ผ‰', - 'trading-assistant.form.stopLossPctHint': '่ฎพ็ฝฎๆญขๆŸ็™พๅˆ†ๆฏ”๏ผŒ0่กจ็คบไธๅฏ็”จๆญขๆŸ', - 'trading-assistant.form.takeProfitPct': 'ๆญข็›ˆๆฏ”ไพ‹๏ผˆ%๏ผ‰', - 'trading-assistant.form.takeProfitPctHint': '่ฎพ็ฝฎๆญข็›ˆ็™พๅˆ†ๆฏ”๏ผŒ0่กจ็คบไธๅฏ็”จๆญข็›ˆ', - 'trading-assistant.form.signalMode': 'ไฟกๅทๆจกๅผ', - 'trading-assistant.form.signalModeConfirmed': '็กฎ่ฎคๆจกๅผ', - 'trading-assistant.form.signalModeAggressive': 'ๆฟ€่ฟ›ๆจกๅผ', - 'trading-assistant.form.signalModeHint': '็กฎ่ฎคๆจกๅผ๏ผšไป…ๆฃ€ๆŸฅๅทฒๅฎŒๆˆ็š„K็บฟ๏ผ›ๆฟ€่ฟ›ๆจกๅผ๏ผšไนŸๆฃ€ๆŸฅๆญฃๅœจๅฝขๆˆ็š„K็บฟ', - 'trading-assistant.form.cancel': 'ๅ–ๆถˆ', - 'trading-assistant.form.prev': 'ไธŠไธ€ๆญฅ', - 'trading-assistant.form.next': 'ไธ‹ไธ€ๆญฅ', - 'trading-assistant.form.confirmCreate': '็กฎ่ฎคๅˆ›ๅปบ', - 'trading-assistant.form.confirmEdit': '็กฎ่ฎคไฟฎๆ”น', - 'trading-assistant.messages.createSuccess': '็ญ–็•ฅๅˆ›ๅปบๆˆๅŠŸ', - 'trading-assistant.messages.createFailed': 'ๅˆ›ๅปบ็ญ–็•ฅๅคฑ่ดฅ', - 'trading-assistant.messages.updateSuccess': '็ญ–็•ฅๆ›ดๆ–ฐๆˆๅŠŸ', - 'trading-assistant.messages.updateFailed': 'ๆ›ดๆ–ฐ็ญ–็•ฅๅคฑ่ดฅ', - 'trading-assistant.messages.deleteSuccess': '็ญ–็•ฅๅˆ ้™คๆˆๅŠŸ', - 'trading-assistant.messages.deleteFailed': 'ๅˆ ้™ค็ญ–็•ฅๅคฑ่ดฅ', - 'trading-assistant.messages.startSuccess': '็ญ–็•ฅๅฏๅŠจๆˆๅŠŸ', - 'trading-assistant.messages.startFailed': 'ๅฏๅŠจ็ญ–็•ฅๅคฑ่ดฅ', - 'trading-assistant.messages.stopSuccess': '็ญ–็•ฅๅœๆญขๆˆๅŠŸ', - 'trading-assistant.messages.stopFailed': 'ๅœๆญข็ญ–็•ฅๅคฑ่ดฅ', - 'trading-assistant.messages.loadFailed': '่Žทๅ–็ญ–็•ฅๅˆ—่กจๅคฑ่ดฅ', - 'trading-assistant.messages.runningWarning': '็ญ–็•ฅ่ฟ่กŒไธญ๏ผŒ่ฏทๅ…ˆๅœๆญข็ญ–็•ฅๅŽๅ†ไฟฎๆ”น', - 'trading-assistant.messages.deleteConfirmWithName': '็กฎๅฎš่ฆๅˆ ้™ค็ญ–็•ฅโ€œ{name}โ€ๅ—๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅคใ€‚', - 'trading-assistant.messages.deleteConfirm': '็กฎๅฎš่ฆๅˆ ้™ค่ฏฅ็ญ–็•ฅๅ—๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅคใ€‚', - 'trading-assistant.messages.loadTradesFailed': '่Žทๅ–ไบคๆ˜“่ฎฐๅฝ•ๅคฑ่ดฅ', - 'trading-assistant.messages.loadPositionsFailed': '่Žทๅ–ๆŒไป“่ฎฐๅฝ•ๅคฑ่ดฅ', - 'trading-assistant.messages.loadEquityFailed': '่Žทๅ–ๅ‡€ๅ€ผๆ›ฒ็บฟๅคฑ่ดฅ', - 'trading-assistant.messages.loadIndicatorsFailed': 'ๅŠ ่ฝฝๆŒ‡ๆ ‡ๅˆ—่กจๅคฑ่ดฅ๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'trading-assistant.messages.spotLimitations': '็Žฐ่ดงไบคๆ˜“ๅทฒ่‡ชๅŠจ่ฎพ็ฝฎไธบไป…ๅšๅคšใ€1ๅ€ๆ ๆ†', - 'trading-assistant.messages.autoFillApiConfig': 'ๅทฒ่‡ชๅŠจๅกซๅ……่ฏฅไบคๆ˜“ๆ‰€็š„ๅކๅฒAPI้…็ฝฎ', - 'trading-assistant.messages.batchCreateSuccess': 'ๆˆๅŠŸๅˆ›ๅปบ {count} ไธช็ญ–็•ฅ', - 'trading-assistant.messages.batchStartSuccess': 'ๆˆๅŠŸๅฏๅŠจ {count} ไธช็ญ–็•ฅ', - 'trading-assistant.messages.batchStartFailed': 'ๆ‰น้‡ๅฏๅŠจ็ญ–็•ฅๅคฑ่ดฅ', - 'trading-assistant.messages.batchStopSuccess': 'ๆˆๅŠŸๅœๆญข {count} ไธช็ญ–็•ฅ', - 'trading-assistant.messages.batchStopFailed': 'ๆ‰น้‡ๅœๆญข็ญ–็•ฅๅคฑ่ดฅ', - 'trading-assistant.messages.batchDeleteSuccess': 'ๆˆๅŠŸๅˆ ้™ค {count} ไธช็ญ–็•ฅ', - 'trading-assistant.messages.batchDeleteFailed': 'ๆ‰น้‡ๅˆ ้™ค็ญ–็•ฅๅคฑ่ดฅ', - 'trading-assistant.messages.batchDeleteConfirm': '็กฎๅฎš่ฆๅˆ ้™ค็ญ–็•ฅ็ป„"{name}"ไธ‹็š„ {count} ไธช็ญ–็•ฅๅ—๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅคใ€‚', - 'trading-assistant.notify.browser': 'ๆต่งˆๅ™จ้€š็Ÿฅ', - 'trading-assistant.notify.email': '้‚ฎ็ฎฑ', - 'trading-assistant.notify.phone': '็Ÿญไฟก', - 'trading-assistant.notify.telegram': 'Telegram', - 'trading-assistant.notify.discord': 'Discord', - 'trading-assistant.notify.webhook': 'Webhook', - 'trading-assistant.placeholders.selectIndicator': '่ฏท้€‰ๆ‹ฉๆŒ‡ๆ ‡', - 'trading-assistant.placeholders.selectExchange': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๆ‰€', - 'trading-assistant.placeholders.inputApiKey': '่ฏท่พ“ๅ…ฅAPI Key', - 'trading-assistant.placeholders.inputSecretKey': '่ฏท่พ“ๅ…ฅSecret Key', - 'trading-assistant.placeholders.inputPassphrase': '่ฏท่พ“ๅ…ฅPassphrase', - 'trading-assistant.placeholders.inputStrategyName': '่ฏท่พ“ๅ…ฅ็ญ–็•ฅๅ็งฐ', - 'trading-assistant.placeholders.selectSymbol': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๅฏน', - 'trading-assistant.placeholders.selectSymbols': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๅฏน๏ผˆๆ”ฏๆŒๅคš้€‰๏ผ‰', - 'trading-assistant.placeholders.selectTimeframe': '่ฏท้€‰ๆ‹ฉๆ—ถ้—ดๅ‘จๆœŸ', - 'trading-assistant.placeholders.selectKlinePeriod': '่ฏท้€‰ๆ‹ฉK็บฟๅ‘จๆœŸ', - 'trading-assistant.placeholders.inputAiFilterPrompt': '่ฏท่พ“ๅ…ฅ่‡ชๅฎšไน‰ๆ็คบ่ฏ๏ผˆๅฏ้€‰๏ผ‰', - 'trading-assistant.placeholders.selectSavedCredential': '่ฏท้€‰ๆ‹ฉๅทฒไฟๅญ˜็š„ๅ‡ญ่ฏ', - 'trading-assistant.placeholders.inputEmail': '่ฏท่พ“ๅ…ฅ้‚ฎ็ฎฑๅœฐๅ€', - 'trading-assistant.placeholders.inputPhone': '่ฏท่พ“ๅ…ฅๆ‰‹ๆœบๅท็ ', - 'trading-assistant.placeholders.inputTelegram': '่ฏท่พ“ๅ…ฅTelegram IDๆˆ–Chat ID', - 'trading-assistant.placeholders.inputDiscord': '่ฏท่พ“ๅ…ฅDiscord Webhookๅœฐๅ€', - 'trading-assistant.placeholders.inputWebhook': '่ฏท่พ“ๅ…ฅWebhookๅœฐๅ€', - 'trading-assistant.placeholders.inputCredentialName': '่ฏท่พ“ๅ…ฅๅ‡ญ่ฏๅ็งฐ๏ผˆๅฆ‚๏ผšๆˆ‘็š„OKX่ดฆๆˆท๏ผ‰', - 'trading-assistant.validation.indicatorRequired': '่ฏท้€‰ๆ‹ฉๆŒ‡ๆ ‡', - 'trading-assistant.validation.exchangeRequired': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๆ‰€', - 'trading-assistant.validation.apiKeyRequired': '่ฏท่พ“ๅ…ฅAPI Key', - 'trading-assistant.validation.secretKeyRequired': '่ฏท่พ“ๅ…ฅSecret Key', - 'trading-assistant.validation.passphraseRequired': '่ฏท่พ“ๅ…ฅPassphrase', - 'trading-assistant.validation.exchangeConfigIncomplete': '่ฏทๅกซๅ†™ๅฎŒๆ•ด็š„ไบคๆ˜“ๆ‰€้…็ฝฎไฟกๆฏ', - 'trading-assistant.validation.testConnectionRequired': '่ฏทๅ…ˆ็‚นๅ‡ป"ๆต‹่ฏ•่ฟžๆŽฅ"ๆŒ‰้’ฎๅนถ็กฎไฟ่ฟžๆŽฅๆˆๅŠŸ', - 'trading-assistant.validation.testConnectionFailed': '่ฟžๆŽฅๆต‹่ฏ•ๅคฑ่ดฅ๏ผŒ่ฏทๆฃ€ๆŸฅ้…็ฝฎๅŽ้‡ๆ–ฐๆต‹่ฏ•', - 'trading-assistant.validation.strategyNameRequired': '่ฏท่พ“ๅ…ฅ็ญ–็•ฅๅ็งฐ', - 'trading-assistant.validation.symbolRequired': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๅฏน', - 'trading-assistant.validation.symbolsRequired': '่ฏท่‡ณๅฐ‘้€‰ๆ‹ฉไธ€ไธชไบคๆ˜“ๅฏน', - 'trading-assistant.validation.emailInvalid': '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆ็š„้‚ฎ็ฎฑๅœฐๅ€', - 'trading-assistant.validation.notifyChannelRequired': '่ฏท่‡ณๅฐ‘้€‰ๆ‹ฉไธ€ไธช้€š็Ÿฅๆธ ้“', - 'trading-assistant.validation.initialCapitalRequired': '่ฏท่พ“ๅ…ฅๆŠ•ๅ…ฅ้‡‘้ข', - 'trading-assistant.validation.leverageRequired': '่ฏท่พ“ๅ…ฅๆ ๆ†ๅ€ๆ•ฐ', - 'trading-assistant.table.time': 'ๆ—ถ้—ด', - 'trading-assistant.table.type': '็ฑปๅž‹', - 'trading-assistant.table.price': 'ไปทๆ ผ', - 'trading-assistant.table.amount': 'ๆ•ฐ้‡', - 'trading-assistant.table.value': '้‡‘้ข', - 'trading-assistant.table.commission': 'ๆ‰‹็ปญ่ดน', - 'trading-assistant.table.symbol': 'ไบคๆ˜“ๅฏน', - 'trading-assistant.table.side': 'ๆ–นๅ‘', - 'trading-assistant.table.size': 'ๆŒไป“ๆ•ฐ้‡', - 'trading-assistant.table.entryPrice': 'ๅผ€ไป“ไปทๆ ผ', - 'trading-assistant.table.currentPrice': 'ๅฝ“ๅ‰ไปทๆ ผ', - 'trading-assistant.table.unrealizedPnl': 'ๆœชๅฎž็Žฐ็›ˆไบ', - 'trading-assistant.table.pnlPercent': '็›ˆไบๆฏ”ไพ‹', - 'trading-assistant.table.buy': 'ไนฐๅ…ฅ', - 'trading-assistant.table.sell': 'ๅ–ๅ‡บ', - 'trading-assistant.table.long': 'ๅšๅคš', - 'trading-assistant.table.short': 'ๅš็ฉบ', - 'trading-assistant.table.noPositions': 'ๆš‚ๆ— ๆŒไป“', - 'trading-assistant.detail.title': '็ญ–็•ฅ่ฏฆๆƒ…', - 'trading-assistant.detail.strategyName': '็ญ–็•ฅๅ็งฐ', - 'trading-assistant.detail.strategyType': '็ญ–็•ฅ็ฑปๅž‹', - 'trading-assistant.detail.status': '็Šถๆ€', - 'trading-assistant.detail.tradingMode': 'ไบคๆ˜“ๆจกๅผ', - 'trading-assistant.detail.exchange': 'ไบคๆ˜“ๆ‰€', - 'trading-assistant.detail.initialCapital': 'ๅˆๅง‹่ต„้‡‘', - 'trading-assistant.detail.totalInvestment': 'ๆ€ปๆŠ•ๅ…ฅ้‡‘้ข', - 'trading-assistant.detail.currentEquity': 'ๅฝ“ๅ‰ๅ‡€ๅ€ผ', - 'trading-assistant.detail.totalPnl': 'ๆ€ป็›ˆไบ', - 'trading-assistant.detail.indicatorName': 'ๆŒ‡ๆ ‡ๅ็งฐ', - 'trading-assistant.detail.maxLeverage': 'ๆœ€ๅคงๆ ๆ†', - 'trading-assistant.detail.decideInterval': 'ๅ†ณ็ญ–้—ด้š”', - 'trading-assistant.detail.symbols': 'ไบคๆ˜“ๆ ‡็š„', - 'trading-assistant.detail.createdAt': 'ๅˆ›ๅปบๆ—ถ้—ด', - 'trading-assistant.detail.updatedAt': 'ๆ›ดๆ–ฐๆ—ถ้—ด', - 'trading-assistant.detail.llmConfig': 'AIๆจกๅž‹้…็ฝฎ', - 'trading-assistant.detail.exchangeConfig': 'ไบคๆ˜“ๆ‰€้…็ฝฎ', - 'trading-assistant.detail.provider': 'ๆไพ›ๅ•†', - 'trading-assistant.detail.modelId': 'ๆจกๅž‹ID', - 'trading-assistant.detail.close': 'ๅ…ณ้—ญ', - 'trading-assistant.detail.loadFailed': '่Žทๅ–็ญ–็•ฅ่ฏฆๆƒ…ๅคฑ่ดฅ', - 'trading-assistant.equity.noData': 'ๆš‚ๆ— ๅ‡€ๅ€ผๆ•ฐๆฎ', - 'trading-assistant.equity.equity': 'ๅ‡€ๅ€ผ', - 'trading-assistant.exchange.tradingMode': 'ไบคๆ˜“ๆจกๅผ', - 'trading-assistant.exchange.virtual': 'ๆจกๆ‹Ÿไบคๆ˜“', - 'trading-assistant.exchange.live': 'ๅฎž็›˜ไบคๆ˜“', - 'trading-assistant.exchange.selectExchange': '้€‰ๆ‹ฉไบคๆ˜“ๆ‰€', - 'trading-assistant.exchange.walletAddress': '้’ฑๅŒ…ๅœฐๅ€', - 'trading-assistant.exchange.walletAddressPlaceholder': '่ฏท่พ“ๅ…ฅ้’ฑๅŒ…ๅœฐๅ€๏ผˆไปฅ0xๅผ€ๅคด๏ผ‰', - 'trading-assistant.exchange.privateKey': '็ง้’ฅ', - 'trading-assistant.exchange.privateKeyPlaceholder': '่ฏท่พ“ๅ…ฅ็ง้’ฅ๏ผˆ64ๅญ—็ฌฆ๏ผ‰', - 'trading-assistant.exchange.testConnection': 'ๆต‹่ฏ•่ฟžๆŽฅ', - 'trading-assistant.exchange.connectionSuccess': '่ฟžๆŽฅๆˆๅŠŸ', - 'trading-assistant.exchange.connectionFailed': '่ฟžๆŽฅๅคฑ่ดฅ', - 'trading-assistant.exchange.testFailed': '่ฟžๆŽฅๆต‹่ฏ•ๅคฑ่ดฅ', - 'trading-assistant.exchange.fillComplete': '่ฏทๅกซๅ†™ๅฎŒๆ•ด็š„ไบคๆ˜“ๆ‰€้…็ฝฎไฟกๆฏ', - 'trading-assistant.exchange.ipWhitelistTip': '่ฏทๅœจไบคๆ˜“ๆ‰€API่ฎพ็ฝฎไธญๅฐ†ไปฅไธ‹IPๆทปๅŠ ๅˆฐ็™ฝๅๅ•๏ผš', - 'trading-assistant.strategyTypeOptions.ai': 'AI้ฉฑๅŠจ็ญ–็•ฅ', - 'trading-assistant.strategyTypeOptions.indicator': 'ๆŠ€ๆœฏๆŒ‡ๆ ‡็ญ–็•ฅ', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI้ฉฑๅŠจ็ญ–็•ฅๅŠŸ่ƒฝๅผ€ๅ‘ไธญ๏ผŒๆ•ฌ่ฏทๆœŸๅพ…', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI้ฉฑๅŠจ็ญ–็•ฅๅŠŸ่ƒฝๆญฃๅœจๅผ€ๅ‘ไธญ', - 'trading-assistant.indicatorType.trend': '่ถ‹ๅŠฟ', - 'trading-assistant.indicatorType.momentum': 'ๅŠจ้‡', - 'trading-assistant.indicatorType.volatility': 'ๆณขๅŠจ', - 'trading-assistant.indicatorType.volume': 'ๆˆไบค้‡', - 'trading-assistant.indicatorType.custom': '่‡ชๅฎšไน‰', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'ๅธๅฎ‰', - 'hyperliquid': 'Hyperliquid', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Gate.io', - 'mexc': 'MEXC', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': '็ซๅธ', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Deribit', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Bitstamp', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Gemini', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Upbit', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBank', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX US', - 'binanceus': 'Binance US', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDโ“ˆ-M', - 'ibkr': '็›ˆ้€่ฏๅˆธ (IBKR)', - 'deepcoin': 'Deepcoin' - }, - 'ai-trading-assistant.title': 'AIไบคๆ˜“ๅŠฉๆ‰‹', - 'ai-trading-assistant.strategyList': '็ญ–็•ฅๅˆ—่กจ', - 'ai-trading-assistant.createStrategy': 'ๅˆ›ๅปบ็ญ–็•ฅ', - 'ai-trading-assistant.noStrategy': 'ๆš‚ๆ— ็ญ–็•ฅ', - 'ai-trading-assistant.selectStrategy': '่ฏทไปŽๅทฆไพง้€‰ๆ‹ฉไธ€ไธช็ญ–็•ฅๆŸฅ็œ‹่ฏฆๆƒ…', - 'ai-trading-assistant.startStrategy': 'ๅฏๅŠจ็ญ–็•ฅ', - 'ai-trading-assistant.stopStrategy': 'ๅœๆญข็ญ–็•ฅ', - 'ai-trading-assistant.editStrategy': '็ผ–่พ‘็ญ–็•ฅ', - 'ai-trading-assistant.deleteStrategy': 'ๅˆ ้™ค็ญ–็•ฅ', - 'ai-trading-assistant.status.running': '่ฟ่กŒไธญ', - 'ai-trading-assistant.status.stopped': 'ๅทฒๅœๆญข', - 'ai-trading-assistant.status.error': '้”™่ฏฏ', - 'ai-trading-assistant.tabs.tradingRecords': 'ไบคๆ˜“่ฎฐๅฝ•', - 'ai-trading-assistant.tabs.positions': 'ๆŒไป“่ฎฐๅฝ•', - 'ai-trading-assistant.tabs.aiDecisions': 'AIๅ†ณ็ญ–่ฎฐๅฝ•', - 'ai-trading-assistant.tabs.equityCurve': 'ๅ‡€ๅ€ผๆ›ฒ็บฟ', - 'ai-trading-assistant.form.createTitle': 'ๅˆ›ๅปบAIไบคๆ˜“็ญ–็•ฅ', - 'ai-trading-assistant.form.editTitle': '็ผ–่พ‘AIไบคๆ˜“็ญ–็•ฅ', - 'ai-trading-assistant.form.strategyName': '็ญ–็•ฅๅ็งฐ', - 'ai-trading-assistant.form.modelId': 'AIๆจกๅž‹', - 'ai-trading-assistant.form.modelIdHint': 'ไฝฟ็”จ็ณป็ปŸOpenRouterๆœๅŠก๏ผŒๆ— ้œ€้…็ฝฎAPI Key', - 'ai-trading-assistant.form.decideInterval': 'ๅ†ณ็ญ–้—ด้š”', - 'ai-trading-assistant.form.decideInterval5m': '5ๅˆ†้’Ÿ', - 'ai-trading-assistant.form.decideInterval10m': '10ๅˆ†้’Ÿ', - 'ai-trading-assistant.form.decideInterval30m': '30ๅˆ†้’Ÿ', - 'ai-trading-assistant.form.decideInterval1h': '1ๅฐๆ—ถ', - 'ai-trading-assistant.form.decideInterval4h': '4ๅฐๆ—ถ', - 'ai-trading-assistant.form.decideInterval1d': '1ๅคฉ', - 'ai-trading-assistant.form.decideInterval1w': '1ๅ‘จ', - 'ai-trading-assistant.form.decideIntervalHint': 'AIๅšๅ†ณ็ญ–็š„ๆ—ถ้—ด้—ด้š”', - 'ai-trading-assistant.form.runPeriod': '่ฟ่กŒๅ‘จๆœŸ', - 'ai-trading-assistant.form.runPeriodHint': '็ญ–็•ฅ่ฟ่กŒ็š„ๅผ€ๅง‹ๆ—ถ้—ดๅ’Œ็ป“ๆŸๆ—ถ้—ด', - 'ai-trading-assistant.form.startDate': 'ๅผ€ๅง‹ๆ—ฅๆœŸ', - 'ai-trading-assistant.form.endDate': '็ป“ๆŸๆ—ฅๆœŸ', - 'ai-trading-assistant.form.qdtCostTitle': 'QDTๆ‰ฃ่ดน่ฏดๆ˜Ž', - 'ai-trading-assistant.form.qdtCostHint': 'ๆฏๆฌกAIๅ†ณ็ญ–ๅฐ†ๆ‰ฃ่ดน {cost} ไธชQDT๏ผŒ่ฏท็กฎไฟ่ดฆๆˆทๆœ‰่ถณๅคŸ็š„QDTไฝ™้ขใ€‚็ญ–็•ฅ่ฟ่กŒๆœŸ้—ด๏ผŒๆฏๆฌกๅ†ณ็ญ–้ƒฝไผšๅฎžๆ—ถๆ‰ฃ่ดนใ€‚', - 'ai-trading-assistant.form.apiKey': 'API Key', - 'ai-trading-assistant.form.exchange': '้€‰ๆ‹ฉไบคๆ˜“ๆ‰€', - 'ai-trading-assistant.form.secretKey': 'Secret Key', - 'ai-trading-assistant.form.passphrase': 'Passphrase', - 'ai-trading-assistant.form.testConnection': 'ๆต‹่ฏ•่ฟžๆŽฅ', - 'ai-trading-assistant.form.symbol': 'ไบคๆ˜“ๅฏน', - 'ai-trading-assistant.form.symbolHint': '้€‰ๆ‹ฉ่ฆไบคๆ˜“็š„ไบคๆ˜“ๅฏน', - 'ai-trading-assistant.form.initialCapital': 'ๆŠ•ๅ…ฅ้‡‘้ข๏ผˆไฟ่ฏ้‡‘๏ผ‰', - 'ai-trading-assistant.form.leverage': 'ๆ ๆ†ๅ€ๆ•ฐ', - 'ai-trading-assistant.form.timeframe': 'ๆ—ถ้—ดๅ‘จๆœŸ', - 'ai-trading-assistant.form.timeframe1m': '1ๅˆ†้’Ÿ', - 'ai-trading-assistant.form.timeframe5m': '5ๅˆ†้’Ÿ', - 'ai-trading-assistant.form.timeframe15m': '15ๅˆ†้’Ÿ', - 'ai-trading-assistant.form.timeframe30m': '30ๅˆ†้’Ÿ', - 'ai-trading-assistant.form.timeframe1H': '1ๅฐๆ—ถ', - 'ai-trading-assistant.form.timeframe4H': '4ๅฐๆ—ถ', - 'ai-trading-assistant.form.timeframe1D': '1ๅคฉ', - 'ai-trading-assistant.form.marketType': 'ๅธ‚ๅœบ็ฑปๅž‹', - 'ai-trading-assistant.form.marketTypeFutures': 'ๅˆ็บฆ', - 'ai-trading-assistant.form.marketTypeSpot': '็Žฐ่ดง', - 'ai-trading-assistant.form.totalPnl': 'ๆ€ป็›ˆไบ', - 'ai-trading-assistant.form.customPrompt': '่‡ชๅฎšไน‰ๆ็คบ่ฏ', - 'ai-trading-assistant.form.customPromptHint': 'ๅฏ้€‰๏ผŒ็”จไบŽ่‡ชๅฎšไน‰AI็š„ไบคๆ˜“็ญ–็•ฅๅ’Œๅ†ณ็ญ–้€ป่พ‘', - 'ai-trading-assistant.form.cancel': 'ๅ–ๆถˆ', - 'ai-trading-assistant.form.prev': 'ไธŠไธ€ๆญฅ', - 'ai-trading-assistant.form.next': 'ไธ‹ไธ€ๆญฅ', - 'ai-trading-assistant.form.confirmCreate': '็กฎ่ฎคๅˆ›ๅปบ', - 'ai-trading-assistant.form.confirmEdit': '็กฎ่ฎคไฟฎๆ”น', - 'ai-trading-assistant.messages.createSuccess': '็ญ–็•ฅๅˆ›ๅปบๆˆๅŠŸ', - 'ai-trading-assistant.messages.createFailed': 'ๅˆ›ๅปบ็ญ–็•ฅๅคฑ่ดฅ', - 'ai-trading-assistant.messages.updateSuccess': '็ญ–็•ฅๆ›ดๆ–ฐๆˆๅŠŸ', - 'ai-trading-assistant.messages.updateFailed': 'ๆ›ดๆ–ฐ็ญ–็•ฅๅคฑ่ดฅ', - 'ai-trading-assistant.messages.deleteSuccess': '็ญ–็•ฅๅˆ ้™คๆˆๅŠŸ', - 'ai-trading-assistant.messages.deleteFailed': 'ๅˆ ้™ค็ญ–็•ฅๅคฑ่ดฅ', - 'ai-trading-assistant.messages.startSuccess': '็ญ–็•ฅๅฏๅŠจๆˆๅŠŸ', - 'ai-trading-assistant.messages.startFailed': 'ๅฏๅŠจ็ญ–็•ฅๅคฑ่ดฅ', - 'ai-trading-assistant.messages.stopSuccess': '็ญ–็•ฅๅœๆญขๆˆๅŠŸ', - 'ai-trading-assistant.messages.stopFailed': 'ๅœๆญข็ญ–็•ฅๅคฑ่ดฅ', - 'ai-trading-assistant.messages.loadFailed': '่Žทๅ–็ญ–็•ฅๅˆ—่กจๅคฑ่ดฅ', - 'ai-trading-assistant.messages.loadDecisionsFailed': '่Žทๅ–AIๅ†ณ็ญ–่ฎฐๅฝ•ๅคฑ่ดฅ', - 'ai-trading-assistant.messages.deleteConfirm': '็กฎๅฎš่ฆๅˆ ้™ค่ฏฅ็ญ–็•ฅๅ—๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅคใ€‚', - 'ai-trading-assistant.placeholders.inputStrategyName': '่ฏท่พ“ๅ…ฅ็ญ–็•ฅๅ็งฐ', - 'ai-trading-assistant.placeholders.selectModelId': '่ฏท้€‰ๆ‹ฉAIๆจกๅž‹', - 'ai-trading-assistant.placeholders.selectDecideInterval': '่ฏท้€‰ๆ‹ฉๅ†ณ็ญ–้—ด้š”', - 'ai-trading-assistant.placeholders.startTime': 'ๅผ€ๅง‹ๆ—ถ้—ด', - 'ai-trading-assistant.placeholders.endTime': '็ป“ๆŸๆ—ถ้—ด', - 'ai-trading-assistant.placeholders.inputApiKey': '่ฏท่พ“ๅ…ฅAPI Key', - 'ai-trading-assistant.placeholders.selectExchange': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๆ‰€', - 'ai-trading-assistant.placeholders.inputSecretKey': '่ฏท่พ“ๅ…ฅSecret Key', - 'ai-trading-assistant.placeholders.inputPassphrase': '่ฏท่พ“ๅ…ฅPassphrase', - 'ai-trading-assistant.placeholders.selectSymbol': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๅฏน๏ผŒๅฆ‚๏ผšBTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': '่ฏท้€‰ๆ‹ฉๆ—ถ้—ดๅ‘จๆœŸ', - 'ai-trading-assistant.placeholders.inputCustomPrompt': '่ฏท่พ“ๅ…ฅ่‡ชๅฎšไน‰ๆ็คบ่ฏ๏ผˆๅฏ้€‰๏ผ‰', - 'ai-trading-assistant.validation.strategyNameRequired': '่ฏท่พ“ๅ…ฅ็ญ–็•ฅๅ็งฐ', - 'ai-trading-assistant.validation.modelIdRequired': '่ฏท้€‰ๆ‹ฉAIๆจกๅž‹', - 'ai-trading-assistant.validation.runPeriodRequired': '่ฏท้€‰ๆ‹ฉ่ฟ่กŒๅ‘จๆœŸ', - 'ai-trading-assistant.validation.apiKeyRequired': '่ฏท่พ“ๅ…ฅAPI Key', - 'ai-trading-assistant.validation.exchangeRequired': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๆ‰€', - 'ai-trading-assistant.validation.secretKeyRequired': '่ฏท่พ“ๅ…ฅSecret Key', - 'ai-trading-assistant.validation.symbolRequired': '่ฏท้€‰ๆ‹ฉไบคๆ˜“ๅฏน', - 'ai-trading-assistant.validation.initialCapitalRequired': '่ฏท่พ“ๅ…ฅๆŠ•ๅ…ฅ้‡‘้ข', - 'ai-trading-assistant.table.time': 'ๆ—ถ้—ด', - 'ai-trading-assistant.table.type': '็ฑปๅž‹', - 'ai-trading-assistant.table.price': 'ไปทๆ ผ', - 'ai-trading-assistant.table.amount': 'ๆ•ฐ้‡', - 'ai-trading-assistant.table.value': '้‡‘้ข', - 'ai-trading-assistant.table.symbol': 'ไบคๆ˜“ๅฏน', - 'ai-trading-assistant.table.side': 'ๆ–นๅ‘', - 'ai-trading-assistant.table.size': 'ๆŒไป“ๆ•ฐ้‡', - 'ai-trading-assistant.table.entryPrice': 'ๅผ€ไป“ไปทๆ ผ', - 'ai-trading-assistant.table.currentPrice': 'ๅฝ“ๅ‰ไปทๆ ผ', - 'ai-trading-assistant.table.unrealizedPnl': 'ๆœชๅฎž็Žฐ็›ˆไบ', - 'ai-trading-assistant.table.profit': '็›ˆไบ', - 'ai-trading-assistant.table.openLong': 'ๅผ€ๅคš', - 'ai-trading-assistant.table.closeLong': 'ๅนณๅคš', - 'ai-trading-assistant.table.openShort': 'ๅผ€็ฉบ', - 'ai-trading-assistant.table.closeShort': 'ๅนณ็ฉบ', - 'ai-trading-assistant.table.addLong': 'ๅŠ ๅคš', - 'ai-trading-assistant.table.addShort': 'ๅŠ ็ฉบ', - 'ai-trading-assistant.table.closeShortProfit': 'ๅนณ็ฉบๆญข็›ˆ', - 'ai-trading-assistant.table.closeShortStop': 'ๅนณ็ฉบๆญขๆŸ', - 'ai-trading-assistant.table.closeLongProfit': 'ๅนณๅคšๆญข็›ˆ', - 'ai-trading-assistant.table.closeLongStop': 'ๅนณๅคšๆญขๆŸ', - 'ai-trading-assistant.table.buy': 'ไนฐๅ…ฅ', - 'ai-trading-assistant.table.sell': 'ๅ–ๅ‡บ', - 'ai-trading-assistant.table.long': 'ๅšๅคš', - 'ai-trading-assistant.table.short': 'ๅš็ฉบ', - 'ai-trading-assistant.table.hold': 'ๆŒๆœ‰', - 'ai-trading-assistant.table.reasoning': 'ๅˆ†ๆž็†็”ฑ', - 'ai-trading-assistant.table.decisions': 'ๅ†ณ็ญ–', - 'ai-trading-assistant.table.riskAssessment': '้ฃŽ้™ฉ่ฏ„ไผฐ', - 'ai-trading-assistant.table.confidence': '็ฝฎไฟกๅบฆ', - 'ai-trading-assistant.table.totalRecords': 'ๅ…ฑ {total} ๆก่ฎฐๅฝ•', - 'ai-trading-assistant.table.noPositions': 'ๆš‚ๆ— ๆŒไป“', - 'ai-trading-assistant.detail.title': '็ญ–็•ฅ่ฏฆๆƒ…', - 'ai-trading-assistant.equity.noData': 'ๆš‚ๆ— ๅ‡€ๅ€ผๆ•ฐๆฎ', - 'ai-trading-assistant.equity.equity': 'ๅ‡€ๅ€ผ', - 'ai-trading-assistant.exchange.testFailed': '่ฟžๆŽฅๆต‹่ฏ•ๅคฑ่ดฅ', - 'ai-trading-assistant.exchange.connectionSuccess': '่ฟžๆŽฅๆˆๅŠŸ', - 'ai-trading-assistant.exchange.connectionFailed': '่ฟžๆŽฅๅคฑ่ดฅ', - 'ai-trading-assistant.form.advancedSettings': '้ซ˜็บง่ฎพ็ฝฎ', - 'ai-trading-assistant.form.orderMode': 'ไธ‹ๅ•ๆจกๅผ', - 'ai-trading-assistant.form.orderModeMaker': 'ๆŒ‚ๅ•๏ผˆMaker๏ผ‰', - 'ai-trading-assistant.form.orderModeTaker': 'ๅธ‚ไปท๏ผˆTaker๏ผ‰', - 'ai-trading-assistant.form.orderModeHint': 'ๆŒ‚ๅ•ๆจกๅผไฝฟ็”จ้™ไปทๅ•๏ผŒๆ‰‹็ปญ่ดนๆ›ดไฝŽ๏ผ›ๅธ‚ไปทๆจกๅผ็ซ‹ๅณๆˆไบค๏ผŒๆ‰‹็ปญ่ดน่พƒ้ซ˜', - 'ai-trading-assistant.form.makerWaitSec': 'ๆŒ‚ๅ•็ญ‰ๅพ…ๆ—ถ้—ด๏ผˆ็ง’๏ผ‰', - 'ai-trading-assistant.form.makerWaitSecHint': 'ๆŒ‚ๅ•ๅŽ็ญ‰ๅพ…ๆˆไบค็š„ๆ—ถ้—ด๏ผŒ่ถ…ๆ—ถๅŽๅ–ๆถˆๅนถ้‡่ฏ•', - 'ai-trading-assistant.form.makerRetries': 'ๆŒ‚ๅ•้‡่ฏ•ๆฌกๆ•ฐ', - 'ai-trading-assistant.form.makerRetriesHint': 'ๆŒ‚ๅ•ๆœชๆˆไบคๆ—ถ็š„ๆœ€ๅคง้‡่ฏ•ๆฌกๆ•ฐ', - 'ai-trading-assistant.form.fallbackToMarket': 'ๆŒ‚ๅ•ๅคฑ่ดฅ้™็บงๅธ‚ไปท', - 'ai-trading-assistant.form.fallbackToMarketHint': 'ๅผ€/ๅนณไป“ๆŒ‚ๅ•ๆœชๆˆไบคๆ—ถ๏ผŒๆ˜ฏๅฆ้™็บงไธบๅธ‚ไปทๅ•ไปฅ็กฎไฟๆˆไบค', - 'ai-trading-assistant.form.marginMode': 'ไฟ่ฏ้‡‘ๆจกๅผ', - 'ai-trading-assistant.form.marginModeCross': 'ๅ…จไป“', - 'ai-trading-assistant.form.marginModeIsolated': '้€ไป“', - 'ai-analysis.title': '้‡ๅญไบคๆ˜“ๅผ•ๆ“Ž', - 'ai-analysis.system.online': 'ๅœจ็บฟ', - 'ai-analysis.system.agents': 'ๆ™บ่ƒฝไฝ“', - 'ai-analysis.system.active': 'ๆดป่ทƒ', - 'ai-analysis.system.stage': '้˜ถๆฎต', - 'ai-analysis.panel.roster': 'ๆ™บ่ƒฝไฝ“้˜ตๅฎน', - 'ai-analysis.panel.thinking': 'ๆ€่€ƒไธญ...', - 'ai-analysis.panel.done': 'ๅฎŒๆˆ', - 'ai-analysis.panel.standby': 'ๅพ…ๆœบ', - 'ai-analysis.input.title': '้‡ๅญไบคๆ˜“ๅผ•ๆ“Ž', - 'ai-analysis.input.placeholder': '้€‰ๆ‹ฉ็›ฎๆ ‡่ต„ไบง (ๅฆ‚ BTC/USDT)', - 'ai-analysis.input.watchlist': '่‡ช้€‰่‚ก', - 'ai-analysis.input.start': 'ๅผ€ๅง‹ๅˆ†ๆž', - 'ai-analysis.input.recent': 'ๆœ€่ฟ‘ไปปๅŠก:', - 'ai-analysis.vis.stage': '้˜ถๆฎต', - 'ai-analysis.vis.processing': 'ๅค„็†ไธญ', - 'ai-analysis.result.complete': 'ๅˆ†ๆžๅฎŒๆˆ', - 'ai-analysis.result.signal': 'ๆœ€็ปˆไฟกๅท', - 'ai-analysis.result.confidence': '็ฝฎไฟกๅบฆ:', - 'ai-analysis.result.new': 'ๆ–ฐๅˆ†ๆž', - 'ai-analysis.result.full': 'ๆŸฅ็œ‹ๅฎŒๆ•ดๆŠฅๅ‘Š', - 'ai-analysis.logs.title': '็ณป็ปŸๆ—ฅๅฟ—', - 'ai-analysis.modal.title': 'ๆœบๅฏ†ๆŠฅๅ‘Š', - 'ai-analysis.modal.fundamental': 'ๅŸบๆœฌ้ขๅˆ†ๆž', - 'ai-analysis.modal.technical': 'ๆŠ€ๆœฏ้ขๅˆ†ๆž', - 'ai-analysis.modal.sentiment': 'ๆƒ…็ปช้ขๅˆ†ๆž', - 'ai-analysis.modal.risk': '้ฃŽ้™ฉ่ฏ„ไผฐ', - 'ai-analysis.stage.idle': 'ๅพ…ๆœบ', - 'ai-analysis.stage.1': '็ฌฌไธ€้˜ถๆฎต๏ผšๅคš็ปดๅˆ†ๆž', - 'ai-analysis.stage.2': '็ฌฌไบŒ้˜ถๆฎต๏ผšๅคš็ฉบ่พฉ่ฎบ', - 'ai-analysis.stage.3': '็ฌฌไธ‰้˜ถๆฎต๏ผšๆˆ˜็•ฅ่ง„ๅˆ’', - 'ai-analysis.stage.4': '็ฌฌๅ››้˜ถๆฎต๏ผš้ฃŽๆŽงๅฎกๆŸฅ', - 'ai-analysis.stage.complete': 'ๅฎŒๆˆ', - 'ai-analysis.agent.investment_director': 'ๆŠ•่ต„ๆ€ป็›‘', - 'ai-analysis.agent.role.investment_director': '็ปผๅˆๅˆ†ๆž & ๆœ€็ปˆ็ป“่ฎบ', - 'ai-analysis.agent.market': 'ๅธ‚ๅœบๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.market': 'ๆŠ€ๆœฏ & ๅธ‚ๅœบๆ•ฐๆฎ', - 'ai-analysis.agent.fundamental': 'ๅŸบๆœฌ้ขๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.fundamental': '่ดขๅŠก & ไผฐๅ€ผ', - 'ai-analysis.agent.technical': 'ๆŠ€ๆœฏๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.technical': 'ๆŠ€ๆœฏๆŒ‡ๆ ‡ & ๅ›พ่กจ', - 'ai-analysis.agent.news': 'ๆ–ฐ้—ปๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.news': 'ๅ…จ็ƒๆ–ฐ้—ป่ฟ‡ๆปค', - 'ai-analysis.agent.sentiment': 'ๆƒ…็ปชๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.sentiment': '็คพไบค & ๆƒ…็ปช', - 'ai-analysis.agent.risk': '้ฃŽ้™ฉๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.risk': 'ๅŸบ็ก€้ฃŽ้™ฉๆฃ€ๆŸฅ', - 'ai-analysis.agent.bull': '็œ‹ๆถจ็ ”็ฉถๅ‘˜', - 'ai-analysis.agent.role.bull': 'ๅขž้•ฟๅ‚ฌๅŒ–ๅ‰‚ๆŒ–ๆŽ˜', - 'ai-analysis.agent.bear': '็œ‹่ทŒ็ ”็ฉถๅ‘˜', - 'ai-analysis.agent.role.bear': '้ฃŽ้™ฉ & ็ผบ้™ทๆŒ–ๆŽ˜', - 'ai-analysis.agent.manager': '็ ”็ฉถ็ป็†', - 'ai-analysis.agent.role.manager': '่พฉ่ฎบไธปๆŒไบบ', - 'ai-analysis.agent.trader': 'ไบคๆ˜“ๅ‘˜', - 'ai-analysis.agent.role.trader': 'ๆ‰ง่กŒ็ญ–็•ฅๅธˆ', - 'ai-analysis.agent.risky': 'ๆฟ€่ฟ›ๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.risky': 'ๆฟ€่ฟ›็ญ–็•ฅ', - 'ai-analysis.agent.neutral': 'ๅนณ่กกๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.neutral': 'ๅนณ่กก็ญ–็•ฅ', - 'ai-analysis.agent.safe': 'ไฟๅฎˆๅˆ†ๆžๅธˆ', - 'ai-analysis.agent.role.safe': 'ไฟๅฎˆ็ญ–็•ฅ', - 'ai-analysis.agent.cro': '้ฃŽๆŽง็ป็† (CRO)', - 'ai-analysis.agent.role.cro': 'ๆœ€็ปˆๅ†ณ็ญ–ๆƒๅจ', - 'ai-analysis.script.market': 'ๆญฃๅœจไปŽไธป่ฆไบคๆ˜“ๆ‰€่Žทๅ– OHLCV ๆ•ฐๆฎ...', - 'ai-analysis.script.fundamental': 'ๆญฃๅœจๆฃ€็ดขๅญฃๅบฆ่ดขๅŠกๆŠฅๅ‘Š...', - 'ai-analysis.script.technical': 'ๆญฃๅœจๅˆ†ๆžๆŠ€ๆœฏๆŒ‡ๆ ‡ๅ’Œๅ›พ่กจๅฝขๆ€...', - 'ai-analysis.script.news': 'ๆญฃๅœจๆ‰ซๆๅ…จ็ƒ่ดข็ปๆ–ฐ้—ป...', - 'ai-analysis.script.sentiment': 'ๆญฃๅœจๅˆ†ๆž็คพไบคๅช’ไฝ“่ถ‹ๅŠฟ...', - 'ai-analysis.script.risk': 'ๆญฃๅœจ่ฎก็ฎ—ๅކๅฒๆณขๅŠจ็އ...', - 'invite.inviteLink': '้‚€่ฏท้“พๆŽฅ', - 'invite.copy': 'ๅคๅˆถ้“พๆŽฅ', - 'invite.copySuccess': 'ๅคๅˆถๆˆๅŠŸ๏ผ', - 'invite.copyFailed': 'ๅคๅˆถๅคฑ่ดฅ๏ผŒ่ฏทๆ‰‹ๅŠจๅคๅˆถ', - 'invite.noInviteLink': '้‚€่ฏท้“พๆŽฅๆœช็”Ÿๆˆ', - 'invite.totalInvites': '็ดฏ่ฎก้‚€่ฏท', - 'invite.totalReward': '็ดฏ่ฎกๅฅ–ๅŠฑ', - 'invite.rules': '้‚€่ฏท่ง„ๅˆ™', - 'invite.rule1': 'ๆฏๆˆๅŠŸ้‚€่ฏทไธ€ไฝๅฅฝๅ‹ๆณจๅ†Œ๏ผŒๆ‚จๅฐ†่Žทๅพ—ๅฅ–ๅŠฑ', - 'invite.rule2': '่ขซ้‚€่ฏท็š„ๅฅฝๅ‹ๅฎŒๆˆ้ฆ–ๆฌกไบคๆ˜“๏ผŒๆ‚จๅฐ†่Žทๅพ—้ขๅค–ๅฅ–ๅŠฑ', - 'invite.rule3': '้‚€่ฏทๅฅ–ๅŠฑๅฐ†็›ดๆŽฅๅ‘ๆ”พๅˆฐๆ‚จ็š„่ดฆๆˆท', - 'invite.inviteList': '้‚€่ฏทๅˆ—่กจ', - 'invite.tasks': 'ไปปๅŠกไธญๅฟƒ', - 'invite.inviteeName': '่ขซ้‚€่ฏทไบบ', - 'invite.inviteTime': '้‚€่ฏทๆ—ถ้—ด', - 'invite.status': '็Šถๆ€', - 'invite.reward': 'ๅฅ–ๅŠฑ', - 'invite.active': 'ๆดป่ทƒ', - 'invite.inactive': 'ๆœชๆฟ€ๆดป', - 'invite.completed': 'ๅทฒๅฎŒๆˆ', - 'invite.claimed': 'ๅทฒ้ข†ๅ–', - 'invite.pending': 'ๅพ…ๅฎŒๆˆ', - 'invite.goToTask': 'ๅŽปๅฎŒๆˆ', - 'invite.claimReward': '้ข†ๅ–ๅฅ–ๅŠฑ', - 'invite.verify': '้ชŒ่ฏๅฎŒๆˆ', - 'invite.verifySuccess': '้ชŒ่ฏๆˆๅŠŸ๏ผไปปๅŠกๅทฒๅฎŒๆˆ', - 'invite.verifyNotCompleted': 'ไปปๅŠกๅฐšๆœชๅฎŒๆˆ๏ผŒ่ฏทๅ…ˆๅฎŒๆˆไปปๅŠก', - 'invite.verifyFailed': '้ชŒ่ฏๅคฑ่ดฅ๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'invite.claimSuccess': 'ๆˆๅŠŸ้ข†ๅ– {reward} QDT๏ผ', - 'invite.claimFailed': '้ข†ๅ–ๅคฑ่ดฅ๏ผŒ่ฏท็จๅŽ้‡่ฏ•', - 'invite.totalRecords': 'ๅ…ฑ {total} ๆก่ฎฐๅฝ•', - 'invite.task.twitter.title': '่ฝฌๅ‘ๆŽจๆ–‡ๅˆฐ X (Twitter)', - 'invite.task.twitter.desc': 'ๅˆ†ไบซๆˆ‘ไปฌ็š„ๅฎ˜ๆ–นๆŽจๆ–‡ๅˆฐๆ‚จ็š„ X (Twitter) ่ดฆๅท', - 'invite.task.youtube.title': 'ๅ…ณๆณจๆˆ‘ไปฌ็š„ YouTube ้ข‘้“', - 'invite.task.youtube.desc': '่ฎข้˜…ๅนถๅ…ณๆณจๆˆ‘ไปฌ็š„ YouTube ๅฎ˜ๆ–น้ข‘้“', - 'invite.task.telegram.title': 'ๅŠ ๅ…ฅ Telegram ็พค็ป„', - 'invite.task.telegram.desc': 'ๅŠ ๅ…ฅๆˆ‘ไปฌ็š„ๅฎ˜ๆ–น Telegram ็คพๅŒบ็พค็ป„', - 'invite.task.discord.title': 'ๅŠ ๅ…ฅ Discord ๆœๅŠกๅ™จ', - 'invite.task.discord.desc': 'ๅŠ ๅ…ฅๆˆ‘ไปฌ็š„ Discord ็คพๅŒบๆœๅŠกๅ™จ', - 'message': '-', - 'layouts.usermenu.dialog.title': 'ไฟกๆฏ', - 'layouts.usermenu.dialog.content': 'ๆ‚จ็กฎๅฎš่ฆๆณจ้”€ๅ—๏ผŸ', - 'layouts.userLayout.title': 'ไบŽไธ็กฎๅฎšไธญ๏ผŒๅฏป่ง็œŸ็†', - - // Settings - 'settings.title': '็ณป็ปŸ่ฎพ็ฝฎ', - 'settings.description': '้…็ฝฎๅบ”็”จ่ฎพ็ฝฎใ€APIๅฏ†้’ฅๅ’Œ็ณป็ปŸๅๅฅฝ', - 'settings.save': 'ไฟๅญ˜่ฎพ็ฝฎ', - 'settings.reset': '้‡็ฝฎ', - 'settings.saveSuccess': '่ฎพ็ฝฎไฟๅญ˜ๆˆๅŠŸ', - 'settings.saveFailed': 'ไฟๅญ˜่ฎพ็ฝฎๅคฑ่ดฅ', - 'settings.loadFailed': 'ๅŠ ่ฝฝ้…็ฝฎๅคฑ่ดฅ', - 'settings.openrouterBalance': 'OpenRouter ่ดฆๆˆทไฝ™้ข', - 'settings.queryBalance': 'ๆŸฅ่ฏขไฝ™้ข', - 'settings.balanceUsage': 'ๅทฒไฝฟ็”จ', - 'settings.balanceRemaining': 'ๅ‰ฉไฝ™้ขๅบฆ', - 'settings.balanceLimit': 'ๆ€ป้™้ข', - 'settings.balanceQuerySuccess': 'ไฝ™้ขๆŸฅ่ฏขๆˆๅŠŸ', - 'settings.balanceQueryFailed': 'ไฝ™้ขๆŸฅ่ฏขๅคฑ่ดฅ', - 'settings.balanceNotQueried': '็‚นๅ‡ป"ๆŸฅ่ฏขไฝ™้ข"่Žทๅ–่ดฆๆˆทไฟกๆฏ', - 'settings.default': '้ป˜่ฎค', - 'settings.pleaseSelect': '่ฏท้€‰ๆ‹ฉ', - 'settings.inputApiKey': '่ฏท่พ“ๅ…ฅๅฏ†้’ฅ', - 'settings.getApi': '่Žทๅ–API', - // Settings link texts - 'settings.link.getApi': '่Žทๅ–API', - 'settings.link.getApiKey': '่Žทๅ–API Key', - 'settings.link.getToken': '่Žทๅ–Token', - 'settings.link.createBot': 'ๅˆ›ๅปบBot', - 'settings.link.viewModels': 'ๆŸฅ็œ‹ๆจกๅž‹ๅˆ—่กจ', - 'settings.link.freeRegister': 'ๅ…่ดนๆณจๅ†Œ', - 'settings.link.supportedExchanges': 'ๆ”ฏๆŒ็š„ไบคๆ˜“ๆ‰€', - 'settings.link.applyApi': '็”ณ่ฏทAPI', - 'settings.link.createSearchEngine': 'ๅˆ›ๅปบๆœ็ดขๅผ•ๆ“Ž', - 'settings.link.getTurnstileKey': '่Žทๅ–Turnstileๅฏ†้’ฅ', - 'settings.link.getGoogleCredentials': '่Žทๅ–Googleๅ‡ญๆฎ', - 'settings.link.getGithubCredentials': '่Žทๅ–GitHubๅ‡ญๆฎ', - 'settings.restartRequired': '้…็ฝฎๅทฒไฟๅญ˜๏ผŒ้ƒจๅˆ†้…็ฝฎ้œ€่ฆ้‡ๅฏPythonๆœๅŠกๆ‰่ƒฝ็”Ÿๆ•ˆ', - 'settings.copyRestartCmd': 'ๅคๅˆถ้‡ๅฏๅ‘ฝไปค', - 'settings.copySuccess': 'ๅคๅˆถๆˆๅŠŸ', - 'settings.copyFailed': 'ๅคๅˆถๅคฑ่ดฅ', - // Settings groups (ๆŒ‰ๅŽ็ซฏ order ๆŽ’ๅบ) - 'settings.group.server': 'ๆœๅŠก้…็ฝฎ', - 'settings.group.auth': 'ๅฎ‰ๅ…จ่ฎค่ฏ', - 'settings.group.ai': 'AI/LLM้…็ฝฎ', - 'settings.group.trading': 'ๅฎž็›˜ไบคๆ˜“', - 'settings.group.strategy': '็ญ–็•ฅๆ‰ง่กŒ', - 'settings.group.data_source': 'ๆ•ฐๆฎๆบ', - 'settings.group.notification': '้€š็ŸฅๆŽจ้€', - 'settings.group.email': '้‚ฎไปถ้…็ฝฎ', - 'settings.group.sms': '็Ÿญไฟก้…็ฝฎ', - 'settings.group.agent': 'AI Agent', - 'settings.group.network': '็ฝ‘็ปœไปฃ็†', - 'settings.group.search': 'ๆœ็ดข้…็ฝฎ', - 'settings.group.security': 'ๆณจๅ†ŒไธŽๅฎ‰ๅ…จ', - 'settings.group.app': 'ๅบ”็”จ้…็ฝฎ', - // Settings fields - Auth - 'settings.field.SECRET_KEY': 'Secret Key', - 'settings.field.ADMIN_USER': '็ฎก็†ๅ‘˜็”จๆˆทๅ', - 'settings.field.ADMIN_PASSWORD': '็ฎก็†ๅ‘˜ๅฏ†็ ', - 'settings.field.ADMIN_EMAIL': '็ฎก็†ๅ‘˜้‚ฎ็ฎฑ', - // Settings fields - Security - 'settings.field.ENABLE_REGISTRATION': 'ๅ…่ฎธๆณจๅ†Œ', - 'settings.field.TURNSTILE_SITE_KEY': 'Turnstile Site Key', - 'settings.field.TURNSTILE_SECRET_KEY': 'Turnstile Secret Key', - 'settings.field.FRONTEND_URL': 'ๅ‰็ซฏURL', - 'settings.field.GOOGLE_CLIENT_ID': 'Google Client ID', - 'settings.field.GOOGLE_CLIENT_SECRET': 'Google Client Secret', - 'settings.field.GOOGLE_REDIRECT_URI': 'Googleๅ›ž่ฐƒURL', - 'settings.field.GITHUB_CLIENT_ID': 'GitHub Client ID', - 'settings.field.GITHUB_CLIENT_SECRET': 'GitHub Client Secret', - 'settings.field.GITHUB_REDIRECT_URI': 'GitHubๅ›ž่ฐƒURL', - 'settings.field.SECURITY_IP_MAX_ATTEMPTS': 'IPๆœ€ๅคงๅคฑ่ดฅๆฌกๆ•ฐ', - 'settings.field.SECURITY_IP_WINDOW_MINUTES': 'IP็ปŸ่ฎก็ช—ๅฃ(ๅˆ†้’Ÿ)', - 'settings.field.SECURITY_IP_BLOCK_MINUTES': 'IPๅฐ็ฆๆ—ถ้•ฟ(ๅˆ†้’Ÿ)', - 'settings.field.SECURITY_ACCOUNT_MAX_ATTEMPTS': '่ดฆๆˆทๆœ€ๅคงๅคฑ่ดฅๆฌกๆ•ฐ', - 'settings.field.SECURITY_ACCOUNT_WINDOW_MINUTES': '่ดฆๆˆท็ปŸ่ฎก็ช—ๅฃ(ๅˆ†้’Ÿ)', - 'settings.field.SECURITY_ACCOUNT_BLOCK_MINUTES': '่ดฆๆˆท้”ๅฎšๆ—ถ้•ฟ(ๅˆ†้’Ÿ)', - 'settings.field.VERIFICATION_CODE_EXPIRE_MINUTES': '้ชŒ่ฏ็ ๆœ‰ๆ•ˆๆœŸ(ๅˆ†้’Ÿ)', - 'settings.field.VERIFICATION_CODE_RATE_LIMIT': '้ชŒ่ฏ็ ๅ‘้€้—ด้š”(็ง’)', - 'settings.field.VERIFICATION_CODE_IP_HOURLY_LIMIT': 'IPๆฏๅฐๆ—ถ้ชŒ่ฏ็ ไธŠ้™', - 'settings.field.VERIFICATION_CODE_MAX_ATTEMPTS': '้ชŒ่ฏ็ ๆœ€ๅคงๅฐ่ฏ•ๆฌกๆ•ฐ', - 'settings.field.VERIFICATION_CODE_LOCK_MINUTES': '้ชŒ่ฏ็ ้”ๅฎšๆ—ถ้•ฟ(ๅˆ†้’Ÿ)', - // Settings fields - Server - 'settings.field.PYTHON_API_HOST': '็›‘ๅฌๅœฐๅ€', - 'settings.field.PYTHON_API_PORT': '็ซฏๅฃ', - 'settings.field.PYTHON_API_DEBUG': '่ฐƒ่ฏ•ๆจกๅผ', - // Settings fields - Worker - 'settings.field.ENABLE_PENDING_ORDER_WORKER': 'ๅฏ็”จ่ฎขๅ•ๅค„็†Worker', - 'settings.field.PENDING_ORDER_STALE_SEC': '่ฎขๅ•่ถ…ๆ—ถๆ—ถ้—ด(็ง’)', - // Settings fields - Trading - 'settings.field.ORDER_MODE': 'ไธ‹ๅ•ๆจกๅผ', - 'settings.field.MAKER_WAIT_SEC': '้™ไปทๅ•็ญ‰ๅพ…ๆ—ถ้—ด(็ง’)', - 'settings.field.MAKER_OFFSET_BPS': '้™ไปทๅ•ไปทๆ ผๅ็งป(ๅŸบ็‚น)', - // Settings fields - Notification - 'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL', - 'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token', - 'settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC': '้€š็Ÿฅ่ถ…ๆ—ถ(็ง’)', - 'settings.field.TELEGRAM_BOT_TOKEN': 'Telegram Bot Token', - // Settings fields - SMTP - 'settings.field.SMTP_HOST': 'SMTPๆœๅŠกๅ™จ', - 'settings.field.SMTP_PORT': 'SMTP็ซฏๅฃ', - 'settings.field.SMTP_USER': 'SMTP็”จๆˆทๅ', - 'settings.field.SMTP_PASSWORD': 'SMTPๅฏ†็ ', - 'settings.field.SMTP_FROM': 'ๅ‘ไปถไบบๅœฐๅ€', - 'settings.field.SMTP_USE_TLS': 'ไฝฟ็”จTLS', - 'settings.field.SMTP_USE_SSL': 'ไฝฟ็”จSSL', - // Settings fields - Twilio - 'settings.field.TWILIO_ACCOUNT_SID': 'Account SID', - 'settings.field.TWILIO_AUTH_TOKEN': 'Auth Token', - 'settings.field.TWILIO_FROM_NUMBER': 'ๅ‘้€ๅท็ ', - // Settings fields - Strategy - 'settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES': '็ฆ็”จ่‡ชๅŠจๆขๅค็ญ–็•ฅ', - 'settings.field.STRATEGY_TICK_INTERVAL_SEC': '็ญ–็•ฅTick้—ด้š”(็ง’)', - 'settings.field.PRICE_CACHE_TTL_SEC': 'ไปทๆ ผ็ผ“ๅญ˜TTL(็ง’)', - // Settings fields - Proxy - 'settings.field.PROXY_PORT': 'ไปฃ็†็ซฏๅฃ', - 'settings.field.PROXY_HOST': 'ไปฃ็†ไธปๆœบ', - 'settings.field.PROXY_SCHEME': 'ไปฃ็†ๅ่ฎฎ', - 'settings.field.PROXY_URL': 'ๅฎŒๆ•ดไปฃ็†URL', - // Settings fields - App - 'settings.field.CORS_ORIGINS': 'CORSๆฅๆบ', - 'settings.field.RATE_LIMIT': '้€Ÿ็އ้™ๅˆถ(ๆฏๅˆ†้’Ÿ)', - 'settings.field.ENABLE_CACHE': 'ๅฏ็”จ็ผ“ๅญ˜', - 'settings.field.ENABLE_REQUEST_LOG': 'ๅฏ็”จ่ฏทๆฑ‚ๆ—ฅๅฟ—', - 'settings.field.ENABLE_AI_ANALYSIS': 'ๅฏ็”จAIๅˆ†ๆž', - // Settings fields - ่ฎฐๅฟ†/ๅๆ€ - 'settings.field.ENABLE_AGENT_MEMORY': 'ๅฏ็”จAgent่ฎฐๅฟ†', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'ๅฏ็”จๅ‘้‡ๆฃ€็ดข(ๆœฌๅœฐ)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding็ปดๅบฆ', - 'settings.field.AGENT_MEMORY_TOP_K': 'ๅฌๅ›žๆ•ฐ้‡TopK', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'ๅ€™้€‰็ช—ๅฃๅคงๅฐ', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'ๆ—ถ้—ด่กฐๅ‡ๅŠ่กฐๆœŸ(ๅคฉ)', - 'settings.field.AGENT_MEMORY_W_SIM': '็›ธไผผๅบฆๆƒ้‡', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'ๆ—ถ้—ดๆƒ้‡', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'ๆ”ถ็›Šๆƒ้‡', - // Settings fields - ่‡ชๅŠจๅๆ€้ชŒ่ฏWorker - 'settings.field.ENABLE_REFLECTION_WORKER': 'ๅฏ็”จ่‡ชๅŠจ้ชŒ่ฏ', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': '้ชŒ่ฏๅ‘จๆœŸ้—ด้š”(็ง’)', - // Settings fields - AI - 'settings.field.OPENROUTER_API_KEY': 'OpenRouter API Key', - 'settings.field.OPENROUTER_API_URL': 'OpenRouter API URL', - 'settings.field.OPENROUTER_MODEL': '้ป˜่ฎคๆจกๅž‹', - 'settings.field.OPENROUTER_TEMPERATURE': 'Temperature', - 'settings.field.OPENROUTER_MAX_TOKENS': 'Max Tokens', - 'settings.field.OPENROUTER_TIMEOUT': '่ถ…ๆ—ถๆ—ถ้—ด(็ง’)', - 'settings.field.OPENROUTER_CONNECT_TIMEOUT': '่ฟžๆŽฅ่ถ…ๆ—ถ(็ง’)', - 'settings.field.AI_MODELS_JSON': 'ๆจกๅž‹ๅˆ—่กจ(JSON)', - // Settings fields - Market - 'settings.field.MARKET_TYPES_JSON': 'ๅธ‚ๅœบ็ฑปๅž‹(JSON)', - 'settings.field.TRADING_SUPPORTED_SYMBOLS_JSON': 'ๆ”ฏๆŒ็š„ไบคๆ˜“ๅฏน(JSON)', - // Settings fields - Data Source - 'settings.field.DATA_SOURCE_TIMEOUT': 'ๆ•ฐๆฎๆบ่ถ…ๆ—ถ(็ง’)', - 'settings.field.DATA_SOURCE_RETRY': '้‡่ฏ•ๆฌกๆ•ฐ', - 'settings.field.DATA_SOURCE_RETRY_BACKOFF': '้‡่ฏ•้€€้ฟ(็ง’)', - 'settings.field.FINNHUB_API_KEY': 'Finnhub API Key', - 'settings.field.FINNHUB_TIMEOUT': 'Finnhub่ถ…ๆ—ถ(็ง’)', - 'settings.field.FINNHUB_RATE_LIMIT': 'Finnhub้€Ÿ็އ้™ๅˆถ', - 'settings.field.CCXT_DEFAULT_EXCHANGE': 'CCXT้ป˜่ฎคไบคๆ˜“ๆ‰€', - 'settings.field.CCXT_TIMEOUT': 'CCXT่ถ…ๆ—ถ(ms)', - 'settings.field.CCXT_PROXY': 'CCXTไปฃ็†', - 'settings.field.AKSHARE_TIMEOUT': 'Akshare่ถ…ๆ—ถ(็ง’)', - 'settings.field.YFINANCE_TIMEOUT': 'YFinance่ถ…ๆ—ถ(็ง’)', - 'settings.field.TIINGO_API_KEY': 'Tiingo API Key', - 'settings.field.TIINGO_TIMEOUT': 'Tiingo่ถ…ๆ—ถ(็ง’)', - // Settings fields - Search - 'settings.field.SEARCH_PROVIDER': 'ๆœ็ดขๆไพ›ๅ•†', - 'settings.field.SEARCH_MAX_RESULTS': 'ๆœ€ๅคง็ป“ๆžœๆ•ฐ', - 'settings.field.TAVILY_API_KEYS': 'Tavily API Keys', - 'settings.field.BOCHA_API_KEYS': 'ๅšๆŸฅ API Keys', - 'settings.field.SERPAPI_KEYS': 'SerpAPI Keys', - 'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key', - 'settings.field.SEARCH_GOOGLE_CX': 'Google CX', - 'settings.field.SEARCH_BING_API_KEY': 'Bing API Key', - 'settings.field.INTERNAL_API_KEY': 'ๅ†…้ƒจAPI Key', - - // Settings descriptions (้…็ฝฎ้กน่ฏดๆ˜Ž) - 'settings.desc.PYTHON_API_HOST': 'ๆœๅŠก็›‘ๅฌๅœฐๅ€ใ€‚0.0.0.0 ๅ…่ฎธๅค–้ƒจ่ฎฟ้—ฎ๏ผŒ127.0.0.1 ไป…ๆœฌๅœฐ่ฎฟ้—ฎ', - 'settings.desc.PYTHON_API_PORT': 'ๆœๅŠก็›‘ๅฌ็ซฏๅฃ๏ผŒ้ป˜่ฎค5000', - 'settings.desc.PYTHON_API_DEBUG': 'ๅฏ็”จ่ฐƒ่ฏ•ๆจกๅผ๏ผŒๅผ€ๅ‘ๆ—ถไฝฟ็”จใ€‚็”Ÿไบง็Žฏๅขƒ่ฏทๅ…ณ้—ญ', - 'settings.desc.SECRET_KEY': 'JWT็ญพๅๅฏ†้’ฅใ€‚็”Ÿไบง็Žฏๅขƒๅฟ…้กปไฟฎๆ”นไปฅ็กฎไฟๅฎ‰ๅ…จ', - 'settings.desc.ADMIN_USER': '็ฎก็†ๅ‘˜็™ปๅฝ•็”จๆˆทๅ', - 'settings.desc.ADMIN_PASSWORD': '็ฎก็†ๅ‘˜็™ปๅฝ•ๅฏ†็ ใ€‚็”Ÿไบง็Žฏๅขƒๅฟ…้กปไฟฎๆ”น', - 'settings.desc.OPENROUTER_API_KEY': 'OpenRouter APIๅฏ†้’ฅ๏ผŒ็”จไบŽ่ฎฟ้—ฎๅคš็งAIๆจกๅž‹', - 'settings.desc.OPENROUTER_API_URL': 'OpenRouter API็ซฏ็‚นๅœฐๅ€', - 'settings.desc.OPENROUTER_MODEL': '้ป˜่ฎคไฝฟ็”จ็š„AIๆจกๅž‹๏ผŒๅฆ‚ openai/gpt-4o, anthropic/claude-3.5-sonnet', - 'settings.desc.OPENROUTER_TEMPERATURE': 'ๆจกๅž‹ๅˆ›้€ ๆ€ง(0-1)ใ€‚่ถŠไฝŽ่ถŠ็กฎๅฎšๆ€ง๏ผŒ่ถŠ้ซ˜่ถŠๆœ‰ๅˆ›ๆ„', - 'settings.desc.OPENROUTER_MAX_TOKENS': 'ๆฏๆฌก่ฏทๆฑ‚ๆœ€ๅคง่พ“ๅ‡บtokenๆ•ฐ', - 'settings.desc.OPENROUTER_TIMEOUT': 'API่ฏทๆฑ‚่ถ…ๆ—ถๆ—ถ้—ด๏ผˆ็ง’๏ผ‰', - 'settings.desc.OPENROUTER_CONNECT_TIMEOUT': '่ฟžๆŽฅๅปบ็ซ‹่ถ…ๆ—ถๆ—ถ้—ด๏ผˆ็ง’๏ผ‰', - 'settings.desc.AI_MODELS_JSON': '่‡ชๅฎšไน‰ๆจกๅž‹ๅˆ—่กจ๏ผŒJSONๆ ผๅผ๏ผŒ็”จไบŽๆจกๅž‹้€‰ๆ‹ฉๅ™จ', - 'settings.desc.ENABLE_PENDING_ORDER_WORKER': 'ๅฏ็”จๅŽๅฐ่ฎขๅ•ๅค„็†Worker๏ผŒๅฎž็›˜ไบคๆ˜“ๅฟ…้œ€', - 'settings.desc.PENDING_ORDER_STALE_SEC': '็ญ‰ๅพ…่ฎขๅ•่ถ…ๆ—ถๆ—ถ้—ด๏ผŒ่ถ…ๆ—ถๅŽๆ ‡่ฎฐไธบ่ฟ‡ๆœŸ', - 'settings.desc.ORDER_MODE': 'maker: ้™ไปทๅ•ไผ˜ๅ…ˆ(ๆ‰‹็ปญ่ดนไฝŽ)๏ผŒmarket: ๅธ‚ไปทๅ•(็ซ‹ๅณๆˆไบค)', - 'settings.desc.MAKER_WAIT_SEC': '้™ไปทๅ•็ญ‰ๅพ…ๆˆไบคๆ—ถ้—ด๏ผŒ่ถ…ๆ—ถๅŽ่‡ชๅŠจๅˆ‡ๆขไธบๅธ‚ไปทๅ•', - 'settings.desc.MAKER_OFFSET_BPS': '้™ไปทๅ•ไปทๆ ผๅ็งป(ๅŸบ็‚น)ใ€‚ไนฐๅ…ฅไปท=ๅธ‚ไปท*(1-ๅ็งป)๏ผŒๅ–ๅ‡บไปท=ๅธ‚ไปท*(1+ๅ็งป)', - 'settings.desc.DISABLE_RESTORE_RUNNING_STRATEGIES': '็ฆๆญขๆœๅŠก้‡ๅฏๆ—ถ่‡ชๅŠจๆขๅค่ฟ่กŒไธญ็š„็ญ–็•ฅ', - 'settings.desc.STRATEGY_TICK_INTERVAL_SEC': '็ญ–็•ฅไธปๅพช็Žฏๆฃ€ๆŸฅ้—ด้š”๏ผˆ็ง’๏ผ‰', - 'settings.desc.PRICE_CACHE_TTL_SEC': 'ไปทๆ ผๆ•ฐๆฎ็ผ“ๅญ˜ๆœ‰ๆ•ˆๆœŸ๏ผˆ็ง’๏ผ‰', - 'settings.desc.MARKET_TYPES_JSON': '่‡ชๅฎšไน‰ๅธ‚ๅœบ็ฑปๅž‹้…็ฝฎ๏ผŒJSONๆ ผๅผ', - 'settings.desc.TRADING_SUPPORTED_SYMBOLS_JSON': 'ๆ”ฏๆŒ็š„ไบคๆ˜“ๅฏนๅˆ—่กจ๏ผŒJSONๆ ผๅผ', - 'settings.desc.DATA_SOURCE_TIMEOUT': 'ๆ•ฐๆฎๆบ่ฏทๆฑ‚้ป˜่ฎค่ถ…ๆ—ถๆ—ถ้—ด', - 'settings.desc.DATA_SOURCE_RETRY': 'ๆ•ฐๆฎๆบ่ฏทๆฑ‚ๅคฑ่ดฅๆ—ถ็š„้‡่ฏ•ๆฌกๆ•ฐ', - 'settings.desc.DATA_SOURCE_RETRY_BACKOFF': '้‡่ฏ•้—ด้š”ๆ—ถ้—ด๏ผˆ็ง’๏ผ‰', - 'settings.desc.CCXT_DEFAULT_EXCHANGE': 'CCXT้ป˜่ฎคไบคๆ˜“ๆ‰€๏ผˆbinance, coinbase, okx็ญ‰๏ผ‰', - 'settings.desc.CCXT_TIMEOUT': 'CCXT่ฏทๆฑ‚่ถ…ๆ—ถๆ—ถ้—ด๏ผˆๆฏซ็ง’๏ผ‰', - 'settings.desc.CCXT_PROXY': 'CCXT่ฏทๆฑ‚ไปฃ็†ๅœฐๅ€๏ผˆๅฆ‚ socks5h://127.0.0.1:1080๏ผ‰', - 'settings.desc.FINNHUB_API_KEY': 'Finnhub APIๅฏ†้’ฅ๏ผŒ็”จไบŽ็พŽ่‚กๆ•ฐๆฎ๏ผˆๆœ‰ๅ…่ดน้ขๅบฆ๏ผ‰', - 'settings.desc.FINNHUB_TIMEOUT': 'Finnhub API่ฏทๆฑ‚่ถ…ๆ—ถๆ—ถ้—ด', - 'settings.desc.FINNHUB_RATE_LIMIT': 'Finnhub API้€Ÿ็އ้™ๅˆถ๏ผˆๆฏๅˆ†้’Ÿ่ฏทๆฑ‚ๆ•ฐ๏ผ‰', - 'settings.desc.TIINGO_API_KEY': 'Tiingo APIๅฏ†้’ฅ๏ผŒ็”จไบŽๅค–ๆฑ‡/่ดต้‡‘ๅฑžๆ•ฐๆฎ๏ผˆๅ…่ดน็‰ˆไธๆ”ฏๆŒ1ๅˆ†้’Ÿๆ•ฐๆฎ๏ผ‰', - 'settings.desc.TIINGO_TIMEOUT': 'Tiingo API่ฏทๆฑ‚่ถ…ๆ—ถๆ—ถ้—ด', - 'settings.desc.AKSHARE_TIMEOUT': 'Akshare API่ถ…ๆ—ถๆ—ถ้—ด๏ผŒ็”จไบŽA่‚กๆ•ฐๆฎ', - 'settings.desc.YFINANCE_TIMEOUT': 'Yahoo Finance API่ถ…ๆ—ถๆ—ถ้—ด', - 'settings.desc.SIGNAL_WEBHOOK_URL': 'ไฟกๅท้€š็ŸฅWebhookๅœฐๅ€๏ผˆPOST JSON๏ผ‰', - 'settings.desc.SIGNAL_WEBHOOK_TOKEN': 'Webhook่ฎค่ฏไปค็‰Œ๏ผŒ้€š่ฟ‡่ฏทๆฑ‚ๅคดๅ‘้€', - 'settings.desc.SIGNAL_NOTIFY_TIMEOUT_SEC': '้€š็Ÿฅ่ฏทๆฑ‚่ถ…ๆ—ถๆ—ถ้—ด', - 'settings.desc.TELEGRAM_BOT_TOKEN': 'Telegramๆœบๅ™จไบบToken๏ผŒไปŽ@BotFather่Žทๅ–', - 'settings.desc.SMTP_HOST': 'SMTP้‚ฎไปถๆœๅŠกๅ™จๅœฐๅ€๏ผˆๅฆ‚ smtp.gmail.com๏ผ‰', - 'settings.desc.SMTP_PORT': 'SMTP็ซฏๅฃ๏ผˆTLS็”จ587๏ผŒSSL็”จ465๏ผŒๆ˜Žๆ–‡็”จ25๏ผ‰', - 'settings.desc.SMTP_USER': 'SMTP่ฎค่ฏ็”จๆˆทๅ๏ผˆ้€šๅธธๆ˜ฏ้‚ฎ็ฎฑๅœฐๅ€๏ผ‰', - 'settings.desc.SMTP_PASSWORD': 'SMTP่ฎค่ฏๅฏ†็ ๆˆ–ๅบ”็”จไธ“็”จๅฏ†็ ', - 'settings.desc.SMTP_FROM': '้‚ฎไปถๅ‘ไปถไบบๅœฐๅ€', - 'settings.desc.SMTP_USE_TLS': 'ๅฏ็”จSTARTTLSๅŠ ๅฏ†๏ผˆๆŽจ่็ซฏๅฃ587๏ผ‰', - 'settings.desc.SMTP_USE_SSL': 'ๅฏ็”จSSLๅŠ ๅฏ†๏ผˆ็ซฏๅฃ465๏ผ‰', - 'settings.desc.TWILIO_ACCOUNT_SID': 'Twilio่ดฆๆˆทSID๏ผŒไปŽๆŽงๅˆถๅฐ่Žทๅ–', - 'settings.desc.TWILIO_AUTH_TOKEN': 'Twilio่ฎค่ฏToken๏ผŒไปŽๆŽงๅˆถๅฐ่Žทๅ–', - 'settings.desc.TWILIO_FROM_NUMBER': 'Twilioๅ‘้€็Ÿญไฟก็š„ๅท็ ๏ผˆๅฆ‚ +1234567890๏ผ‰', - 'settings.desc.ENABLE_AGENT_MEMORY': 'ๅฏ็”จAI Agent่ฎฐๅฟ†ๅŠŸ่ƒฝ๏ผŒ็”จไบŽๅญฆไน ๅކๅฒไบคๆ˜“', - 'settings.desc.AGENT_MEMORY_ENABLE_VECTOR': 'ๅฏ็”จๆœฌๅœฐๅ‘้‡็›ธไผผๅบฆๆœ็ดข่ฟ›่กŒ่ฎฐๅฟ†ๆฃ€็ดข', - 'settings.desc.AGENT_MEMORY_EMBEDDING_DIM': '่ฎฐๅฟ†ๅ‘้‡ๅตŒๅ…ฅ็ปดๅบฆ', - 'settings.desc.AGENT_MEMORY_TOP_K': 'ๆฃ€็ดขๆ—ถ่ฟ”ๅ›ž็š„็›ธไผผ่ฎฐๅฟ†ๆ•ฐ้‡', - 'settings.desc.AGENT_MEMORY_CANDIDATE_LIMIT': '็›ธไผผๅบฆๆœ็ดข็š„ๅ€™้€‰่ฎฐๅฟ†ไธŠ้™', - 'settings.desc.AGENT_MEMORY_HALF_LIFE_DAYS': '่ฎฐๅฟ†ๆ—ถ้—ด่กฐๅ‡็š„ๅŠ่กฐๆœŸ๏ผˆๅคฉ๏ผ‰', - 'settings.desc.AGENT_MEMORY_W_SIM': '่ฎฐๅฟ†ๆŽ’ๅบไธญ็›ธไผผๅบฆๅˆ†ๆ•ฐ็š„ๆƒ้‡(0-1)', - 'settings.desc.AGENT_MEMORY_W_RECENCY': '่ฎฐๅฟ†ๆŽ’ๅบไธญๆ—ถ้—ดๆ–ฐ่ฟ‘ๅบฆ็š„ๆƒ้‡(0-1)', - 'settings.desc.AGENT_MEMORY_W_RETURNS': '่ฎฐๅฟ†ๆŽ’ๅบไธญๆ”ถ็›Š่กจ็Žฐ็š„ๆƒ้‡(0-1)', - 'settings.desc.ENABLE_REFLECTION_WORKER': 'ๅฏ็”จๅŽๅฐ่‡ชๅŠจไบคๆ˜“ๅๆ€Worker', - 'settings.desc.REFLECTION_WORKER_INTERVAL_SEC': '่‡ชๅŠจๅๆ€่ฟ่กŒ้—ด้š”๏ผˆ้ป˜่ฎค24ๅฐๆ—ถ๏ผ‰', - 'settings.desc.PROXY_HOST': 'ไปฃ็†ๆœๅŠกๅ™จไธปๆœบๅๆˆ–IP', - 'settings.desc.PROXY_PORT': 'ไปฃ็†ๆœๅŠกๅ™จ็ซฏๅฃ๏ผˆ็•™็ฉบๅˆ™็ฆ็”จไปฃ็†๏ผ‰', - 'settings.desc.PROXY_SCHEME': 'ไปฃ็†ๅ่ฎฎ็ฑปๅž‹ใ€‚socks5h ่กจ็คบDNSไนŸ่ตฐไปฃ็†', - 'settings.desc.PROXY_URL': 'ๅฎŒๆ•ดไปฃ็†URL๏ผˆ่ฎพ็ฝฎๅŽ่ฆ†็›–ไธŠ้ข็š„้…็ฝฎ๏ผ‰', - 'settings.desc.SEARCH_PROVIDER': '็ฝ‘้กตๆœ็ดขๆไพ›ๅ•†๏ผŒ็”จไบŽAI็ ”็ฉถๅŠŸ่ƒฝใ€‚ๅšๆŸฅ(Bocha)ๆŽจ่็”จไบŽA่‚กๆ–ฐ้—ป', - 'settings.desc.SEARCH_MAX_RESULTS': 'ๆœ็ดข่ฟ”ๅ›ž็š„ๆœ€ๅคง็ป“ๆžœๆ•ฐ', - 'settings.desc.TAVILY_API_KEYS': 'Tavilyๆœ็ดขAPIๅฏ†้’ฅ๏ผŒๅคšไธช็”จ้€—ๅทๅˆ†้š”ๅฏ่ฝฎๆขใ€‚ๅ…่ดน1000ๆฌก/ๆœˆ', - 'settings.desc.BOCHA_API_KEYS': 'ๅšๆŸฅๆœ็ดขAPIๅฏ†้’ฅ๏ผŒๅคšไธช็”จ้€—ๅทๅˆ†้š”ๅฏ่ฝฎๆขใ€‚A่‚กๆ–ฐ้—ปๆœ็ดขๆ•ˆๆžœๆœ€ไฝณ', - 'settings.desc.SERPAPI_KEYS': 'SerpAPIๅฏ†้’ฅ๏ผŒ็”จไบŽGoogle/Bingๆœ็ดข๏ผŒๅคšไธช็”จ้€—ๅทๅˆ†้š”ๅฏ่ฝฎๆข', - 'settings.desc.SEARCH_GOOGLE_API_KEY': 'Google่‡ชๅฎšไน‰ๆœ็ดขAPIๅฏ†้’ฅ', - 'settings.desc.SEARCH_GOOGLE_CX': 'Googleๅฏ็ผ–็จ‹ๆœ็ดขๅผ•ๆ“ŽID (CX)', - 'settings.desc.SEARCH_BING_API_KEY': 'Microsoft Bing็ฝ‘้กตๆœ็ดขAPIๅฏ†้’ฅ', - 'settings.desc.INTERNAL_API_KEY': 'ๅ†…้ƒจAPI่ฎค่ฏๅฏ†้’ฅ๏ผŒ็”จไบŽๆœๅŠก้—ด่ฐƒ็”จ', - 'settings.desc.CORS_ORIGINS': 'ๅ…่ฎธ็š„CORSๆฅๆบ๏ผˆ* ่กจ็คบๅ…จ้ƒจ๏ผŒๆˆ–้€—ๅทๅˆ†้š”็š„ๅˆ—่กจ๏ผ‰', - 'settings.desc.RATE_LIMIT': 'ๆฏIPๆฏๅˆ†้’Ÿ็š„API่ฏทๆฑ‚้™ๅˆถ', - 'settings.desc.ENABLE_CACHE': 'ๅฏ็”จๅ“ๅบ”็ผ“ๅญ˜ไปฅๆ้ซ˜ๆ€ง่ƒฝ', - 'settings.desc.ENABLE_REQUEST_LOG': '่ฎฐๅฝ•ๆ‰€ๆœ‰API่ฏทๆฑ‚ๆ—ฅๅฟ—๏ผŒ็”จไบŽ่ฐƒ่ฏ•', - 'settings.desc.ENABLE_AI_ANALYSIS': 'ๅฏ็”จAI้ฉฑๅŠจ็š„ๅธ‚ๅœบๅˆ†ๆžๅŠŸ่ƒฝ', - - // Portfolio - ่ต„ไบง็›‘ๆต‹ - 'portfolio.summary.totalValue': 'ๆ€ปๅธ‚ๅ€ผ', - 'portfolio.summary.totalCost': 'ๆ€ปๆˆๆœฌ', - 'portfolio.summary.totalPnl': 'ๆ€ป็›ˆไบ', - 'portfolio.summary.positionCount': 'ๆŒไป“ๆ•ฐ้‡', - 'portfolio.summary.profitLossRatio': '็›ˆๅˆฉ/ไบๆŸ', - 'portfolio.summary.today': 'ไปŠๆ—ฅ', - 'portfolio.summary.todayPnl': 'ไปŠๆ—ฅ็›ˆไบ', - 'portfolio.summary.bestPerformer': 'ๆœ€ไฝณ่กจ็Žฐ', - 'portfolio.summary.worstPerformer': 'ๆœ€ๅทฎ่กจ็Žฐ', - 'portfolio.summary.priceSync': 'ไปทๆ ผๅŒๆญฅ', - 'portfolio.summary.syncInterval': 'ๅˆทๆ–ฐ้—ด้š”', - 'portfolio.summary.justNow': 'ๅˆšๅˆš', - 'portfolio.summary.ago': 'ๅ‰', - 'portfolio.positions.title': 'ๆˆ‘็š„ๆŒไป“', - 'portfolio.positions.add': 'ๆทปๅŠ ๆŒไป“', - 'portfolio.positions.addFirst': 'ๆทปๅŠ ็ฌฌไธ€็ฌ”ๆŒไป“', - 'portfolio.positions.empty': 'ๆš‚ๆ— ๆŒไป“่ฎฐๅฝ•', - 'portfolio.positions.deleteConfirm': '็กฎๅฎšๅˆ ้™ค่ฟ™็ฌ”ๆŒไป“ๅ—๏ผŸ', - 'portfolio.positions.currentPrice': '็Žฐไปท', - 'portfolio.positions.entryPrice': 'ไนฐๅ…ฅไปท', - 'portfolio.positions.quantity': 'ๆ•ฐ้‡', - 'portfolio.positions.side': 'ๆ–นๅ‘', - 'portfolio.positions.long': 'ๅšๅคš', - 'portfolio.positions.short': 'ๅš็ฉบ', - 'portfolio.positions.marketValue': 'ๅธ‚ๅ€ผ', - 'portfolio.positions.pnl': '็›ˆไบ', - 'portfolio.positions.items': 'ไธชๆŒไป“', - 'portfolio.monitors.title': 'AI ็›‘ๆŽง', - 'portfolio.monitors.add': 'ๆทปๅŠ ็›‘ๆŽง', - 'portfolio.monitors.addFirst': 'ๆทปๅŠ  AI ็›‘ๆŽง', - 'portfolio.monitors.empty': 'ๆš‚ๆ— ็›‘ๆŽงไปปๅŠก', - 'portfolio.monitors.deleteConfirm': '็กฎๅฎšๅˆ ้™ค่ฟ™ไธช็›‘ๆŽงไปปๅŠกๅ—๏ผŸ', - 'portfolio.monitors.interval': 'ๆ‰ง่กŒ้—ด้š”', - 'portfolio.monitors.lastRun': 'ไธŠๆฌกๆ‰ง่กŒ', - 'portfolio.monitors.nextRun': 'ไธ‹ๆฌกๆ‰ง่กŒ', - 'portfolio.monitors.channels': '้€š็Ÿฅๆธ ้“', - 'portfolio.monitors.runNow': '็ซ‹ๅณๆ‰ง่กŒ', - 'portfolio.monitors.analysisResult': 'AI ๅˆ†ๆž็ป“ๆžœ', - 'portfolio.monitors.runningTitle': 'AI ๅˆ†ๆžๅทฒๅฏๅŠจ', - 'portfolio.monitors.runningDesc': 'ๅˆ†ๆžๆญฃๅœจๅŽๅฐ่ฟ่กŒ๏ผŒๅฎŒๆˆๅŽไผš้€š่ฟ‡้€š็ŸฅๆŽจ้€็ป“ๆžœใ€‚ๅˆ†ๆžๅคšไธชๆŒไป“ๅฏ่ƒฝ้œ€่ฆๅ‡ ๅˆ†้’Ÿๆ—ถ้—ดใ€‚', - 'portfolio.monitors.timeoutTitle': '่ฏทๆฑ‚่ถ…ๆ—ถ', - 'portfolio.monitors.timeoutDesc': 'ๅˆ†ๆžๅฏ่ƒฝๆญฃๅœจๅŽๅฐ่ฟ่กŒไธญ๏ผŒ่ฏท็จๅŽๆŸฅ็œ‹้€š็Ÿฅ่Žทๅ–็ป“ๆžœใ€‚ๅฆ‚ๆžœ้•ฟๆ—ถ้—ดๆฒกๆœ‰ๆ”ถๅˆฐ้€š็Ÿฅ๏ผŒ่ฏท้‡่ฏ•ใ€‚', - 'portfolio.modal.addPosition': 'ๆทปๅŠ ๆŒไป“', - 'portfolio.modal.editPosition': '็ผ–่พ‘ๆŒไป“', - 'portfolio.modal.addMonitor': 'ๆทปๅŠ ็›‘ๆŽง', - 'portfolio.modal.editMonitor': '็ผ–่พ‘็›‘ๆŽง', - 'portfolio.form.market': 'ๅธ‚ๅœบ', - 'portfolio.form.marketRequired': '่ฏท้€‰ๆ‹ฉๅธ‚ๅœบ', - 'portfolio.form.selectMarket': '้€‰ๆ‹ฉๅธ‚ๅœบ', - 'portfolio.form.symbol': 'ๆ ‡็š„ไปฃ็ ', - 'portfolio.form.symbolRequired': '่ฏท่พ“ๅ…ฅๆ ‡็š„ไปฃ็ ', - 'portfolio.form.searchSymbol': 'ๆœ็ดขๆˆ–่พ“ๅ…ฅๆ ‡็š„ไปฃ็ ', - 'portfolio.form.useAsSymbol': 'ไฝฟ็”จ', - 'portfolio.form.asSymbolCode': 'ไฝœไธบๆ ‡็š„ไปฃ็ ', - 'portfolio.form.symbolHint': 'ๅฏๆœ็ดขๆ ‡็š„ๅบ“๏ผŒๆˆ–็›ดๆŽฅ่พ“ๅ…ฅไปปๆ„ไปฃ็ ', - 'portfolio.form.side': 'ๆ–นๅ‘', - 'portfolio.form.quantity': 'ๆ•ฐ้‡', - 'portfolio.form.quantityRequired': '่ฏท่พ“ๅ…ฅๆ•ฐ้‡', - 'portfolio.form.enterQuantity': '่พ“ๅ…ฅๆŒไป“ๆ•ฐ้‡', - 'portfolio.form.entryPrice': 'ไนฐๅ…ฅไปท', - 'portfolio.form.entryPriceRequired': '่ฏท่พ“ๅ…ฅไนฐๅ…ฅไปท', - 'portfolio.form.enterEntryPrice': '่พ“ๅ…ฅไนฐๅ…ฅไปทๆ ผ', - 'portfolio.form.notes': 'ๅค‡ๆณจ', - 'portfolio.form.enterNotes': 'ๅฏ้€‰๏ผšๆทปๅŠ ๅค‡ๆณจ', - 'portfolio.form.monitorName': '็›‘ๆŽงๅ็งฐ', - 'portfolio.form.monitorNameRequired': '่ฏท่พ“ๅ…ฅ็›‘ๆŽงๅ็งฐ', - 'portfolio.form.enterMonitorName': 'ไพ‹ๅฆ‚๏ผšๆฏๆ—ฅ็ป„ๅˆๅˆ†ๆž', - 'portfolio.form.interval': 'ๆ‰ง่กŒ้—ด้š”', - 'portfolio.form.minutes': 'ๅˆ†้’Ÿ', - 'portfolio.form.hour': 'ๅฐๆ—ถ', - 'portfolio.form.hours': 'ๅฐๆ—ถ', - 'portfolio.form.notifyChannels': '้€š็Ÿฅๆธ ้“', - 'portfolio.form.browser': 'ๆต่งˆๅ™จ้€š็Ÿฅ', - 'portfolio.form.email': '้‚ฎไปถ', - 'portfolio.form.telegramChatId': 'Telegram Chat ID', - 'portfolio.form.enterTelegramChatId': '่พ“ๅ…ฅ Telegram Chat ID', - 'portfolio.form.telegramRequired': '่ฏท่พ“ๅ…ฅ Telegram Chat ID', - 'portfolio.form.emailAddress': '้‚ฎ็ฎฑๅœฐๅ€', - 'portfolio.form.enterEmail': '่พ“ๅ…ฅ้‚ฎ็ฎฑๅœฐๅ€', - 'portfolio.form.emailRequired': '่ฏท่พ“ๅ…ฅ้‚ฎ็ฎฑๅœฐๅ€', - 'portfolio.form.emailInvalid': '่ฏท่พ“ๅ…ฅๆœ‰ๆ•ˆ็š„้‚ฎ็ฎฑๅœฐๅ€', - 'portfolio.form.customPrompt': '่‡ชๅฎšไน‰ๆ็คบ', - 'portfolio.form.customPromptPlaceholder': 'ๅฏ้€‰๏ผšๆทปๅŠ ็‰นๅˆซๅ…ณๆณจ็‚น๏ผŒไพ‹ๅฆ‚"้‡็‚นๅ…ณๆณจ็ง‘ๆŠ€่‚ก้ฃŽ้™ฉ"', - 'portfolio.form.monitorScope': '็›‘ๆŽง่Œƒๅ›ด', - 'portfolio.form.allPositions': 'ๅ…จ้ƒจๆŒไป“', - 'portfolio.form.selectedPositions': 'ๆŒ‡ๅฎšๆŒไป“', - 'portfolio.form.selectPositions': '้€‰ๆ‹ฉๆŒไป“', - 'portfolio.form.selectAll': 'ๅ…จ้€‰', - 'portfolio.form.deselectAll': 'ๅ…จไธ้€‰', - 'portfolio.form.selectedCount': 'ๅทฒ้€‰ {count}/{total}', - 'portfolio.form.pleaseSelectPositions': '่ฏท่‡ณๅฐ‘้€‰ๆ‹ฉไธ€ไธชๆŒไป“่ฟ›่กŒ็›‘ๆŽง', - 'portfolio.form.notificationFromProfile': '้€š็Ÿฅๅฐ†ๅ‘้€ๅˆฐๆ‚จๅœจไธชไบบไธญๅฟƒ้…็ฝฎ็š„ๅœฐๅ€', - 'portfolio.form.goToProfile': 'ๅ‰ๅพ€้…็ฝฎ', - 'portfolio.message.loadFailed': 'ๅŠ ่ฝฝๆ•ฐๆฎๅคฑ่ดฅ', - 'portfolio.message.saveSuccess': 'ไฟๅญ˜ๆˆๅŠŸ', - 'portfolio.message.saveFailed': 'ไฟๅญ˜ๅคฑ่ดฅ', - 'portfolio.message.deleteSuccess': 'ๅˆ ้™คๆˆๅŠŸ', - 'portfolio.message.deleteFailed': 'ๅˆ ้™คๅคฑ่ดฅ', - 'portfolio.message.updateFailed': 'ๆ›ดๆ–ฐๅคฑ่ดฅ', - 'portfolio.message.monitorEnabled': '็›‘ๆŽงๅทฒๅฏ็”จ', - 'portfolio.message.monitorDisabled': '็›‘ๆŽงๅทฒๆš‚ๅœ', - 'portfolio.message.monitorRunSuccess': 'ๅˆ†ๆžๅฎŒๆˆ', - 'portfolio.message.monitorRunFailed': 'ๅˆ†ๆžๅคฑ่ดฅ', - 'portfolio.message.monitorRunning': 'AI ๅˆ†ๆžๅทฒๅฏๅŠจ๏ผŒ่ฏท็ญ‰ๅพ…้€š็Ÿฅ', - // Portfolio - ๅˆ†็ป„ - 'portfolio.groups.all': 'ๅ…จ้ƒจๆŒไป“', - 'portfolio.groups.ungrouped': 'ๆœชๅˆ†็ป„', - 'portfolio.form.group': 'ๅˆ†็ป„', - 'portfolio.form.enterGroup': '่พ“ๅ…ฅๆˆ–้€‰ๆ‹ฉๅˆ†็ป„', - // Portfolio - ้ข„่ญฆ - 'portfolio.alerts.title': 'ไปทๆ ผ/็›ˆไบ้ข„่ญฆ', - 'portfolio.alerts.addAlert': 'ๆทปๅŠ ้ข„่ญฆ', - 'portfolio.alerts.editAlert': '็ผ–่พ‘้ข„่ญฆ', - 'portfolio.alerts.alertType': '้ข„่ญฆ็ฑปๅž‹', - 'portfolio.alerts.priceAbove': 'ไปทๆ ผ้ซ˜ไบŽ', - 'portfolio.alerts.priceBelow': 'ไปทๆ ผไฝŽไบŽ', - 'portfolio.alerts.pnlAbove': '็›ˆๅˆฉ้ซ˜ไบŽ (%)', - 'portfolio.alerts.pnlBelow': 'ไบๆŸไฝŽไบŽ (%)', - 'portfolio.alerts.threshold': '้˜ˆๅ€ผ', - 'portfolio.alerts.thresholdRequired': '่ฏท่พ“ๅ…ฅ้˜ˆๅ€ผ', - 'portfolio.alerts.enterPrice': '่พ“ๅ…ฅไปทๆ ผ', - 'portfolio.alerts.enterPercent': '่พ“ๅ…ฅ็™พๅˆ†ๆฏ”', - 'portfolio.alerts.currentPrice': 'ๅฝ“ๅ‰ไปทๆ ผ', - 'portfolio.alerts.currentPriceHint': 'ๅฝ“ๅ‰ไปทๆ ผ', - 'portfolio.alerts.repeatInterval': '้‡ๅคๆ้†’', - 'portfolio.alerts.noRepeat': 'ไธ้‡ๅค (่งฆๅ‘ไธ€ๆฌก)', - 'portfolio.alerts.every5min': 'ๆฏ 5 ๅˆ†้’Ÿ', - 'portfolio.alerts.every15min': 'ๆฏ 15 ๅˆ†้’Ÿ', - 'portfolio.alerts.every30min': 'ๆฏ 30 ๅˆ†้’Ÿ', - 'portfolio.alerts.every1hour': 'ๆฏ 1 ๅฐๆ—ถ', - 'portfolio.alerts.every4hours': 'ๆฏ 4 ๅฐๆ—ถ', - 'portfolio.alerts.onceDaily': 'ๆฏๅคฉไธ€ๆฌก', - 'portfolio.alerts.enabled': 'ๅฏ็”จ้ข„่ญฆ', - 'portfolio.alerts.enabledDesc': 'ๅผ€ๅฏๅŽๅฐ†่‡ชๅŠจ็›‘ๆต‹ๅนถ่งฆๅ‘้€š็Ÿฅ', - 'portfolio.alerts.delete': 'ๅˆ ้™ค', - 'portfolio.alerts.deleteConfirm': '็กฎๅฎš่ฆๅˆ ้™คๆญค้ข„่ญฆๅ—๏ผŸ', - 'portfolio.modal.addAlert': 'ๆทปๅŠ ้ข„่ญฆ', - 'portfolio.modal.editAlert': '็ผ–่พ‘้ข„่ญฆ', - - // User Management - 'menu.userManage': '็”จๆˆท็ฎก็†', - 'menu.myProfile': 'ไธชไบบไธญๅฟƒ', - 'common.actions': 'ๆ“ไฝœ', - 'common.refresh': 'ๅˆทๆ–ฐ', - - 'userManage.title': '็”จๆˆท็ฎก็†', - 'userManage.searchPlaceholder': 'ๆœ็ดข็”จๆˆทๅ/้‚ฎ็ฎฑ/ๆ˜ต็งฐ', - 'userManage.description': '็ฎก็†็ณป็ปŸ็”จๆˆทใ€่ง’่‰ฒๅ’Œๆƒ้™', - 'userManage.createUser': 'ๅˆ›ๅปบ็”จๆˆท', - 'userManage.editUser': '็ผ–่พ‘็”จๆˆท', - 'userManage.username': '็”จๆˆทๅ', - 'userManage.password': 'ๅฏ†็ ', - 'userManage.nickname': 'ๆ˜ต็งฐ', - 'userManage.email': '้‚ฎ็ฎฑ', - 'userManage.role': '่ง’่‰ฒ', - 'userManage.status': '็Šถๆ€', - 'userManage.lastLogin': 'ๆœ€ๅŽ็™ปๅฝ•', - 'userManage.active': 'ๅฏ็”จ', - 'userManage.disabled': '็ฆ็”จ', - 'userManage.neverLogin': 'ไปŽๆœช็™ปๅฝ•', - 'userManage.usernameRequired': '่ฏท่พ“ๅ…ฅ็”จๆˆทๅ', - 'userManage.usernamePlaceholder': '่พ“ๅ…ฅ็”จๆˆทๅ', - 'userManage.passwordRequired': '่ฏท่พ“ๅ…ฅๅฏ†็ ', - 'userManage.passwordPlaceholder': '่พ“ๅ…ฅๅฏ†็ ๏ผˆ่‡ณๅฐ‘6ไฝ๏ผ‰', - 'userManage.passwordMin': 'ๅฏ†็ ่‡ณๅฐ‘6ไธชๅญ—็ฌฆ', - 'userManage.nicknamePlaceholder': '่พ“ๅ…ฅๆ˜ต็งฐ', - 'userManage.emailPlaceholder': '่พ“ๅ…ฅ้‚ฎ็ฎฑ', - 'userManage.emailInvalid': '้‚ฎ็ฎฑๆ ผๅผไธๆญฃ็กฎ', - 'userManage.rolePlaceholder': '้€‰ๆ‹ฉ่ง’่‰ฒ', - 'userManage.statusPlaceholder': '้€‰ๆ‹ฉ็Šถๆ€', - 'userManage.resetPassword': '้‡็ฝฎๅฏ†็ ', - 'userManage.resetPasswordWarning': 'ๆญคๆ“ไฝœๅฐ†้‡็ฝฎ็”จๆˆทๅฏ†็ ', - 'userManage.newPassword': 'ๆ–ฐๅฏ†็ ', - 'userManage.newPasswordPlaceholder': '่พ“ๅ…ฅๆ–ฐๅฏ†็ ', - 'userManage.confirmDelete': '็กฎๅฎš่ฆๅˆ ้™คๆญค็”จๆˆทๅ—๏ผŸ', - 'userManage.roleAdmin': '็ฎก็†ๅ‘˜', - 'userManage.roleManager': '็ป็†', - 'userManage.roleUser': 'ๆ™ฎ้€š็”จๆˆท', - 'userManage.roleViewer': '่ฎฟๅฎข', - - // Profile - 'profile.title': 'ไธชไบบไธญๅฟƒ', - 'profile.description': '็ฎก็†ๆ‚จ็š„่ดฆๆˆท่ฎพ็ฝฎๅ’Œๅๅฅฝ', - 'profile.basicInfo': 'ๅŸบๆœฌไฟกๆฏ', - 'profile.changePassword': 'ไฟฎๆ”นๅฏ†็ ', - 'profile.username': '็”จๆˆทๅ', - 'profile.nickname': 'ๆ˜ต็งฐ', - 'profile.email': '้‚ฎ็ฎฑ', - 'profile.lastLogin': 'ๆœ€ๅŽ็™ปๅฝ•', - 'profile.nicknamePlaceholder': '่พ“ๅ…ฅๆ‚จ็š„ๆ˜ต็งฐ', - 'profile.emailPlaceholder': '่พ“ๅ…ฅๆ‚จ็š„้‚ฎ็ฎฑ', - 'profile.emailInvalid': '้‚ฎ็ฎฑๆ ผๅผไธๆญฃ็กฎ', - 'profile.emailCannotChange': 'ๆณจๅ†ŒๅŽ้‚ฎ็ฎฑไธๅฏไฟฎๆ”น', - 'profile.passwordHint': 'ๅฏ†็ ่‡ณๅฐ‘้œ€่ฆ6ไธชๅญ—็ฌฆ', - 'profile.oldPassword': 'ๅฝ“ๅ‰ๅฏ†็ ', - 'profile.newPassword': 'ๆ–ฐๅฏ†็ ', - 'profile.confirmPassword': '็กฎ่ฎคๅฏ†็ ', - 'profile.oldPasswordRequired': '่ฏท่พ“ๅ…ฅๅฝ“ๅ‰ๅฏ†็ ', - 'profile.oldPasswordPlaceholder': '่พ“ๅ…ฅๅฝ“ๅ‰ๅฏ†็ ', - 'profile.newPasswordRequired': '่ฏท่พ“ๅ…ฅๆ–ฐๅฏ†็ ', - 'profile.newPasswordPlaceholder': '่พ“ๅ…ฅๆ–ฐๅฏ†็ ', - 'profile.confirmPasswordRequired': '่ฏท็กฎ่ฎคๆ–ฐๅฏ†็ ', - 'profile.confirmPasswordPlaceholder': 'ๅ†ๆฌก่พ“ๅ…ฅๆ–ฐๅฏ†็ ', - 'profile.passwordMin': 'ๅฏ†็ ่‡ณๅฐ‘6ไธชๅญ—็ฌฆ', - 'profile.passwordMismatch': 'ไธคๆฌก่พ“ๅ…ฅ็š„ๅฏ†็ ไธไธ€่‡ด', - - // Profile - Credits - 'profile.credits.title': 'ๆˆ‘็š„็งฏๅˆ†', - 'profile.credits.unit': '็งฏๅˆ†', - 'profile.credits.recharge': 'ๅผ€้€š/ๅ……ๅ€ผ', - 'profile.credits.vipExpires': 'VIPๆœ‰ๆ•ˆๆœŸ่‡ณ', - 'profile.credits.vipExpired': 'VIPๅทฒ่ฟ‡ๆœŸ', - 'profile.credits.noVip': '้žVIP็”จๆˆท', - 'profile.credits.hint': 'ไฝฟ็”จAIๅˆ†ๆž/ๅ›žๆต‹/็›‘ๆŽง็ญ‰ๅŠŸ่ƒฝไผšๆถˆ่€—็งฏๅˆ†๏ผ›VIPไป…ๅฏๅ…่ดนไฝฟ็”จVIPๅ…่ดนๆŒ‡ๆ ‡ใ€‚', - - // Profile - Credits Log (ๆถˆ่ดน่ฎฐๅฝ•) - 'profile.creditsLog': 'ๆถˆ่ดน่ฎฐๅฝ•', - 'profile.creditsLog.time': 'ๆ—ถ้—ด', - 'profile.creditsLog.action': '็ฑปๅž‹', - 'profile.creditsLog.amount': 'ๅ˜ๅŠจ', - 'profile.creditsLog.balance': 'ไฝ™้ข', - 'profile.creditsLog.remark': 'ๅค‡ๆณจ', - 'profile.creditsLog.actionConsume': 'ๆถˆ่ดน', - 'profile.creditsLog.actionRecharge': 'ๅ……ๅ€ผ', - 'profile.creditsLog.actionAdjust': '่ฐƒๆ•ด', - 'profile.creditsLog.actionRefund': '้€€ๆฌพ', - 'profile.creditsLog.actionVipGrant': 'VIPๆŽˆไบˆ', - 'profile.creditsLog.actionVipRevoke': 'VIPๅ–ๆถˆ', - 'profile.creditsLog.actionRegisterBonus': 'ๆณจๅ†Œๅฅ–ๅŠฑ', - 'profile.creditsLog.actionReferralBonus': '้‚€่ฏทๅฅ–ๅŠฑ', - 'profile.creditsLog.actionIndicatorPurchase': '่ดญไนฐๆŒ‡ๆ ‡', - 'profile.creditsLog.actionIndicatorSale': 'ๅ‡บๅ”ฎๆŒ‡ๆ ‡', - - // Profile - Referral (้‚€่ฏท) - 'profile.referral.title': '้‚€่ฏทๅฅฝๅ‹', - 'profile.referral.listTab': '้‚€่ฏทๅˆ—่กจ', - 'profile.referral.totalInvited': 'ๅทฒ้‚€่ฏท', - 'profile.referral.bonusPerInvite': 'ๆฏ้‚€่ฏท่Žทๅพ—', - 'profile.referral.yourLink': 'ๆ‚จ็š„้‚€่ฏท้“พๆŽฅ', - 'profile.referral.copyLink': 'ๅคๅˆถ้“พๆŽฅ', - 'profile.referral.linkCopied': '้‚€่ฏท้“พๆŽฅๅทฒๅคๅˆถ', - 'profile.referral.newUserBonus': 'ๆ–ฐ็”จๆˆทๆณจๅ†Œ่Žทๅพ—', - 'profile.referral.user': '็”จๆˆท', - 'profile.referral.registerTime': 'ๆณจๅ†Œๆ—ถ้—ด', - 'profile.referral.noReferrals': 'ๆš‚ๆ— ้‚€่ฏท่ฎฐๅฝ•', - 'profile.referral.shareNow': '็ซ‹ๅณๅˆ†ไบซ้‚€่ฏท', - - // Profile - Notification Settings (้€š็Ÿฅ่ฎพ็ฝฎ) - 'profile.notifications.title': '้€š็Ÿฅ่ฎพ็ฝฎ', - 'profile.notifications.hint': '้…็ฝฎๆ‚จ็š„้ป˜่ฎค้€š็Ÿฅๆ–นๅผ๏ผŒๅœจๅˆ›ๅปบ่ต„ไบง็›‘ๆŽงๅ’Œ้ข„่ญฆๆ—ถๅฐ†่‡ชๅŠจไฝฟ็”จ่ฟ™ไบ›่ฎพ็ฝฎ', - 'profile.notifications.defaultChannels': '้ป˜่ฎค้€š็Ÿฅๆธ ้“', - 'profile.notifications.browser': '็ซ™ๅ†…้€š็Ÿฅ', - 'profile.notifications.email': '้‚ฎไปถ', - 'profile.notifications.phone': '็Ÿญไฟก', - 'profile.notifications.telegramBotToken': 'Telegram Bot Token', - 'profile.notifications.telegramBotTokenPlaceholder': '่ฏท่พ“ๅ…ฅๆ‚จ็š„ Telegram Bot Token', - 'profile.notifications.telegramBotTokenHint': '้€š่ฟ‡ @BotFather ๅˆ›ๅปบๆœบๅ™จไบบ่Žทๅ– Token', - 'profile.notifications.telegramChatId': 'Telegram Chat ID', - 'profile.notifications.telegramPlaceholder': '่ฏท่พ“ๅ…ฅๆ‚จ็š„ Telegram Chat ID๏ผˆๅฆ‚ 123456789๏ผ‰', - 'profile.notifications.telegramHint': 'ๅ‘้€ /start ็ป™ @userinfobot ๅฏ่Žทๅ–ๆ‚จ็š„ Chat ID', - 'profile.notifications.notifyEmail': '้€š็Ÿฅ้‚ฎ็ฎฑ', - 'profile.notifications.emailPlaceholder': 'ๆŽฅๆ”ถ้€š็Ÿฅ็š„้‚ฎ็ฎฑๅœฐๅ€', - 'profile.notifications.emailHint': '้ป˜่ฎคไฝฟ็”จ่ดฆๆˆท้‚ฎ็ฎฑ๏ผŒๅฏ่ฎพ็ฝฎๅ…ถไป–้‚ฎ็ฎฑๆŽฅๆ”ถ้€š็Ÿฅ', - 'profile.notifications.phonePlaceholder': '่ฏท่พ“ๅ…ฅๆ‰‹ๆœบๅท๏ผˆๅฆ‚ +8613800138000๏ผ‰', - 'profile.notifications.phoneHint': '้œ€่ฆ็ฎก็†ๅ‘˜้…็ฝฎ Twilio ๆœๅŠกๅŽๆ‰่ƒฝไฝฟ็”จ็Ÿญไฟก้€š็Ÿฅ', - 'profile.notifications.discordWebhook': 'Discord Webhook', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'ๅœจ Discord ๆœๅŠกๅ™จ่ฎพ็ฝฎไธญๅˆ›ๅปบ Webhook', - 'profile.notifications.webhookUrl': 'Webhook URL', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': '่‡ชๅฎšไน‰ Webhook ๅœฐๅ€๏ผŒๅฐ†ไปฅ POST JSON ๆ–นๅผๆŽจ้€้€š็Ÿฅ', - 'profile.notifications.webhookToken': 'Webhook Token๏ผˆๅฏ้€‰๏ผ‰', - 'profile.notifications.webhookTokenPlaceholder': '็”จไบŽ้ชŒ่ฏ่ฏทๆฑ‚็š„ Bearer Token', - 'profile.notifications.webhookTokenHint': 'ๅฐ†ไฝœไธบ Authorization: Bearer Token ๅ‘้€ๅˆฐ Webhook', - 'profile.notifications.testBtn': 'ๅ‘้€ๆต‹่ฏ•้€š็Ÿฅ', - 'profile.notifications.saveSuccess': '้€š็Ÿฅ่ฎพ็ฝฎไฟๅญ˜ๆˆๅŠŸ', - 'profile.notifications.selectChannel': '่ฏท่‡ณๅฐ‘้€‰ๆ‹ฉไธ€ไธช้€š็Ÿฅๆธ ้“', - 'profile.notifications.fillTelegramToken': '่ฏทๅกซๅ†™ Telegram Bot Token', - 'profile.notifications.fillTelegram': '่ฏทๅกซๅ†™ Telegram Chat ID', - 'profile.notifications.fillEmail': '่ฏทๅกซๅ†™้€š็Ÿฅ้‚ฎ็ฎฑ', - 'profile.notifications.testSent': 'ๆต‹่ฏ•้€š็Ÿฅๅทฒๅ‘้€๏ผŒ่ฏทๆฃ€ๆŸฅๆ‚จ็š„้€š็Ÿฅๆธ ้“', - - // User Manage - Credits & VIP - 'userManage.credits': '็งฏๅˆ†', - 'userManage.adjustCredits': '่ฐƒๆ•ด็งฏๅˆ†', - 'userManage.setVip': '่ฎพ็ฝฎVIP', - 'userManage.currentCredits': 'ๅฝ“ๅ‰็งฏๅˆ†', - 'userManage.newCredits': 'ๆ–ฐ็งฏๅˆ†', - 'userManage.enterCredits': '่พ“ๅ…ฅๆ–ฐ็š„็งฏๅˆ†ๆ•ฐ้‡', - 'userManage.creditsNonNegative': '็งฏๅˆ†ไธ่ƒฝไธบ่ดŸๆ•ฐ', - 'userManage.currentVip': 'ๅฝ“ๅ‰VIP็Šถๆ€', - 'userManage.vipActive': 'ๆœ‰ๆ•ˆ', - 'userManage.vipExpired': 'ๅทฒ่ฟ‡ๆœŸ', - 'userManage.vipDays': 'VIPๅคฉๆ•ฐ', - 'userManage.vipExpiresAt': 'VIP่ฟ‡ๆœŸๆ—ถ้—ด', - 'userManage.cancelVip': 'ๅ–ๆถˆVIP', - 'userManage.days': 'ๅคฉ', - 'userManage.customDate': '่‡ชๅฎšไน‰ๆ—ฅๆœŸ', - 'userManage.selectDate': '่ฏท้€‰ๆ‹ฉๆ—ฅๆœŸ', - 'userManage.remark': 'ๅค‡ๆณจ', - 'userManage.remarkPlaceholder': 'ๅฏ้€‰ๅค‡ๆณจ', - 'userManage.tabUsers': '็”จๆˆท็ฎก็†', - - // System Overview (Admin) - 'systemOverview.tabTitle': '็ณป็ปŸๆ€ป่งˆ', - 'systemOverview.totalStrategies': '็ญ–็•ฅๆ€ปๆ•ฐ', - 'systemOverview.runningStrategies': '่ฟ่กŒไธญ', - 'systemOverview.totalCapital': 'ๆ€ป่ต„้‡‘', - 'systemOverview.totalPnl': 'ๆ€ป็›ˆไบ', - 'systemOverview.filterAll': 'ๅ…จ้ƒจ็Šถๆ€', - 'systemOverview.filterRunning': '่ฟ่กŒไธญ', - 'systemOverview.filterStopped': 'ๅทฒๅœๆญข', - 'systemOverview.searchPlaceholder': 'ๆœ็ดข็ญ–็•ฅๅ/ไบคๆ˜“ๅฏน/็”จๆˆทๅ', - 'systemOverview.running': '่ฟ่กŒไธญ', - 'systemOverview.stopped': 'ๅทฒๅœๆญข', - 'systemOverview.colUser': '็”จๆˆท', - 'systemOverview.colStrategy': '็ญ–็•ฅๅ็งฐ', - 'systemOverview.colStatus': '็Šถๆ€', - 'systemOverview.colSymbol': 'ไบคๆ˜“ๅฏน', - 'systemOverview.colCapital': '่ต„้‡‘', - 'systemOverview.colPnl': '็›ˆไบ / ROI', - 'systemOverview.colPositions': 'ๆŒไป“', - 'systemOverview.colTrades': 'ไบคๆ˜“ๆฌกๆ•ฐ', - 'systemOverview.colIndicator': 'ๆŒ‡ๆ ‡', - 'systemOverview.colExchange': 'ไบคๆ˜“ๆ‰€', - 'systemOverview.colTimeframe': 'ๅ‘จๆœŸ', - 'systemOverview.colLeverage': 'ๆ ๆ†', - 'systemOverview.colCreatedAt': 'ๅˆ›ๅปบๆ—ถ้—ด', - 'systemOverview.realized': 'ๅทฒๅฎž็Žฐ', - 'systemOverview.unrealized': 'ๆœชๅฎž็Žฐ', - 'systemOverview.symbols': 'ไธชไบคๆ˜“ๅฏน', - 'systemOverview.live': 'ๅฎž็›˜', - 'systemOverview.signal': 'ไป…้€š็Ÿฅ', - - // Settings - Billing - 'settings.group.billing': '่ฎก่ดน้…็ฝฎ', - 'settings.field.BILLING_ENABLED': 'ๅฏ็”จ่ฎก่ดน', - 'settings.field.BILLING_VIP_BYPASS': 'VIPๆ—่ทฏ๏ผˆๆ—ง๏ผ‰', - 'settings.field.BILLING_COST_AI_ANALYSIS': 'AIๅˆ†ๆžๆถˆ่€—', - 'settings.field.BILLING_COST_STRATEGY_RUN': '็ญ–็•ฅ่ฟ่กŒๆถˆ่€—', - 'settings.field.BILLING_COST_BACKTEST': 'ๅ›žๆต‹ๆถˆ่€—', - 'settings.field.BILLING_COST_PORTFOLIO_MONITOR': 'Portfolio็›‘ๆŽงๆถˆ่€—', - 'settings.field.CREDITS_REGISTER_BONUS': 'ๆณจๅ†Œๅฅ–ๅŠฑ', - 'settings.field.CREDITS_REFERRAL_BONUS': '้‚€่ฏทๅฅ–ๅŠฑ', - 'settings.field.RECHARGE_TELEGRAM_URL': 'ๅ……ๅ€ผTelegram้“พๆŽฅ', - 'settings.field.MEMBERSHIP_MONTHLY_PRICE_USD': 'ๅŒ…ๆœˆไผšๅ‘˜ไปทๆ ผ๏ผˆUSD๏ผ‰', - 'settings.field.MEMBERSHIP_MONTHLY_CREDITS': 'ๅŒ…ๆœˆไผšๅ‘˜่ต ้€็งฏๅˆ†', - 'settings.field.MEMBERSHIP_YEARLY_PRICE_USD': 'ๅŒ…ๅนดไผšๅ‘˜ไปทๆ ผ๏ผˆUSD๏ผ‰', - 'settings.field.MEMBERSHIP_YEARLY_CREDITS': 'ๅŒ…ๅนดไผšๅ‘˜่ต ้€็งฏๅˆ†', - 'settings.field.MEMBERSHIP_LIFETIME_PRICE_USD': 'ๆฐธไน…ไผšๅ‘˜ไปทๆ ผ๏ผˆUSD๏ผ‰', - 'settings.field.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS': 'ๆฐธไน…ไผšๅ‘˜ๆฏๆœˆ่ต ้€็งฏๅˆ†', - 'settings.field.USDT_PAY_ENABLED': 'ๅฏ็”จUSDTๆ”ถๆฌพ', - 'settings.field.USDT_PAY_CHAIN': 'USDT็ฝ‘็ปœ', - 'settings.field.USDT_TRC20_XPUB': 'TRC20 XPUB๏ผˆไป…่ง‚ๅฏŸ๏ผ‰', - 'settings.field.USDT_TRC20_CONTRACT': 'USDT TRC20 ๅˆ็บฆๅœฐๅ€', - 'settings.field.TRONGRID_BASE_URL': 'TronGrid Base URL', - 'settings.field.TRONGRID_API_KEY': 'TronGrid API Key', - 'settings.field.USDT_PAY_CONFIRM_SECONDS': '็กฎ่ฎคๅปถ่ฟŸ๏ผˆ็ง’๏ผ‰', - 'settings.field.USDT_PAY_EXPIRE_MINUTES': '่ฎขๅ•่ฟ‡ๆœŸ๏ผˆๅˆ†้’Ÿ๏ผ‰', - 'settings.desc.BILLING_ENABLED': 'ๅฏ็”จ่ฎก่ดน็ณป็ปŸใ€‚ๅฏ็”จๅŽ๏ผŒ็”จๆˆทไฝฟ็”จๆŸไบ›ๅŠŸ่ƒฝ้œ€่ฆๆถˆ่€—็งฏๅˆ†', - 'settings.desc.BILLING_VIP_BYPASS': 'ๆ—งๅผ€ๅ…ณ๏ผšๅผ€ๅฏๅŽVIPๅฐ†ๆ—่ทฏๆ‰€ๆœ‰ๅŠŸ่ƒฝๆ‰ฃ็งฏๅˆ†๏ผˆไธๆŽจ่๏ผ‰ใ€‚ๅปบ่ฎฎๅ…ณ้—ญ๏ผŒVIPไป…็”จไบŽโ€œVIPๅ…่ดนๆŒ‡ๆ ‡โ€ใ€‚', - 'settings.desc.BILLING_COST_AI_ANALYSIS': 'ๆฏๆฌกAIๅˆ†ๆžๆถˆ่€—็š„็งฏๅˆ†ๆ•ฐ', - 'settings.desc.BILLING_COST_STRATEGY_RUN': 'ๅฏๅŠจ็ญ–็•ฅๆ—ถๆถˆ่€—็š„็งฏๅˆ†ๆ•ฐ', - 'settings.desc.BILLING_COST_BACKTEST': 'ๆฏๆฌกๅ›žๆต‹ๆถˆ่€—็š„็งฏๅˆ†ๆ•ฐ', - 'settings.desc.BILLING_COST_PORTFOLIO_MONITOR': 'ๆฏๆฌกPortfolio AI็›‘ๆŽงๆถˆ่€—็š„็งฏๅˆ†ๆ•ฐ', - 'settings.desc.CREDITS_REGISTER_BONUS': 'ๆ–ฐ็”จๆˆทๆณจๅ†Œๆ—ถ่Žทๅพ—็š„็งฏๅˆ†ๅฅ–ๅŠฑ', - 'settings.desc.CREDITS_REFERRAL_BONUS': '็”จๆˆท้€š่ฟ‡้‚€่ฏท้“พๆŽฅๆˆๅŠŸ้‚€่ฏทๆ–ฐ็”จๆˆทๆ—ถ๏ผŒ้‚€่ฏทไบบ่Žทๅพ—็š„็งฏๅˆ†ๅฅ–ๅŠฑ', - 'settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS': '้ชŒ่ฏ็ ้ชŒ่ฏๅคฑ่ดฅ็š„ๆœ€ๅคงๅฐ่ฏ•ๆฌกๆ•ฐ๏ผŒ่ถ…่ฟ‡ๅŽๅฐ†้”ๅฎš', - 'settings.desc.VERIFICATION_CODE_LOCK_MINUTES': '้ชŒ่ฏ็ ้ชŒ่ฏๅคฑ่ดฅๆฌกๆ•ฐ่ถ…่ฟ‡้™ๅˆถๅŽ็š„้”ๅฎšๆ—ถ้•ฟ๏ผˆๅˆ†้’Ÿ๏ผ‰', - 'settings.desc.RECHARGE_TELEGRAM_URL': '็”จๆˆท็‚นๅ‡ปๅ……ๅ€ผๆ—ถ่ทณ่ฝฌ็š„Telegramๅฎขๆœ้“พๆŽฅ', - 'settings.desc.MEMBERSHIP_MONTHLY_PRICE_USD': 'ๅŒ…ๆœˆไผšๅ‘˜็š„ไปทๆ ผ๏ผˆUSD๏ผ‰ใ€‚ๅฝ“ๅ‰ไธบๆจกๆ‹Ÿๆ”ฏไป˜๏ผŒๅŽ็ปญๅฏๆŽฅๅ…ฅ็œŸๅฎžๆ”ฏไป˜็ฝ‘ๅ…ณใ€‚', - 'settings.desc.MEMBERSHIP_MONTHLY_CREDITS': '่ดญไนฐๅŒ…ๆœˆไผšๅ‘˜ๅŽ็ซ‹ๅณ่ต ้€ๅˆฐ่ดฆๅท็š„็งฏๅˆ†ๆ•ฐ้‡ใ€‚', - 'settings.desc.MEMBERSHIP_YEARLY_PRICE_USD': 'ๅŒ…ๅนดไผšๅ‘˜็š„ไปทๆ ผ๏ผˆUSD๏ผ‰ใ€‚ๅฝ“ๅ‰ไธบๆจกๆ‹Ÿๆ”ฏไป˜๏ผŒๅŽ็ปญๅฏๆŽฅๅ…ฅ็œŸๅฎžๆ”ฏไป˜็ฝ‘ๅ…ณใ€‚', - 'settings.desc.MEMBERSHIP_YEARLY_CREDITS': '่ดญไนฐๅŒ…ๅนดไผšๅ‘˜ๅŽ็ซ‹ๅณ่ต ้€ๅˆฐ่ดฆๅท็š„็งฏๅˆ†ๆ•ฐ้‡ใ€‚', - 'settings.desc.MEMBERSHIP_LIFETIME_PRICE_USD': 'ๆฐธไน…ไผšๅ‘˜็š„ไปทๆ ผ๏ผˆUSD๏ผ‰ใ€‚ๅฝ“ๅ‰ไธบๆจกๆ‹Ÿๆ”ฏไป˜๏ผŒๅŽ็ปญๅฏๆŽฅๅ…ฅ็œŸๅฎžๆ”ฏไป˜็ฝ‘ๅ…ณใ€‚', - 'settings.desc.MEMBERSHIP_LIFETIME_MONTHLY_CREDITS': 'ๆฐธไน…ไผšๅ‘˜ๆฏ30ๅคฉ่‡ชๅŠจๅ‘ๆ”พไธ€ๆฌก็š„็งฏๅˆ†ๆ•ฐ้‡๏ผˆ้ฆ–ๆฌก่ดญไนฐไผš็ซ‹ๅˆปๅ‘ๆ”พไธ€ๆฌก๏ผ‰ใ€‚', - 'settings.desc.USDT_PAY_ENABLED': 'ๅผ€ๅฏๅŽ๏ผŒไผšๅ‘˜่ดญไนฐ้กตไผšๆไพ› USDT ๆ‰ซ็ ๆ”ฏไป˜๏ผˆๆฏๅ•็‹ฌ็ซ‹ๅœฐๅ€ + ่‡ชๅŠจๅฏน่ดฆ๏ผ‰ใ€‚', - 'settings.desc.USDT_PAY_CHAIN': 'ๅฝ“ๅ‰็‰ˆๆœฌไป…ๆ”ฏๆŒ TRC20ใ€‚', - 'settings.desc.USDT_TRC20_XPUB': 'ไป…่ง‚ๅฏŸ xpub๏ผŒ็”จไบŽๆดพ็”Ÿๆฏไธช่ฎขๅ•็š„ๆ”ถๆฌพๅœฐๅ€ใ€‚ไธ่ฆๅกซๅ†™็ง้’ฅ/ๅŠฉ่ฎฐ่ฏใ€‚', - 'settings.desc.USDT_TRC20_CONTRACT': 'TRON ้“พไธŠ USDT ๅˆ็บฆๅœฐๅ€๏ผˆ้ป˜่ฎคๅทฒๅกซๅ†™๏ผ‰ใ€‚', - 'settings.desc.TRONGRID_BASE_URL': 'TronGrid API ๅŸบ็ก€ๅœฐๅ€๏ผˆ้ป˜่ฎคๅณๅฏ๏ผ‰ใ€‚', - 'settings.desc.TRONGRID_API_KEY': 'ๅฏ้€‰ใ€‚็”จไบŽๆ้ซ˜ TronGrid ่ฐƒ็”จ้ขๅบฆ/็จณๅฎšๆ€งใ€‚', - 'settings.desc.USDT_PAY_CONFIRM_SECONDS': 'ๆฃ€ๆต‹ๅˆฐๅˆฐ่ดฆๅŽ๏ผŒ็ญ‰ๅพ…ๆŒ‡ๅฎš็ง’ๆ•ฐๅ†ๆ ‡่ฎฐโ€œ็กฎ่ฎคโ€๏ผŒ้™ไฝŽๆž็ซฏๅ›žๆปš้ฃŽ้™ฉใ€‚', - 'settings.desc.USDT_PAY_EXPIRE_MINUTES': '็”จๆˆทๆ‰ซ็ ๆ”ฏไป˜็š„่ฎขๅ•ๆœ‰ๆ•ˆๆœŸ๏ผŒ่ฟ‡ๆœŸๅŽ้œ€้‡ๆ–ฐ็”Ÿๆˆ่ฎขๅ•ใ€‚', - - // Global Market - 'globalMarket.title': 'ๅ…จ็ƒ้‡‘่ž้ขๆฟ', - 'globalMarket.fearGreedShort': 'ๆ่ดช', - 'globalMarket.calendar': '่ดข็ปๆ—ฅๅކ', - 'globalMarket.lastUpdate': 'ๆœ€ๅŽๆ›ดๆ–ฐ', - 'globalMarket.refresh': 'ๅˆทๆ–ฐๆ•ฐๆฎ', - 'globalMarket.name': 'ๅ็งฐ', - 'globalMarket.price': 'ไปทๆ ผ', - 'globalMarket.change': 'ๆถจ่ทŒ', - 'globalMarket.trend': '่ตฐๅŠฟ', - 'globalMarket.pair': '่ดงๅธๅฏน', - 'globalMarket.unit': 'ๅ•ไฝ', - 'globalMarket.refreshSuccess': 'ๆ•ฐๆฎๅˆทๆ–ฐๆˆๅŠŸ', - 'globalMarket.refreshError': 'ๆ•ฐๆฎๅˆทๆ–ฐๅคฑ่ดฅ', - 'globalMarket.fetchError': '่Žทๅ–ๆ•ฐๆฎๅคฑ่ดฅ', - 'globalMarket.loading': 'ๅŠ ่ฝฝไธญ...', - 'globalMarket.fearGreedIndex': 'ๆๆƒง่ดชๅฉชๆŒ‡ๆ•ฐ', - 'globalMarket.fearGreedTip': 'ๆๆƒง่ดชๅฉชๆŒ‡ๆ•ฐ่กก้‡ๅธ‚ๅœบๆƒ…็ปช๏ผŒ0่กจ็คบๆžๅบฆๆๆƒง๏ผŒ100่กจ็คบๆžๅบฆ่ดชๅฉช', - 'globalMarket.volatilityIndex': 'ๆณขๅŠจ็އๆŒ‡ๆ•ฐ', - 'globalMarket.dollarIndex': '็พŽๅ…ƒๆŒ‡ๆ•ฐ', - 'globalMarket.majorIndices': 'ไธป่ฆๆŒ‡ๆ•ฐ', - 'globalMarket.vixTitle': 'VIX ๆณขๅŠจ็އๆŒ‡ๆ•ฐ', - 'globalMarket.vixTip': 'VIXๆŒ‡ๆ•ฐ่กก้‡ๅธ‚ๅœบ้ข„ๆœŸๆณขๅŠจ็އ๏ผŒๆ•ฐๅ€ผ่ถŠ้ซ˜่กจ็คบๅธ‚ๅœบ่ถŠๆๆ…Œ', - 'globalMarket.extremeFear': 'ๆžๅบฆๆๆƒง', - 'globalMarket.fear': 'ๆๆƒง', - 'globalMarket.neutral': 'ไธญๆ€ง', - 'globalMarket.greed': '่ดชๅฉช', - 'globalMarket.extremeGreed': 'ๆžๅบฆ่ดชๅฉช', - 'globalMarket.marketOverview': 'ๅ…จ็ƒๅธ‚ๅœบๆฆ‚่งˆ', - 'globalMarket.indices': 'ไธป่ฆๆŒ‡ๆ•ฐ', - 'globalMarket.forex': 'ๅค–ๆฑ‡ๅธ‚ๅœบ', - 'globalMarket.crypto': 'ๅŠ ๅฏ†่ดงๅธ', - 'globalMarket.commodities': 'ๅคงๅฎ—ๅ•†ๅ“', - 'globalMarket.heatmap': 'ๅธ‚ๅœบ็ƒญๅŠ›ๅ›พ', - 'globalMarket.cryptoHeatmap': 'ๅŠ ๅฏ†่ดงๅธ', - 'globalMarket.commoditiesHeatmap': 'ๅคงๅฎ—ๅ•†ๅ“', - 'globalMarket.sectorHeatmap': 'ๆฟๅ—', - 'globalMarket.forexHeatmap': 'ๅค–ๆฑ‡', - 'globalMarket.opportunities': 'ไบคๆ˜“ๆœบไผš', - 'globalMarket.noOpportunities': 'ๆš‚ๆ— ๆ˜Žๆ˜พไบคๆ˜“ๆœบไผš', - 'globalMarket.financialNews': '่ดข็ป่ต„่ฎฏ', - 'globalMarket.noNews': 'ๆš‚ๆ— ๆ–ฐ้—ป', - 'globalMarket.economicCalendar': '่ดข็ปๆ—ฅๅކ', - 'globalMarket.noEvents': 'ๆš‚ๆ— ไบ‹ไปถ', - 'globalMarket.actual': 'ๅฎž้™…', - 'globalMarket.forecast': '้ข„ๆœŸ', - 'globalMarket.previous': 'ๅ‰ๅ€ผ', - 'globalMarket.signal.bullish': '็œ‹ๆถจ่ถ‹ๅŠฟ', - 'globalMarket.signal.bearish': '็œ‹่ทŒ่ถ‹ๅŠฟ', - 'globalMarket.signal.overbought': '่ถ…ไนฐ่ญฆๅ‘Š', - 'globalMarket.signal.oversold': '่ถ…ๅ–ๆœบไผš', - 'globalMarket.worldMap': 'ๅ…จ็ƒๅธ‚ๅœบๅœฐๅ›พ', - 'globalMarket.rising': 'ไธŠๆถจ', - 'globalMarket.falling': 'ไธ‹่ทŒ', - 'globalMarket.bullish': 'ๅˆฉๅคš', - 'globalMarket.bearish': 'ๅˆฉ็ฉบ', - 'globalMarket.expectedImpact': '้ข„ๆœŸๅฝฑๅ“', - 'globalMarket.aboveForecast': '้ซ˜ไบŽ้ข„ๆœŸ', - 'globalMarket.belowForecast': 'ไฝŽไบŽ้ข„ๆœŸ', - 'globalMarket.upcomingEvents': 'ๅณๅฐ†ๅ…ฌๅธƒ', - 'globalMarket.releasedEvents': 'ๅทฒๅ…ฌๅธƒๆ•ฐๆฎ', - - // Trading Assistant - 'trading-assistant.form.notificationFromProfile': '้€š็Ÿฅๅฐ†ๅ‘้€ๅˆฐๆ‚จๅœจไธชไบบไธญๅฟƒ้…็ฝฎ็š„ๅœฐๅ€ใ€‚', - 'trading-assistant.form.notificationConfigMissing': 'ๆ‚จ้€‰ไธญ็š„ๆธ ้“่ฟ˜ๆœช้…็ฝฎๅ‚ๆ•ฐ๏ผˆ{channels}๏ผ‰๏ผŒๅฐ†ๆ— ๆณ•ๆŽฅๆ”ถ้€š็Ÿฅใ€‚่ฏทๅ‰ๅพ€ไธชไบบไธญๅฟƒ่ฟ›่กŒ้…็ฝฎใ€‚', - 'trading-assistant.form.goToProfile': 'ๅ‰ๅพ€้…็ฝฎ', - - // Indicator Community - 'community.title': 'ๆŒ‡ๆ ‡ๅธ‚ๅœบ', - 'community.searchPlaceholder': 'ๆœ็ดขๆŒ‡ๆ ‡ๅ็งฐๆˆ–ๆ่ฟฐ...', - 'community.all': 'ๅ…จ้ƒจ', - 'community.freeOnly': 'ๅ…่ดน', - 'community.paidOnly': 'ไป˜่ดน', - 'community.sortNewest': 'ๆœ€ๆ–ฐๅ‘ๅธƒ', - 'community.sortHot': 'ๆœ€็ƒญ้—จ', - 'community.sortRating': '่ฏ„ๅˆ†ๆœ€้ซ˜', - 'community.sortPriceLow': 'ไปทๆ ผไปŽไฝŽๅˆฐ้ซ˜', - 'community.sortPriceHigh': 'ไปทๆ ผไปŽ้ซ˜ๅˆฐไฝŽ', - 'community.myPurchases': 'ๆˆ‘็š„่ดญไนฐ', - 'community.noIndicators': 'ๆš‚ๆ— ๆŒ‡ๆ ‡', - 'community.createFirst': 'ๅ‘ๅธƒ็ฌฌไธ€ไธชๆŒ‡ๆ ‡', - 'community.total': 'ๅ…ฑ', - 'community.items': 'ไธช', - 'community.free': 'ๅ…่ดน', - 'community.credits': '็งฏๅˆ†', - 'community.myIndicator': 'ๆˆ‘็š„ๆŒ‡ๆ ‡', - 'community.purchased': 'ๅทฒ่ดญไนฐ', - 'community.noDescription': 'ๆš‚ๆ— ๆ่ฟฐ', - 'community.loadFailed': 'ๅŠ ่ฝฝๅคฑ่ดฅ', - 'community.publishedAt': 'ๅ‘ๅธƒไบŽ', - 'community.downloads': '่Žทๅ–', - 'community.rating': '่ฏ„ๅˆ†', - 'community.views': 'ๆต่งˆ', - 'community.description': 'ๆŒ‡ๆ ‡่ฏดๆ˜Ž', - 'community.performance': 'ๅฎž็›˜่กจ็Žฐ', - 'community.strategyCount': 'ไฝฟ็”จ็ญ–็•ฅๆ•ฐ', - 'community.tradeCount': 'ไบคๆ˜“ๆฌกๆ•ฐ', - 'community.winRate': '่ƒœ็އ', - 'community.totalProfit': 'ๆ€ปๆ”ถ็›Š', - 'community.reviews': '็”จๆˆท่ฏ„ไปท', - 'community.useNow': '็ซ‹ๅณไฝฟ็”จ', - 'community.getFree': 'ๅ…่ดน่Žทๅ–', - 'community.buyNow': '็ซ‹ๅณ่ดญไนฐ', - 'community.purchaseSuccess': '่ดญไนฐๆˆๅŠŸ๏ผๆŒ‡ๆ ‡ๅทฒๆทปๅŠ ๅˆฐๆ‚จ็š„ๆŒ‡ๆ ‡ๅˆ—่กจ', - 'community.purchaseFailed': '่ดญไนฐๅคฑ่ดฅ', - 'community.indicator_not_found': 'ๆŒ‡ๆ ‡ไธๅญ˜ๅœจๆˆ–ๅทฒไธ‹ๆžถ', - 'community.cannot_buy_own': 'ไธ่ƒฝ่ดญไนฐ่‡ชๅทฑ็š„ๆŒ‡ๆ ‡', - 'community.already_purchased': 'ๆ‚จๅทฒ่ดญไนฐ่ฟ‡ๆญคๆŒ‡ๆ ‡', - 'community.insufficient_credits': '็งฏๅˆ†ไธ่ถณ', - 'community.commentSuccess': '่ฏ„่ฎบๆˆๅŠŸ', - 'community.commentFailed': '่ฏ„่ฎบๅคฑ่ดฅ', - 'community.commentUpdateSuccess': '่ฏ„่ฎบไฟฎๆ”นๆˆๅŠŸ', - 'community.commentUpdateFailed': '่ฏ„่ฎบไฟฎๆ”นๅคฑ่ดฅ๏ผŒ่ฏท้‡่ฏ•', - 'community.editComment': '็ผ–่พ‘่ฏ„่ฎบ', - 'community.cancelEdit': 'ๅ–ๆถˆ', - 'community.updateComment': 'ๆ›ดๆ–ฐ่ฏ„่ฎบ', - 'community.alreadyCommented': 'ๆ‚จๅทฒ่ฏ„่ฎบๆญคๆŒ‡ๆ ‡', - 'community.editMyComment': 'ไฟฎๆ”น่ฏ„่ฎบ', - 'community.me': 'ๆˆ‘', - 'community.edited': 'ๅทฒ็ผ–่พ‘', - 'community.not_purchased': '่ฏทๅ…ˆ่ดญไนฐ/่Žทๅ–ๆŒ‡ๆ ‡ๆ‰่ƒฝ่ฏ„่ฎบ', - 'community.cannot_comment_own': 'ไธ่ƒฝ่ฏ„่ฎบ่‡ชๅทฑ็š„ๆŒ‡ๆ ‡', - 'community.already_commented': 'ๆ‚จๅทฒ็ป่ฏ„่ฎบ่ฟ‡ๆญคๆŒ‡ๆ ‡', - 'community.noComments': 'ๆš‚ๆ— ่ฏ„่ฎบ', - 'community.yourRating': 'ๆ‚จ็š„่ฏ„ๅˆ†', - 'community.commentPlaceholder': 'ๅˆ†ไบซๆ‚จ็š„ไฝฟ็”จไฝ“้ชŒ...', - 'community.submitComment': 'ๆไบค่ฏ„่ฎบ', - 'community.pleaseRate': '่ฏทๅ…ˆ้€‰ๆ‹ฉ่ฏ„ๅˆ†', - 'community.loadMore': 'ๅŠ ่ฝฝๆ›ดๅคš', - 'community.justNow': 'ๅˆšๅˆš', - 'community.minutesAgo': 'ๅˆ†้’Ÿๅ‰', - 'community.hoursAgo': 'ๅฐๆ—ถๅ‰', - 'community.daysAgo': 'ๅคฉๅ‰', - 'community.noPurchases': 'ๆš‚ๆ— ่ดญไนฐ่ฎฐๅฝ•', - 'community.purchasedFrom': 'ๅ–ๅฎถ', - 'community.purchaseTime': '่ดญไนฐๆ—ถ้—ด', - - // ็ฎก็†ๅ‘˜ๅฎกๆ ธๅŠŸ่ƒฝ - 'community.admin.reviewTab': 'ๅฎกๆ ธ็ฎก็†', - 'community.admin.pending': 'ๅพ…ๅฎกๆ ธ', - 'community.admin.approved': 'ๅทฒ้€š่ฟ‡', - 'community.admin.rejected': 'ๅทฒๆ‹’็ป', - 'community.admin.noItems': 'ๆš‚ๆ— ่ฎฐๅฝ•', - 'community.admin.noDescription': 'ๆ— ๆ่ฟฐ', - 'community.admin.viewCode': 'ๆŸฅ็œ‹ไปฃ็ ', - 'community.admin.note': 'ๅฎกๆ ธๅค‡ๆณจ', - 'community.admin.approve': '้€š่ฟ‡', - 'community.admin.reject': 'ๆ‹’็ป', - 'community.admin.unpublish': 'ไธ‹ๆžถ', - 'community.admin.delete': 'ๅˆ ้™ค', - 'community.admin.deleteConfirm': '็กฎๅฎš่ฆๅˆ ้™คๆญคๆŒ‡ๆ ‡ๅ—๏ผŸๆญคๆ“ไฝœไธๅฏๆ’ค้”€ใ€‚', - 'community.admin.unpublishConfirm': '็กฎๅฎš่ฆไธ‹ๆžถๆญคๆŒ‡ๆ ‡ๅ—๏ผŸ', - 'community.admin.unpublishHint': 'ไธ‹ๆžถๅŽ่ฏฅๆŒ‡ๆ ‡ๅฐ†ไธๅ†ๅœจๅธ‚ๅœบๆ˜พ็คบ', - 'community.admin.confirm': '็กฎๅฎš', - 'community.admin.cancel': 'ๅ–ๆถˆ', - 'community.admin.approveTitle': '้€š่ฟ‡ๅฎกๆ ธ', - 'community.admin.rejectTitle': 'ๆ‹’็ปๅฎกๆ ธ', - 'community.admin.noteLabel': 'ๅฎกๆ ธๅค‡ๆณจ๏ผˆๅฏ้€‰๏ผ‰', - 'community.admin.notePlaceholder': '่ฏท่พ“ๅ…ฅๅฎกๆ ธๅค‡ๆณจ...', - 'community.admin.loadFailed': 'ๅŠ ่ฝฝๅคฑ่ดฅ', - 'community.admin.reviewSuccess': 'ๅฎกๆ ธๆˆๅŠŸ', - 'community.admin.reviewFailed': 'ๅฎกๆ ธๅคฑ่ดฅ', - 'community.admin.unpublishSuccess': 'ไธ‹ๆžถๆˆๅŠŸ', - 'community.admin.unpublishFailed': 'ไธ‹ๆžถๅคฑ่ดฅ', - 'community.admin.deleteSuccess': 'ๅˆ ้™คๆˆๅŠŸ', - 'community.admin.deleteFailed': 'ๅˆ ้™คๅคฑ่ดฅ', - - // Fast Analysis (ๅฟซ้€ŸAIๅˆ†ๆž) - 'fastAnalysis.aiAnalysis': 'AI ๆ™บ่ƒฝๅˆ†ๆž', - 'fastAnalysis.analyzing': 'AI ๆญฃๅœจๅˆ†ๆžไธญ...', - 'fastAnalysis.pleaseWait': '่ฏท็จๅ€™๏ผŒๆญฃๅœจ่Žทๅ–ๅฎžๆ—ถๆ•ฐๆฎๅนถ็”Ÿๆˆไธ“ไธšๆŠฅๅ‘Š', - 'fastAnalysis.error': 'ๅˆ†ๆžๅคฑ่ดฅ', - 'fastAnalysis.retry': '้‡่ฏ•', - 'fastAnalysis.selectSymbol': '้€‰ๆ‹ฉๆ ‡็š„ๅผ€ๅง‹ๅˆ†ๆž', - 'fastAnalysis.selectHint': 'ไปŽๅทฆไพง่‡ช้€‰ๅˆ—่กจ้€‰ๆ‹ฉๆˆ–ๆทปๅŠ ๆ–ฐๆ ‡็š„', - 'fastAnalysis.confidence': '็ฝฎไฟกๅบฆ', - 'fastAnalysis.currentPrice': 'ๅฝ“ๅ‰ไปทๆ ผ', - 'fastAnalysis.entryPrice': 'ๅปบ่ฎฎๅ…ฅๅœบ', - 'fastAnalysis.stopLoss': 'ๆญขๆŸไปท', - 'fastAnalysis.takeProfit': 'ๆญข็›ˆ็›ฎๆ ‡', - 'fastAnalysis.stopLossHint': 'ๅŸบไบŽ2ๅ€ATRๅ’Œๆ”ฏๆ’‘ไฝ่ฎก็ฎ—', - 'fastAnalysis.takeProfitHint': 'ๅŸบไบŽ3ๅ€ATRๅ’Œ้˜ปๅŠ›ไฝ่ฎก็ฎ—', - 'fastAnalysis.atrBased': 'ๅŸบไบŽATRๆณขๅŠจ็އ', - 'fastAnalysis.riskReward': '้ฃŽ้™ฉๅ›žๆŠฅๆฏ”', - 'fastAnalysis.technical': 'ๆŠ€ๆœฏ้ข', - 'fastAnalysis.fundamental': 'ๅŸบๆœฌ้ข', - 'fastAnalysis.sentiment': 'ๆƒ…็ปช้ข', - 'fastAnalysis.overall': '็ปผๅˆ่ฏ„ๅˆ†', - 'fastAnalysis.keyReasons': 'ๆ ธๅฟƒ็†็”ฑ', - 'fastAnalysis.risks': '้ฃŽ้™ฉๆ็คบ', - 'fastAnalysis.indicators': 'ๆŠ€ๆœฏๆŒ‡ๆ ‡', - 'fastAnalysis.maTrend': 'ๅ‡็บฟ่ถ‹ๅŠฟ', - 'fastAnalysis.support': 'ๆ”ฏๆ’‘ไฝ', - 'fastAnalysis.resistance': '้˜ปๅŠ›ไฝ', - 'fastAnalysis.volatility': 'ๆณขๅŠจๆ€ง', - 'fastAnalysis.wasHelpful': '่ฟ™ๆฌกๅˆ†ๆžๅฏนๆ‚จๆœ‰ๅธฎๅŠฉๅ—๏ผŸ', - 'fastAnalysis.helpful': 'ๆœ‰ๅธฎๅŠฉ', - 'fastAnalysis.notHelpful': '้œ€ๆ”น่ฟ›', - 'fastAnalysis.feedbackThanks': 'ๆ„Ÿ่ฐขๆ‚จ็š„ๅ้ฆˆ๏ผ', - 'fastAnalysis.feedbackFailed': 'ๅ้ฆˆๆไบคๅคฑ่ดฅ', - 'fastAnalysis.feedbackUnavailable': 'ๅ้ฆˆๅŠŸ่ƒฝๆš‚ไธๅฏ็”จ๏ผŒ่ฏท้‡ๆ–ฐๅˆ†ๆžๅŽ้‡่ฏ•', - 'fastAnalysis.analysisTime': 'ๅˆ†ๆž่€—ๆ—ถ', - 'fastAnalysis.startAnalysis': 'ๅผ€ๅง‹ๅˆ†ๆž', - 'fastAnalysis.history': 'ๅކๅฒ่ฎฐๅฝ•', - 'fastAnalysis.systemTitle': 'QUANTDINGER AI', - 'fastAnalysis.systemOnline': '็ณป็ปŸๅœจ็บฟ', - 'fastAnalysis.version': 'ๅฟซ้€Ÿ็‰ˆ', - 'fastAnalysis.preparing': 'ๅ‡†ๅค‡ไธญ...', - 'fastAnalysis.step1': '่Žทๅ–ๅฎžๆ—ถๆ•ฐๆฎ', - 'fastAnalysis.step2': '่ฎก็ฎ—ๆŠ€ๆœฏๆŒ‡ๆ ‡', - 'fastAnalysis.step3': 'AIๆทฑๅบฆๅˆ†ๆž', - 'fastAnalysis.step4': '็”Ÿๆˆไธ“ไธšๆŠฅๅ‘Š', - - // ่ฏฆ็ป†ๅˆ†ๆžๆ ‡้ข˜ - 'fastAnalysis.technicalAnalysis': 'ๆŠ€ๆœฏ้ขๅˆ†ๆž', - 'fastAnalysis.fundamentalAnalysis': 'ๅŸบๆœฌ้ขๅˆ†ๆž', - 'fastAnalysis.sentimentAnalysis': 'ๅธ‚ๅœบๆƒ…็ปชๅˆ†ๆž', - - // ๆŠ€ๆœฏๆŒ‡ๆ ‡ไฟกๅท็ฟป่ฏ‘ - 'fastAnalysis.signal.bullish': '็œ‹ๆถจ', - 'fastAnalysis.signal.bearish': '็œ‹่ทŒ', - 'fastAnalysis.signal.neutral': 'ไธญๆ€ง', - 'fastAnalysis.signal.overbought': '่ถ…ไนฐ', - 'fastAnalysis.signal.oversold': '่ถ…ๅ–', - 'fastAnalysis.signal.strong_bullish': 'ๅผบ็ƒˆ็œ‹ๆถจ', - 'fastAnalysis.signal.strong_bearish': 'ๅผบ็ƒˆ็œ‹่ทŒ', - - // ่ถ‹ๅŠฟ็ฟป่ฏ‘ - 'fastAnalysis.trend.uptrend': 'ไธŠๅ‡่ถ‹ๅŠฟ', - 'fastAnalysis.trend.downtrend': 'ไธ‹้™่ถ‹ๅŠฟ', - 'fastAnalysis.trend.sideways': 'ๆจช็›˜ๆ•ด็†', - 'fastAnalysis.trend.consolidating': '็›˜ๆ•ด', - 'fastAnalysis.trend.golden_cross': '้‡‘ๅ‰', - 'fastAnalysis.trend.death_cross': 'ๆญปๅ‰', - 'fastAnalysis.trend.strong_uptrend': 'ๅผบๅŠฟไธŠๆถจ', - 'fastAnalysis.trend.strong_downtrend': 'ๅผบๅŠฟไธ‹่ทŒ', - - // ๆณขๅŠจๆ€ง็ฟป่ฏ‘ - 'fastAnalysis.volatilityLevel.high': '้ซ˜', - 'fastAnalysis.volatilityLevel.medium': 'ไธญ', - 'fastAnalysis.volatilityLevel.low': 'ไฝŽ', - 'fastAnalysis.volatilityLevel.unknown': 'ๆœช็Ÿฅ', - - // ๅธ‚ๅœบๆฆ‚่งˆ - 'fastAnalysis.marketOverview': 'ๅธ‚ๅœบๆฆ‚่งˆ', - 'fastAnalysis.selectTip': '้€‰ๆ‹ฉ่‡ช้€‰ๅˆ—่กจไธญ็š„ๆ ‡็š„๏ผŒๅผ€ๅง‹ AI ๆ™บ่ƒฝๅˆ†ๆž', - - // ==================== AI ้‡ๅŒ– ==================== - 'aiQuant.title': 'AI ้‡ๅŒ–', - 'aiQuant.strategyList': '็ญ–็•ฅๅˆ—่กจ', - 'aiQuant.create': 'ๅˆ›ๅปบ', - 'aiQuant.edit': '็ผ–่พ‘', - 'aiQuant.delete': 'ๅˆ ้™ค', - 'aiQuant.start': 'ๅฏๅŠจ', - 'aiQuant.stop': 'ๅœๆญข', - 'aiQuant.analyze': '็ซ‹ๅณๅˆ†ๆž', - 'aiQuant.noStrategy': 'ๆš‚ๆ— ็ญ–็•ฅ๏ผŒ็‚นๅ‡ปๅˆ›ๅปบๅผ€ๅง‹', - 'aiQuant.selectStrategy': '่ฏทไปŽๅทฆไพง้€‰ๆ‹ฉไธ€ไธช็ญ–็•ฅ', - 'aiQuant.createFirst': 'ๅˆ›ๅปบ็ฌฌไธ€ไธช็ญ–็•ฅ', - 'aiQuant.createStrategy': 'ๅˆ›ๅปบ็ญ–็•ฅ', - 'aiQuant.editStrategy': '็ผ–่พ‘็ญ–็•ฅ', - 'aiQuant.confirmDelete': '็กฎๅฎš่ฆๅˆ ้™คๆญค็ญ–็•ฅๅ—๏ผŸ', - 'aiQuant.latestAnalysis': 'ๆœ€ๆ–ฐๅˆ†ๆž็ป“ๆžœ', - 'aiQuant.analysisHistory': 'ๅˆ†ๆžๅކๅฒ', - 'aiQuant.decision': 'ๅ†ณ็ญ–', - 'aiQuant.confidence': '็ฝฎไฟกๅบฆ', - 'aiQuant.currentPrice': 'ๅฝ“ๅ‰ไปทๆ ผ', - 'aiQuant.entryPrice': 'ๅปบ่ฎฎๅ…ฅๅœบ', - 'aiQuant.stopLoss': 'ๆญขๆŸไปท', - 'aiQuant.takeProfit': 'ๆญข็›ˆไปท', - 'aiQuant.reason': '็†็”ฑ', - 'aiQuant.analyzedAt': 'ๅˆ†ๆžๆ—ถ้—ด', - 'aiQuant.tradeSettings': 'ไบคๆ˜“่ฎพ็ฝฎ', - 'aiQuant.minutes': 'ๅˆ†้’Ÿ', - 'aiQuant.hour': 'ๅฐๆ—ถ', - 'aiQuant.hours': 'ๅฐๆ—ถ', - - // AI้‡ๅŒ–็ปŸ่ฎก - 'aiQuant.stats.totalStrategies': '็ญ–็•ฅๆ€ปๆ•ฐ', - 'aiQuant.stats.runningStrategies': '่ฟ่กŒไธญ', - 'aiQuant.stats.totalAnalyses': 'ๅˆ†ๆžๆฌกๆ•ฐ', - 'aiQuant.stats.totalPnl': 'ๆ€ป็›ˆไบ', - - // AI้‡ๅŒ–็Šถๆ€ - 'aiQuant.status.running': '่ฟ่กŒไธญ', - 'aiQuant.status.stopped': 'ๅทฒๅœๆญข', - 'aiQuant.status.paused': 'ๅทฒๆš‚ๅœ', - - // AI้‡ๅŒ–ๆ‰ง่กŒๆจกๅผ - 'aiQuant.executionMode.signal': 'ไป…ไฟกๅท', - 'aiQuant.executionMode.live': 'ๅฎž็›˜ไบคๆ˜“', - - // AI้‡ๅŒ–ๅธ‚ๅœบ็ฑปๅž‹ - 'aiQuant.marketType.spot': '็Žฐ่ดง', - 'aiQuant.marketType.futures': 'ๅˆ็บฆ', - - // AI้‡ๅŒ–ๅญ—ๆฎต - 'aiQuant.field.strategyName': '็ญ–็•ฅๅ็งฐ', - 'aiQuant.field.market': 'ๅธ‚ๅœบ', - 'aiQuant.field.symbol': 'ไบคๆ˜“ๅฏน', - 'aiQuant.field.marketType': 'ๅธ‚ๅœบ็ฑปๅž‹', - 'aiQuant.field.aiModel': 'AI ๆจกๅž‹', - 'aiQuant.field.interval': 'ๅˆ†ๆž้—ด้š”', - 'aiQuant.field.aiPrompt': 'AI ๆ็คบ่ฏ', - 'aiQuant.field.executionMode': 'ๆ‰ง่กŒๆจกๅผ', - 'aiQuant.field.positionSize': 'ไป“ไฝๅคงๅฐ', - 'aiQuant.field.stopLoss': 'ๆญขๆŸๆฏ”ไพ‹', - 'aiQuant.field.takeProfit': 'ๆญข็›ˆๆฏ”ไพ‹', - 'aiQuant.field.totalAnalyses': 'ๅˆ†ๆžๆฌกๆ•ฐ', - 'aiQuant.field.totalTrades': 'ไบคๆ˜“ๆฌกๆ•ฐ', - 'aiQuant.field.totalPnl': 'ๆ€ป็›ˆไบ', - - // AI้‡ๅŒ–ๅ ไฝ็ฌฆ - 'aiQuant.placeholder.strategyName': '่ฏท่พ“ๅ…ฅ็ญ–็•ฅๅ็งฐ', - 'aiQuant.placeholder.market': '่ฏท้€‰ๆ‹ฉๅธ‚ๅœบ', - 'aiQuant.placeholder.symbol': 'ไพ‹ๅฆ‚: BTC/USDT', - 'aiQuant.placeholder.aiModel': '้ป˜่ฎคไฝฟ็”จ็ณป็ปŸ้…็ฝฎ', - 'aiQuant.placeholder.aiPrompt': '่พ“ๅ…ฅๆ‚จ็š„ไบคๆ˜“็ญ–็•ฅๆ็คบ่ฏ๏ผŒไพ‹ๅฆ‚๏ผšๅฝ“RSIไฝŽไบŽ30ๆ—ถ่€ƒ่™‘ไนฐๅ…ฅ...', - - // AI้‡ๅŒ–้ชŒ่ฏๆถˆๆฏ - 'aiQuant.validation.strategyName': '่ฏท่พ“ๅ…ฅ็ญ–็•ฅๅ็งฐ', - 'aiQuant.validation.market': '่ฏท้€‰ๆ‹ฉๅธ‚ๅœบ', - 'aiQuant.validation.symbol': '่ฏท่พ“ๅ…ฅไบคๆ˜“ๅฏน', - - // AI้‡ๅŒ–่กจๆ ผๅˆ— - 'aiQuant.table.decision': 'ๅ†ณ็ญ–', - 'aiQuant.table.confidence': '็ฝฎไฟกๅบฆ', - 'aiQuant.table.entryPrice': 'ๅ…ฅๅœบไปท', - 'aiQuant.table.stopLoss': 'ๆญขๆŸไปท', - 'aiQuant.table.takeProfit': 'ๆญข็›ˆไปท', - 'aiQuant.table.time': 'ๆ—ถ้—ด', - - // AI้‡ๅŒ–ๆถˆๆฏ - 'aiQuant.msg.createSuccess': '็ญ–็•ฅๅˆ›ๅปบๆˆๅŠŸ', - 'aiQuant.msg.updateSuccess': '็ญ–็•ฅๆ›ดๆ–ฐๆˆๅŠŸ', - 'aiQuant.msg.deleteSuccess': '็ญ–็•ฅๅˆ ้™คๆˆๅŠŸ', - 'aiQuant.msg.startSuccess': '็ญ–็•ฅๅทฒๅฏๅŠจ', - 'aiQuant.msg.stopSuccess': '็ญ–็•ฅๅทฒๅœๆญข', - 'aiQuant.msg.analyzeSuccess': 'ๅˆ†ๆžๅฎŒๆˆ', - - // AI้‡ๅŒ–ๆ–ฐๅขžๅญ—ๆฎต - 'aiQuant.field.initialCapital': 'ๆŠ•ๅ…ฅ่ต„้‡‘', - 'aiQuant.field.leverage': 'ๆ ๆ†ๅ€ๆ•ฐ', - 'aiQuant.field.tradeDirection': 'ไบคๆ˜“ๆ–นๅ‘', - 'aiQuant.field.trailingStop': '็งปๅŠจๆญขๆŸ', - 'aiQuant.field.trailingStopPct': '็งปๅŠจๆญขๆŸๆฏ”ไพ‹', - 'aiQuant.direction.long': 'ๅšๅคš', - 'aiQuant.direction.short': 'ๅš็ฉบ', - 'aiQuant.direction.both': 'ๅŒๅ‘', - 'aiQuant.riskControl': '้ฃŽๆŽง่ฎพ็ฝฎ', - 'aiQuant.aiSettings': 'AI่ฎพ็ฝฎ', - 'aiQuant.systemDefault': '็ณป็ปŸ้ป˜่ฎค', - 'aiQuant.placeholder.selectSymbol': 'ไปŽ่‡ช้€‰ๅˆ—่กจ้€‰ๆ‹ฉไบคๆ˜“ๅฏน', - 'aiQuant.hint.symbolFromWatchlist': 'ไปŽๆ‚จ็š„่‡ช้€‰ๅˆ—่กจไธญ้€‰ๆ‹ฉ๏ผŒ็ณป็ปŸ่‡ชๅŠจ่ฏ†ๅˆซๅธ‚ๅœบ็ฑปๅž‹', - 'aiQuant.hint.spotLeverageFixed': '็Žฐ่ดงๅธ‚ๅœบๆ ๆ†ๅ›บๅฎšไธบ1x', - 'aiQuant.hint.stopLossEnforced': 'ๅผบๅˆถๆญขๆŸ๏ผŒAIไธๅฏไฟฎๆ”น', - 'aiQuant.hint.takeProfitEnforced': 'ๅผบๅˆถๆญข็›ˆ๏ผŒAIไธๅฏไฟฎๆ”น', - 'aiQuant.hint.aiPromptOnly': 'AIไป…ๆ นๆฎๆ็คบ่ฏๅˆคๆ–ญๆ–นๅ‘๏ผŒไธไผšไฟฎๆ”นๆ‚จ่ฎพ็ฝฎ็š„้ฃŽๆŽงๅ‚ๆ•ฐ', - 'aiQuant.aiLimitWarning': 'AIๆƒ้™้™ๅˆถ', - 'aiQuant.aiLimitDescription': 'AIๅช่ƒฝๅˆคๆ–ญไบคๆ˜“ๆ–นๅ‘(ไนฐๅ…ฅ/ๅ–ๅ‡บ/ๆŒๆœ‰)๏ผŒๆ ๆ†ๅ€ๆ•ฐใ€ไธ‹ๅ•้‡‘้ขใ€ๆญข็›ˆๆญขๆŸ็ญ‰้ฃŽๆŽงๅ‚ๆ•ฐ็”ฑๆ‚จๅฎŒๅ…จๆŽงๅˆถ๏ผŒAIๆ— ๆณ•ไฟฎๆ”นใ€‚', - 'aiQuant.userStopLoss': 'ๆ‚จ็š„ๆญขๆŸ', - 'aiQuant.userTakeProfit': 'ๆ‚จ็š„ๆญข็›ˆ', - 'aiQuant.userLeverage': 'ๆ‚จ็š„ๆ ๆ†', - 'aiQuant.validation.initialCapital': '่ฏท่พ“ๅ…ฅๆŠ•ๅ…ฅ่ต„้‡‘', - 'aiQuant.table.currentPrice': 'ๅฝ“ๅ‰ไปทๆ ผ', - - // AI้‡ๅŒ–ๆ็คบ่ฏๆจกๆฟ - 'aiQuant.field.promptTemplate': '็ญ–็•ฅๆจกๆฟ', - 'aiQuant.placeholder.selectTemplate': '้€‰ๆ‹ฉ้ข„่ฎพ็ญ–็•ฅๆจกๆฟ', - 'aiQuant.template.default': '๐Ÿ“Š ็ปผๅˆๅˆ†ๆž๏ผˆๆŽจ่๏ผ‰', - 'aiQuant.template.trend': '๐Ÿ“ˆ ่ถ‹ๅŠฟ่ทŸ่ธช', - 'aiQuant.template.swing': '๐Ÿ”„ ๆณขๆฎตไบคๆ˜“', - 'aiQuant.template.news': '๐Ÿ“ฐ ๆ–ฐ้—ป้ฉฑๅŠจ', - 'aiQuant.template.custom': 'โœ๏ธ ่‡ชๅฎšไน‰', - 'aiQuant.hint.dataProvided': '็ณป็ปŸ่‡ชๅŠจๆไพ›๏ผšๅฎžๆ—ถไปทๆ ผใ€ๆŠ€ๆœฏๆŒ‡ๆ ‡(RSI/MACD/ๅ‡็บฟ)ใ€ๆœ€่ฟ‘ๆ–ฐ้—ปใ€ๅฎ่ง‚ๆ•ฐๆฎใ€‚AIๅฐ†ๅŸบไบŽ่ฟ™ไบ›ๆ•ฐๆฎๅ’Œๆ‚จ็š„ๆ็คบ่ฏๅˆคๆ–ญๆ–นๅ‘ใ€‚', - 'aiQuant.hint.liveWarning': 'ๅฎž็›˜ๆจกๅผๅฐ†ไฝฟ็”จ็œŸๅฎž่ต„้‡‘ไบคๆ˜“๏ผŒ่ฏท็กฎไฟๅทฒ้…็ฝฎไบคๆ˜“ๆ‰€APIๅนถๅ……ๅˆ†ไบ†่งฃ้ฃŽ้™ฉ๏ผ', - - // ไบคๆ˜“ๅŠฉๆ‰‹ - ๅฎž็›˜ๅ…่ดฃๅฃฐๆ˜Ž - 'trading-assistant.liveDisclaimer.title': 'ๅฎž็›˜ไบคๆ˜“ๅ…่ดฃๅฃฐๆ˜Ž', - 'trading-assistant.liveDisclaimer.content': 'ๅฎž็›˜ไบคๆ˜“ๅญ˜ๅœจ่พƒ้ซ˜้ฃŽ้™ฉ๏ผŒๅฏ่ƒฝๅฏผ่‡ด้ƒจๅˆ†ๆˆ–ๅ…จ้ƒจ่ต„้‡‘ๆŸๅคฑใ€‚ๅนณๅฐไธไฟ่ฏๆ”ถ็›Šใ€ไธๆ‰ฟ่ฏบ็›ˆๅˆฉใ€‚ไฝ ้œ€่‡ช่กŒ่ฏ„ไผฐ้ฃŽ้™ฉๅนถๅฏนไบคๆ˜“็ป“ๆžœๆ‰ฟๆ‹…ๅ…จ้ƒจ่ดฃไปปใ€‚', - 'trading-assistant.liveDisclaimer.agree': 'ๆˆ‘ๅทฒ้˜…่ฏปๅนถ็†่งฃไธŠ่ฟฐๅ…่ดฃๅฃฐๆ˜Ž๏ผŒไป้€‰ๆ‹ฉๅผ€ๅฏๅฎž็›˜ไบคๆ˜“', - 'trading-assistant.liveDisclaimer.required': 'ๅผ€ๅฏๅฎž็›˜ๅ‰่ฏทๅ…ˆๅ‹พ้€‰ๅ…่ดฃๅฃฐๆ˜Ž็กฎ่ฎค', - 'trading-assistant.liveDisclaimer.blockTitle': '่ฏทๅ…ˆ็กฎ่ฎคๅ…่ดฃๅฃฐๆ˜Ž', - 'trading-assistant.liveDisclaimer.blockDesc': 'ๅ‹พ้€‰ๅ…่ดฃๅฃฐๆ˜ŽๅŽๆ‰ๅฏ็ปง็ปญ้…็ฝฎๅฎž็›˜่ฟžๆŽฅไธŽไธ‹ๅ•ๅ‚ๆ•ฐใ€‚', - - // Billing / Membership - 'menu.billing': 'ไผšๅ‘˜ๅ……ๅ€ผ', - 'billing.title': 'ๅผ€้€šไผšๅ‘˜ / ๅ……ๅ€ผ็งฏๅˆ†', - 'billing.desc': '้€‰ๆ‹ฉ้€‚ๅˆไฝ ็š„ไผšๅ‘˜ๅฅ—้ค๏ผŒๅผ€้€šๅŽไผš่ต ้€็งฏๅˆ†ใ€‚', - 'billing.snapshot.credits': 'ๅฝ“ๅ‰็งฏๅˆ†', - 'billing.snapshot.vip': 'VIP ็Šถๆ€', - 'billing.snapshot.notVip': '้žVIP', - 'billing.snapshot.expires': 'ๅˆฐๆœŸๆ—ถ้—ด', - 'billing.vipRule.title': 'VIP ๆƒ็›Š่ฏดๆ˜Ž', - 'billing.vipRule.desc': 'VIP ไป…ๆ‹ฅๆœ‰ไธ€ไธช็‰นๆฎŠๆƒ้™๏ผšๅฏๅ…่ดนไฝฟ็”จใ€ŒVIPๅ…่ดนๆŒ‡ๆ ‡ใ€ใ€‚ๅ…ถๅฎƒไป˜่ดนๅŠŸ่ƒฝ/ๆŒ‡ๆ ‡ไปไผšๆญฃๅธธๆ‰ฃ็งฏๅˆ†ใ€‚', - 'billing.plan.monthly': 'ๅŒ…ๆœˆไผšๅ‘˜', - 'billing.plan.yearly': 'ๅŒ…ๅนดไผšๅ‘˜', - 'billing.plan.lifetime': 'ๆฐธไน…ไผšๅ‘˜', - 'billing.perMonth': 'ๆœˆ', - 'billing.perYear': 'ๅนด', - 'billing.once': 'ไธ€ๆฌกๆ€ง', - 'billing.credits': '็งฏๅˆ†', - 'billing.lifetimeMonthly': 'ๆฏๆœˆ่ต ้€', - 'billing.buyNow': '็ซ‹ๅณ่ดญไนฐ', - 'billing.purchaseSuccess': '่ดญไนฐๆˆๅŠŸ', - 'billing.purchaseFailed': '่ดญไนฐๅคฑ่ดฅ', - 'billing.usdt.title': 'USDT ๆ‰ซ็ ๆ”ฏไป˜', - 'billing.usdt.hintTitle': '่ฏทไฝฟ็”จ้’ฑๅŒ…ๆ‰ซ็ ๅนถๅฎŒๆˆ่ฝฌ่ดฆ', - 'billing.usdt.hintDesc': '่ฏท็กฎไฟ็ฝ‘็ปœไธŽ้‡‘้ขๆญฃ็กฎ๏ผˆๅฝ“ๅ‰ไป…ๆ”ฏๆŒ TRC20๏ผ‰ใ€‚ๆ”ฏไป˜ๅˆฐ่ดฆๅŽ็ณป็ปŸไผš่‡ชๅŠจๅผ€้€šไผšๅ‘˜ๅนถๅ‘ๆ”พ็งฏๅˆ†ใ€‚', - 'billing.usdt.chain': '็ฝ‘็ปœ', - 'billing.usdt.amount': '้‡‘้ข', - 'billing.usdt.address': 'ๆ”ถๆฌพๅœฐๅ€', - 'billing.usdt.copyAddress': 'ๅคๅˆถๅœฐๅ€', - 'billing.usdt.copyAmount': 'ๅคๅˆถ้‡‘้ข', - 'billing.usdt.refresh': 'ๅˆทๆ–ฐ็Šถๆ€', - 'billing.usdt.expires': '่ฟ‡ๆœŸๆ—ถ้—ด', - 'billing.usdt.paidSuccess': 'ๆ”ฏไป˜็กฎ่ฎคๆˆๅŠŸ๏ผŒๅทฒๅผ€้€šไผšๅ‘˜', - 'billing.usdt.status.pending': '็ญ‰ๅพ…ๆ”ฏไป˜', - 'billing.usdt.status.paid': 'ๅทฒๆฃ€ๆต‹ๅˆฐ่ดฆ', - 'billing.usdt.status.confirmed': 'ๅทฒ็กฎ่ฎค', - 'billing.usdt.status.expired': 'ๅทฒ่ฟ‡ๆœŸ', - 'billing.usdt.status.cancelled': 'ๅทฒๅ–ๆถˆ', - 'billing.usdt.status.failed': 'ๅคฑ่ดฅ', - - // Community - 'community.vipFree': 'VIPๅ…่ดน', - - // Indicator publish - 'dashboard.indicator.publish.vipFree': 'VIPๅ…่ดน', - 'dashboard.indicator.publish.vipFreeHint': 'ๅผ€ๅฏๅŽ๏ผšVIP็”จๆˆทๅฏๅ…่ดนไฝฟ็”จ่ฏฅๆŒ‡ๆ ‡๏ผˆ้žVIPไป้œ€่ดญไนฐ๏ผ‰ใ€‚' -} - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/locales/lang/zh-TW.js b/quantdinger_vue/src/locales/lang/zh-TW.js deleted file mode 100644 index ca38656..0000000 --- a/quantdinger_vue/src/locales/lang/zh-TW.js +++ /dev/null @@ -1,2250 +0,0 @@ -import antd from 'ant-design-vue/es/locale-provider/zh_TW' -import momentTW from 'moment/locale/zh-tw' - -const components = { - antLocale: antd, - momentName: 'zh-tw', - momentLocale: momentTW -} - -const locale = { - // ้€š็”จ - 'common.confirm': '็ขบๅฎš', - 'common.cancel': 'ๅ–ๆถˆ', - 'common.save': 'ไฟๅญ˜', - 'common.delete': 'ๅˆช้™ค', - 'common.edit': '็ทจ่ผฏ', - 'common.add': 'ๆทปๅŠ ', - 'common.close': '้—œ้–‰', - 'common.ok': '็ขบๅฎš', - 'common.actions': 'ๆ“ไฝœ', - 'common.refresh': 'ๅˆทๆ–ฐ', - 'submit': 'ๆไบค', - 'save': 'ไฟๅญ˜', - 'submit.ok': 'ๆไบคๆˆๅŠŸ', - 'save.ok': 'ไฟๅญ˜ๆˆๅŠŸ', - 'menu.welcome': 'ๆญก่ฟŽ', - 'menu.home': 'ไธป้ ', - 'menu.dashboard': 'ๅ„€่กจ็›ค', - 'menu.dashboard.indicator': 'ๆŒ‡ๆจ™ๅˆ†ๆž', - 'menu.dashboard.community': 'ๆŒ‡ๆจ™็คพๅ€', - 'menu.dashboard.analysis': 'AI ๅˆ†ๆž', - 'menu.dashboard.tradingAssistant': 'ไบคๆ˜“ๅŠฉๆ‰‹', - 'menu.dashboard.portfolio': '่ณ‡็”ข็›ฃๆธฌ', - 'menu.settings': '็ณป็ตฑ่จญ็ฝฎ', - 'menu.dashboard.aiTradingAssistant': 'AIไบคๆ˜“ๅŠฉๆ‰‹', - 'menu.dashboard.signalRobot': 'ไฟก่™ŸๆฉŸๅ™จไบบ', - 'menu.dashboard.monitor': '็›ฃๆŽง้ ', - 'menu.dashboard.workplace': 'ๅทฅไฝœ่‡บ', - 'menu.form': '่กจๅ–ฎ้ ', - 'menu.form.basic-form': 'ๅŸบ็คŽ่กจๅ–ฎ', - 'menu.form.step-form': 'ๅˆ†ๆญฅ่กจๅ–ฎ', - 'menu.form.step-form.info': 'ๅˆ†ๆญฅ่กจๅ–ฎ๏ผˆๅกซๅฏซ่ฝ‰่ณฌไฟกๆฏ๏ผ‰', - 'menu.form.step-form.confirm': 'ๅˆ†ๆญฅ่กจๅ–ฎ๏ผˆ็ขบ่ช่ฝ‰่ณฌไฟกๆฏ๏ผ‰', - 'menu.form.step-form.result': 'ๅˆ†ๆญฅ่กจๅ–ฎ๏ผˆๅฎŒๆˆ๏ผ‰', - 'menu.form.advanced-form': '้ซ˜็ดš่กจๅ–ฎ', - 'menu.list': 'ๅˆ—่กจ้ ', - 'menu.list.table-list': 'ๆŸฅ่ฉข่กจๆ ผ', - 'menu.list.basic-list': 'ๆจ™ๆบ–ๅˆ—่กจ', - 'menu.list.card-list': 'ๅก็‰‡ๅˆ—่กจ', - 'menu.list.search-list': 'ๆœ็ดขๅˆ—่กจ', - 'menu.list.search-list.articles': 'ๆœ็ดขๅˆ—่กจ๏ผˆๆ–‡็ซ ๏ผ‰', - 'menu.list.search-list.projects': 'ๆœ็ดขๅˆ—่กจ๏ผˆ้ …็›ฎ๏ผ‰', - 'menu.list.search-list.applications': 'ๆœ็ดขๅˆ—่กจ๏ผˆๆ‡‰็”จ๏ผ‰', - 'menu.profile': '่ฉณๆƒ…้ ', - 'menu.profile.basic': 'ๅŸบ็คŽ่ฉณๆƒ…้ ', - 'menu.profile.advanced': '้ซ˜็ดš่ฉณๆƒ…้ ', - 'menu.result': '็ตๆžœ้ ', - 'menu.result.success': 'ๆˆๅŠŸ้ ', - 'menu.result.fail': 'ๅคฑๆ•—้ ', - 'menu.exception': '็•ฐๅธธ้ ', - 'menu.exception.not-permission': '403', - 'menu.exception.not-find': '404', - 'menu.exception.server-error': '500', - 'menu.exception.trigger': '่งธ็™ผ้Œฏ่ชค', - 'menu.account': 'ๅ€‹ไบบ้ ', - 'menu.account.center': 'ๅ€‹ไบบไธญๅฟƒ', - 'menu.account.settings': 'ๅ€‹ไบบ่จญ็ฝฎ', - 'menu.account.trigger': '่งธ็™ผๅ ฑ้Œฏ', - 'menu.account.logout': '้€€ๅ‡บ็™ป้Œ„', - 'menu.wallet': 'ๆˆ‘็š„้ŒขๅŒ…', - 'menu.docs': 'ๆ–‡ๆช”ไธญๅฟƒ', - 'menu.docs.detail': 'ๆ–‡ๆช”่ฉณๆƒ…', - 'menu.header.refreshPage': 'ๅˆทๆ–ฐ้ ้ข', - 'menu.invite.friends': '้‚€่ซ‹ๅฅฝๅ‹', - 'app.setting.pagestyle': 'ๆ•ด้ซ”้ขจๆ ผ่จญ็ฝฎ', - 'app.setting.pagestyle.light': 'ไบฎ่‰ฒ่œๅ–ฎ้ขจๆ ผ', - 'app.setting.pagestyle.dark': 'ๆš—่‰ฒ่œๅ–ฎ้ขจๆ ผ', - 'app.setting.pagestyle.realdark': 'ๆš—้ป‘ๆจกๅผ', - 'app.setting.themecolor': 'ไธป้กŒ่‰ฒ', - 'app.setting.navigationmode': 'ๅฐŽ่ˆชๆจกๅผ', - 'app.setting.sidemenu.nav': 'ๅด้‚Šๆฌ„ๅฐŽ่ˆช', - 'app.setting.topmenu.nav': '้ ‚้ƒจๆฌ„ๅฐŽ่ˆช', - 'app.setting.content-width': 'ๅ…งๅฎนๅ€ๅŸŸๅฏฌๅบฆ', - 'app.setting.content-width.tooltip': '่ฉฒ่จญๅฎšๅƒ… [้ ‚้ƒจๆฌ„ๅฐŽ่ˆช] ๆ™‚ๆœ‰ๆ•ˆ', - 'app.setting.content-width.fixed': 'ๅ›บๅฎš', - 'app.setting.content-width.fluid': 'ๆตๅผ', - 'app.setting.fixedheader': 'ๅ›บๅฎš Header', - 'app.setting.fixedheader.tooltip': 'ๅ›บๅฎš Header ๆ™‚ๅฏ้…็ฝฎ', - 'app.setting.autoHideHeader': 'ไธ‹ๆป‘ๆ™‚้šฑ่— Header', - 'app.setting.fixedsidebar': 'ๅ›บๅฎšๅด้‚Š่œๅ–ฎ', - 'app.setting.sidemenu': 'ๅด้‚Š่œๅ–ฎๅธƒๅฑ€', - 'app.setting.topmenu': '้ ‚้ƒจ่œๅ–ฎๅธƒๅฑ€', - 'app.setting.othersettings': 'ๅ…ถไป–่จญ็ฝฎ', - 'app.setting.weakmode': '่‰ฒๅผฑๆจกๅผ', - 'app.setting.multitab': 'ๅคš้ ็ฑคๆจกๅผ', - 'app.setting.copy': 'ๆ‹ท่ฒ่จญ็ฝฎ', - 'app.setting.loading': 'ๅŠ ่ผ‰ไธป้กŒไธญ', - 'app.setting.copyinfo': 'ๆ‹ท่ฒ่จญ็ฝฎๆˆๅŠŸ src/config/defaultSettings.js', - 'app.setting.copy.success': 'ๅพฉๅˆถๅฎŒ็•ข', - 'app.setting.copy.fail': 'ๅพฉๅˆถๅคฑๆ•—', - 'app.setting.theme.switching': 'ๆญฃๅœจๅˆ‡ๆ›ไธป้กŒ๏ผ', - 'app.setting.production.hint': '้…็ฝฎๆฌ„ๅชๅœจ้–‹็™ผ็’ฐๅขƒ็”จๆ–ผ้ ่ฆฝ๏ผŒ็”Ÿ็”ข็’ฐๅขƒไธๆœƒๅฑ•็พ๏ผŒ่ซ‹ๆ‹ท่ฒๅพŒๆ‰‹ๅ‹•ไฟฎๆ”น้…็ฝฎๆ–‡ไปถ', - 'app.setting.themecolor.daybreak': 'ๆ‹‚ๆ›‰่—๏ผˆ้ป˜่ช๏ผ‰', - 'app.setting.themecolor.dust': '่–„ๆšฎ', - 'app.setting.themecolor.volcano': '็ซๅฑฑ', - 'app.setting.themecolor.sunset': 'ๆ—ฅๆšฎ', - 'app.setting.themecolor.cyan': 'ๆ˜Ž้’', - 'app.setting.themecolor.green': 'ๆฅตๅ…‰็ถ ', - 'app.setting.themecolor.geekblue': 'ๆฅตๅฎข่—', - 'app.setting.themecolor.purple': '้†ฌ็ดซ', - 'app.setting.tooltip': '้ ้ข่จญ็ฝฎ', - - // ้€š็Ÿฅไธญๅฟƒ - 'notice.title': '้€š็Ÿฅไธญๅฟƒ', - 'notice.empty': 'ๆšซ็„ก้€š็Ÿฅ', - 'notice.markAllRead': 'ๅ…จ้ƒจๅทฒ่ฎ€', - 'notice.clear': 'ๆธ…็ฉบ้€š็Ÿฅ', - 'notice.close': '้—œ้–‰', - 'notice.justNow': 'ๅ‰›ๅ‰›', - 'notice.minutesAgo': 'ๅˆ†้˜ๅ‰', - 'notice.hoursAgo': 'ๅฐๆ™‚ๅ‰', - 'notice.daysAgo': 'ๅคฉๅ‰', - 'notice.detailInfo': '่ฉณ็ดฐไฟกๆฏ', - 'notice.aiDecision': 'AIๆฑบ็ญ–', - 'notice.confidence': '็ฝฎไฟกๅบฆ', - 'notice.reasoning': 'ๅˆ†ๆž็†็”ฑ', - 'notice.symbol': 'ๆจ™็š„ไปฃ็ขผ', - 'notice.currentPrice': '็•ถๅ‰ๅƒนๆ ผ', - 'notice.triggerPrice': '่งธ็™ผๅƒนๆ ผ', - 'notice.action': 'ๆ“ไฝœ', - 'notice.quantity': 'ๆ•ธ้‡', - 'notice.viewPortfolio': 'ๆŸฅ็œ‹ๆŒๅ€‰', - 'notice.type.aiMonitor': 'AI็›ฃๆŽง', - 'notice.type.priceAlert': 'ๅƒนๆ ผๆ้†’', - 'notice.type.signal': 'ไบคๆ˜“ไฟก่™Ÿ', - 'notice.type.buy': '่ฒทๅ…ฅไฟก่™Ÿ', - 'notice.type.sell': '่ณฃๅ‡บไฟก่™Ÿ', - 'notice.type.hold': 'ๆŒๆœ‰ๅปบ่ญฐ', - 'notice.type.trade': 'ไบคๆ˜“ๅŸท่กŒ', - 'notice.type.notification': '็ณป็ตฑ้€š็Ÿฅ', - - 'user.login.userName': '็”จๆˆถๅ', - 'user.login.password': 'ๅฏ†็ขผ', - 'user.login.username.placeholder': '่ณฌๆˆถ: admin', - 'user.login.password.placeholder': 'ๅฏ†็ขผ: admin or ant.design', - 'user.login.message-invalid-credentials': '็™ป้Œ„ๅคฑๆ•—๏ผŒ่ซ‹ๆชขๆŸฅ้ƒต็ฎฑๅ’Œ้ฉ—่ญ‰็ขผ', - 'user.login.message-invalid-verification-code': '้ฉ—่ญ‰็ขผ้Œฏ่ชค', - 'user.login.tab-login-credentials': '่ณฌๆˆถๅฏ†็ขผ็™ป้Œ„', - 'user.login.tab-login-email': '้ƒต็ฎฑ็™ป้Œ„', - 'user.login.tab-login-mobile': 'ๆ‰‹ๆฉŸ่™Ÿ็™ป้Œ„', - 'user.login.captcha.placeholder': '่ซ‹่ผธๅ…ฅๅœ–ๅฝข้ฉ—่ญ‰็ขผ', - 'user.login.mobile.placeholder': 'ๆ‰‹ๆฉŸ่™Ÿ', - 'user.login.mobile.verification-code.placeholder': '้ฉ—่ญ‰็ขผ', - 'user.login.email.placeholder': '่ซ‹่ผธๅ…ฅ้ƒต็ฎฑๅœฐๅ€', - 'user.login.email.verification-code.placeholder': '่ซ‹่ผธๅ…ฅ้ฉ—่ญ‰็ขผ', - 'user.login.email.sending': '้ฉ—่ญ‰็ขผ็™ผ้€ไธญ...', - 'user.login.email.send-success-title': 'ๆ็คบ', - 'user.login.email.send-success': '้ฉ—่ญ‰็ขผ็™ผ้€ๆˆๅŠŸ๏ผŒ่ซ‹ๆŸฅๆ”ถ้ƒตไปถ', - 'user.login.sms.send-success': '้ฉ—่ญ‰็ขผ็™ผ้€ๆˆๅŠŸ๏ผŒ่ซ‹ๆŸฅๆ”ถ็Ÿญไฟก', - 'user.login.remember-me': '่‡ชๅ‹•็™ป้Œ„', - 'user.login.forgot-password': 'ๅฟ˜่จ˜ๅฏ†็ขผ', - 'user.login.sign-in-with': 'ๅ…ถไป–็™ป้Œ„ๆ–นๅผ', - 'user.login.signup': 'ๆณจๅ†Š่ณฌๆˆถ', - 'user.login.login': '็™ป้Œ„', - 'user.register.register': 'ๆณจๅ†Š', - 'user.register.email.placeholder': '้ƒต็ฎฑ', - 'user.register.password.placeholder': '่ซ‹่‡ณๅฐ‘่ผธๅ…ฅ 6 ๅ€‹ๅญ—็ฌฆใ€‚่ซ‹ไธ่ฆไฝฟ็”จๅฎนๆ˜“่ขซ็Œœๅˆฐ็š„ๅฏ†็ขผใ€‚', - 'user.register.password.popover-message': '่ซ‹่‡ณๅฐ‘่ผธๅ…ฅ 6 ๅ€‹ๅญ—็ฌฆใ€‚่ซ‹ไธ่ฆไฝฟ็”จๅฎนๆ˜“่ขซ็Œœๅˆฐ็š„ๅฏ†็ขผใ€‚', - 'user.register.confirm-password.placeholder': '็ขบ่ชๅฏ†็ขผ', - 'user.register.get-verification-code': '็ฒๅ–้ฉ—่ญ‰็ขผ', - 'user.register.sign-in': 'ไฝฟ็”จๅทฒๆœ‰่ณฌๆˆถ็™ป้Œ„', - 'user.register-result.msg': 'ไฝ ็š„่ณฌๆˆถ๏ผš{email} ๆณจๅ†ŠๆˆๅŠŸ', - 'user.register-result.activation-email': 'ๆฟ€ๆดป้ƒตไปถๅทฒ็™ผ้€ๅˆฐไฝ ็š„้ƒต็ฎฑไธญ๏ผŒ้ƒตไปถๆœ‰ๆ•ˆๆœŸ็ˆฒ24ๅฐๆ™‚ใ€‚่ซ‹ๅŠๆ™‚็™ป้Œ„้ƒต็ฎฑ๏ผŒ้ปžๆ“Š้ƒตไปถไธญ็š„้ˆๆŽฅๆฟ€ๆดปๅธณๆˆถใ€‚', - 'user.register-result.back-home': '่ฟ”ๅ›ž้ฆ–้ ', - 'user.register-result.view-mailbox': 'ๆŸฅ็œ‹้ƒต็ฎฑ', - 'user.email.required': '่ซ‹่ผธๅ…ฅ้ƒต็ฎฑๅœฐๅ€๏ผ', - 'user.email.wrong-format': '้ƒต็ฎฑๅœฐๅ€ๆ ผๅผ้Œฏ่ชค๏ผ', - 'user.userName.required': '่ซ‹่ผธๅ…ฅๅธณๆˆถๅๆˆ–้ƒต็ฎฑๅœฐๅ€', - 'user.password.required': '่ซ‹่ผธๅ…ฅๅฏ†็ขผ๏ผ', - 'user.password.twice.msg': 'ๅ…ฉๆฌก่ผธๅ…ฅ็š„ๅฏ†็ขผไธๅŒน้…!', - 'user.password.strength.msg': 'ๅฏ†็ขผๅผทๅบฆไธๅค  ', - 'user.password.strength.strong': 'ๅผทๅบฆ๏ผšๅผท', - 'user.password.strength.medium': 'ๅผทๅบฆ๏ผšไธญ', - 'user.password.strength.low': 'ๅผทๅบฆ๏ผšไฝŽ', - 'user.password.strength.short': 'ๅผทๅบฆ๏ผšๅคช็Ÿญ', - 'user.confirm-password.required': '่ซ‹็ขบ่ชๅฏ†็ขผ๏ผ', - 'user.phone-number.required': '่ซ‹่ผธๅ…ฅๆญฃ็ขบ็š„ๆ‰‹ๆฉŸ่™Ÿ', - 'user.phone-number.wrong-format': 'ๆ‰‹ๆฉŸ่™Ÿๆ ผๅผ้Œฏ่ชค๏ผ', - 'user.verification-code.required': '่ซ‹่ผธๅ…ฅ้ฉ—่ญ‰็ขผ๏ผ', - 'user.captcha.required': '่ซ‹่ผธๅ…ฅๅœ–ๅฝข้ฉ—่ญ‰็ขผ๏ผ', - 'user.login.infos': 'QuantDinger ๆ˜ฏไธ€ๅ€‹ AI ๅคšๆ™บ่ƒฝ้ซ”่‚ก็ฅจๅˆ†ๆž่ผ”ๅŠฉๅทฅๅ…ท๏ผŒไธๅ…ทๅ‚™่ญ‰ๅˆธๆŠ•่ณ‡่ซฎ่ฉข่ณ‡่ณชใ€‚ๅนณ่‡บไธญ็š„ๆ‰€ๆœ‰ๅˆ†ๆž็ตๆžœใ€่ฉ•ๅˆ†ใ€ๅƒ่€ƒๆ„่ฆ‹ๅ‡็”ฑ AI ๅŸบๆ–ผๆญทๅฒๆ•ธๆ“š่‡ชๅ‹•็”Ÿๆˆ๏ผŒๅƒ…ไพ›ๅญธ็ฟ’ใ€็ ”็ฉถ่ˆ‡ๆŠ€่ก“ไบคๆตไฝฟ็”จ,ไธๆง‹ๆˆไปปไฝ•ๆŠ•่ณ‡ๅปบ่ญฐๆˆ–ๆฑบ็ญ–ไพๆ“šใ€‚่‚ก็ฅจๆŠ•่ณ‡ๅญ˜ๅœจๅธ‚ๅ ด้ขจ้šชใ€ๆตๅ‹•ๆ€ง้ขจ้šชใ€ๆ”ฟ็ญ–้ขจ้šช็ญ‰ๅคš็จฎ้ขจ้šช๏ผŒๅฏ่ƒฝๅฐŽ่‡ดๆœฌ้‡‘ๆๅคฑใ€‚็”จๆˆถๆ‡‰ๅŸบๆ–ผ่‡ช่บซ้ขจ้šชๆ‰ฟๅ—่ƒฝๅŠ›็จ็ซ‹ๆฑบ็ญ–๏ผŒไฝฟ็”จๆœฌๅทฅๅ…ท็”ข็”Ÿ็š„ไปปไฝ•ๆŠ•่ณ‡่กŒ็ˆฒๅŠๅ…ถๅพŒๆžœ็”ฑ็”จๆˆถ่‡ช่กŒๆ‰ฟๆ“”ใ€‚ๅธ‚ๅ ดๆœ‰้ขจ้šช๏ผŒๆŠ•่ณ‡้œ€่ฌนๆ…Žใ€‚', - 'user.login.tab-login-web3': 'Web3 ็™ป้Œ„', - 'user.login.web3.tip': 'ไฝฟ็”จ้ŒขๅŒ…้€ฒ่กŒ็ฑคๅ็™ป้Œ„', - 'user.login.web3.connect': '้€ฃๆŽฅ้ŒขๅŒ…ไธฆ็™ป้Œ„', - 'user.login.web3.no-wallet': 'ๆœชๆชขๆธฌๅˆฐ้ŒขๅŒ…', - 'user.login.web3.no-address': 'ๆœช็ฒๅ–ๅˆฐ้ŒขๅŒ…ๅœฐๅ€', - 'user.login.web3.nonce-failed': '็ฒๅ–้šจๆฉŸๆ•ธๅคฑๆ•—', - 'user.login.web3.verify-failed': '็ฑคๅ้ฉ—่ญ‰ๅคฑๆ•—', - 'user.login.web3.success': '็™ป้Œ„ๆˆๅŠŸ', - 'user.login.web3.failed': '้ŒขๅŒ…็™ป้Œ„ๅคฑๆ•—', - 'nav.no_wallet': 'ๆœชๆชขๆธฌๅˆฐ้ŒขๅŒ…', - 'nav.copy': 'ๅพฉๅˆถ', - 'nav.copy_success': 'ๅพฉๅˆถๆˆๅŠŸ', - 'user.login.oauth.google': 'ไฝฟ็”จ Google ็™ป้Œ„', - 'user.login.oauth.github': 'ไฝฟ็”จ GitHub ็™ป้Œ„', - 'user.login.oauth.loading': 'ๆญฃๅœจ่ทณ่ฝ‰ๅˆฐๆŽˆๆฌŠ้ ้ข...', - 'user.login.oauth.failed': 'OAuth ็™ป้Œ„ๅคฑๆ•—', - 'user.login.oauth.get-url-failed': '็ฒๅ–ๆŽˆๆฌŠ้ˆๆŽฅๅคฑๆ•—', - 'user.login.subtitle': '้ฉ…ๅ‹•็š„ๅ…จ็ƒๅธ‚ๅ ด้‡ๅŒ–ๆดžๅฏŸ', - 'user.login.legal.title': 'ๆณ•ๅพ‹ๅ…่ฒฌ่ฒๆ˜Ž', - 'user.login.legal.view': 'ๆŸฅ็œ‹ๆณ•ๅพ‹ๅ…่ฒฌ่ฒๆ˜Ž', - 'user.login.legal.collapse': 'ๆ”ถ่ตทๆณ•ๅพ‹ๅ…่ฒฌ่ฒๆ˜Ž', - 'user.login.legal.agree': 'ๆˆ‘ๅทฒ้–ฑ่ฎ€ไธฆๅŒๆ„ๆณ•ๅพ‹ๅ…่ฒฌ่ฒๆ˜Ž', - 'user.login.legal.required': '่ซ‹ๅ…ˆ้–ฑ่ฎ€ไธฆๅ‹พ้ธๆณ•ๅพ‹ๅ…่ฒฌ่ฒๆ˜Ž', - 'user.login.legal.content': 'QuantDinger ๆ˜ฏไธ€ๅ€‹ AI ๅคšๆ™บ่ƒฝ้ซ”่‚ก็ฅจๅˆ†ๆž่ผ”ๅŠฉๅทฅๅ…ท๏ผŒไธๅ…ทๅ‚™่ญ‰ๅˆธๆŠ•่ณ‡่ซฎ่ฉข่ณ‡่ณชใ€‚ๅนณ่‡บไธญ็š„ๆ‰€ๆœ‰ๅˆ†ๆž็ตๆžœใ€่ฉ•ๅˆ†ใ€ๅƒ่€ƒๆ„่ฆ‹ๅ‡็”ฑ AI ๅŸบๆ–ผๆญทๅฒๆ•ธๆ“š่‡ชๅ‹•็”Ÿๆˆ๏ผŒๅƒ…ไพ›ๅญธ็ฟ’ใ€็ ”็ฉถ่ˆ‡ๆŠ€่ก“ไบคๆตไฝฟ็”จ๏ผŒไธๆง‹ๆˆไปปไฝ•ๆŠ•่ณ‡ๅปบ่ญฐๆˆ–ๆฑบ็ญ–ไพๆ“šใ€‚่‚ก็ฅจๆŠ•่ณ‡ๅญ˜ๅœจๅธ‚ๅ ด้ขจ้šชใ€ๆตๅ‹•ๆ€ง้ขจ้šชใ€ๆ”ฟ็ญ–้ขจ้šช็ญ‰ๅคš็จฎ้ขจ้šช๏ผŒๅฏ่ƒฝๅฐŽ่‡ดๆœฌ้‡‘ๆๅคฑใ€‚็”จๆˆถๆ‡‰ๅŸบๆ–ผ่‡ช่บซ้ขจ้šชๆ‰ฟๅ—่ƒฝๅŠ›็จ็ซ‹ๆฑบ็ญ–๏ผŒไฝฟ็”จๆœฌๅทฅๅ…ท็”ข็”Ÿ็š„ไปปไฝ•ๆŠ•่ณ‡่กŒ็ˆฒๅŠๅ…ถๅพŒๆžœ็”ฑ็”จๆˆถ่‡ช่กŒๆ‰ฟๆ“”ใ€‚ๅธ‚ๅ ดๆœ‰้ขจ้šช๏ผŒๆŠ•่ณ‡้œ€่ฌนๆ…Žใ€‚', - 'user.login.privacy.title': '็”จๆˆถ้šฑ็งๆขๆฌพ', - 'user.login.privacy.view': 'ๆŸฅ็œ‹็”จๆˆถ้šฑ็งๆขๆฌพ', - 'user.login.privacy.collapse': 'ๆ”ถ่ตท็”จๆˆถ้šฑ็งๆขๆฌพ', - 'user.login.privacy.content': 'ๆˆ‘ๅ€‘้‡่ฆ–ๆ‚จ็š„้šฑ็ง่ˆ‡ๆ•ธๆ“šไฟ่ญทใ€‚1) ๆ”ถ้›†็ฏ„ๅœ๏ผšๅƒ…ๆ”ถ้›†ๅฏฆ็พๅŠŸ่ƒฝๆ‰€้œ€็š„ไฟกๆฏ๏ผˆๅฆ‚้ƒต็ฎฑใ€ๆ‰‹ๆฉŸ่™Ÿใ€ๅ€่™Ÿใ€Web3 ้ŒขๅŒ…ๅœฐๅ€๏ผ‰ไปฅๅŠๅฟ…่ฆ็š„ๆ—ฅๅฟ—่ˆ‡่จญๅ‚™ไฟกๆฏใ€‚2) ไฝฟ็”จ็›ฎ็š„๏ผš็”จๆ–ผ่ณฌๆˆถ็™ป้Œ„่ˆ‡ๅฎ‰ๅ…จๆ ก้ฉ—ใ€ๆœๅ‹™ๅŠŸ่ƒฝๆไพ›ใ€ๅ•้กŒๆŽ’ๆŸฅ่ˆ‡ๅˆ่ฆ่ฆๆฑ‚ใ€‚3) ๅญ˜ๅ„ฒ่ˆ‡ๅฎ‰ๅ…จ๏ผšๆ•ธๆ“šๅŠ ๅฏ†ๅญ˜ๅ„ฒ๏ผŒไธฆๆŽกๅ–ๅฟ…่ฆ็š„ๆฌŠ้™่ˆ‡่จชๅ•ๆŽงๅˆถๆŽชๆ–ฝ๏ผŒ็›กๅŠ›้˜ฒๆญขๆœช็ถ“ๆŽˆๆฌŠ็š„่จชๅ•ใ€ๆŠซ้œฒๆˆ–ไธŸๅคฑใ€‚4) ๅ…ฑไบซ่ˆ‡็ฌฌไธ‰ๆ–น๏ผš้™คๆณ•ๅพ‹ๆณ•่ฆ่ฆๆฑ‚ๆˆ–ๅฑฅ่กŒๆœๅ‹™ๆ‰€ๅฟ…้œ€ๅค–๏ผŒไธๆœƒ่ˆ‡็ฌฌไธ‰ๆ–นๅ…ฑไบซๆ‚จ็š„ๅ€‹ไบบไฟกๆฏ๏ผ›่‹ฅๆถ‰ๅŠ็ฌฌไธ‰ๆ–นๆœๅ‹™๏ผˆๅฆ‚้ŒขๅŒ…ใ€็Ÿญไฟกๆœๅ‹™ๅ•†๏ผ‰๏ผŒๅƒ…ๅœจๅฏฆ็พๅŠŸ่ƒฝๆ‰€้œ€็š„ๆœ€ๅฐ็ฏ„ๅœๅ…ง่™•็†ใ€‚5) Cookies/ๆœฌๅœฐๅญ˜ๅ„ฒ๏ผš็”จๆ–ผ็™ป้Œ„ๆ…‹่ˆ‡ๅฟ…่ฆ็š„ๆœƒ่ฉฑ็ถญๆŒ๏ผˆๅฆ‚ไปค็‰Œใ€PHPSESSID๏ผ‰๏ผŒๆ‚จๅฏๅœจ็€่ฆฝๅ™จไธญ้€ฒ่กŒๆธ…็†ๆˆ–้™ๅˆถใ€‚6) ๅ€‹ไบบๆฌŠๅˆฉ๏ผšๆ‚จๅฏๆ นๆ“šๆณ•ๅพ‹ๆณ•่ฆ่กŒไฝฟๆŸฅ่ฉขใ€ๆ›ดๆญฃใ€ๅˆช้™คใ€ๆ’คๅ›žๅŒๆ„็ญ‰ๆฌŠๅˆฉใ€‚7) ่ฎŠๆ›ด่ˆ‡้€š็Ÿฅ๏ผšๆœฌๆขๆฌพๆ›ดๆ–ฐๅพŒๅฐ‡ๅœจ้ ้ข้กฏ่‘—ไฝ็ฝฎๆ็คบใ€‚็นผ็บŒไฝฟ็”จๆœฌๆœๅ‹™ๅณ่กจ็คบๆ‚จๅทฒ้–ฑ่ฎ€ไธฆๅŒๆ„ๆ›ดๆ–ฐๅ…งๅฎนใ€‚่‹ฅๆ‚จไธๅŒๆ„ๆœฌๆขๆฌพๆˆ–ๅ…ถไธญไปปไฝ•ๆ›ดๆ–ฐ๏ผŒ่ซ‹ๅœๆญขไฝฟ็”จๆœฌๆœๅ‹™ไธฆ่ฏ็ณปๆˆ‘ๅ€‘ใ€‚', - 'account.basicInfo': 'ๅŸบ็คŽไฟกๆฏ', - 'account.id': '็”จๆˆถID', - 'account.username': '็”จๆˆถๅ', - 'account.nickname': 'ๆšฑ็จฑ', - 'account.email': '้ƒต็ฎฑ', - 'account.mobile': 'ๆ‰‹ๆฉŸ่™Ÿ', - 'account.web3address': '้ŒขๅŒ…ๅœฐๅ€', - 'account.pid': 'ๆŽจ่–ฆไบบID', - 'account.level': '็”จๆˆถ็ญ‰็ดš', - 'account.money': '้ค˜้ก', - 'account.qdtBalance': 'QDT ้ค˜้ก', - 'account.score': '็ฉๅˆ†', - 'account.createtime': 'ๆณจๅ†Šๆ™‚้–“', - 'account.inviteLink': '้‚€่ซ‹้ˆๆŽฅ', - 'account.recharge': 'ๅ……ๅ€ผ', - 'account.rechargeTip': '่ซ‹ไฝฟ็”จๅพฎไฟกๆˆ–ๆ”ฏไป˜ๅฏถๆŽƒๆไธ‹ๆ–นไบŒ็ถญ็ขผ้€ฒ่กŒๅ……ๅ€ผ', - 'account.qrCodePlaceholder': 'ไบŒ็ถญ็ขผไฝ”ไฝ็ฌฆ๏ผˆๆจกๆ“ฌ๏ผ‰', - 'account.rechargeAmount': 'ๅ……ๅ€ผ้‡‘้ก', - 'account.enterAmount': '่ซ‹่ผธๅ…ฅๅ……ๅ€ผ้‡‘้ก', - 'account.rechargeHint': 'ๆœ€ๅฐๅ……ๅ€ผ้‡‘้ก๏ผš1 QDT', - 'account.confirmRecharge': '็ขบ่ชๅ……ๅ€ผ', - 'account.enterValidAmount': '่ซ‹่ผธๅ…ฅๆœ‰ๆ•ˆ็š„ๅ……ๅ€ผ้‡‘้ก', - 'account.rechargeSuccess': 'ๅ……ๅ€ผๆˆๅŠŸ๏ผๅทฒๅ……ๅ€ผ {amount} QDT', - 'account.settings.menuMap.basic': 'ๅŸบๆœฌ่จญ็ฝฎ', - 'account.settings.menuMap.security': 'ๅฎ‰ๅ…จ่จญ็ฝฎ', - 'account.settings.menuMap.notification': 'ๆ–ฐๆถˆๆฏ้€š็Ÿฅ', - 'account.settings.menuMap.moneyLog': '่ณ‡้‡‘ๆ˜Ž็ดฐ', - 'account.moneyLog.empty': 'ๆšซ็„ก่ณ‡้‡‘ๆ˜Ž็ดฐ', - 'account.moneyLog.total': 'ๅ…ฑ {total} ๆข่จ˜้Œ„', - 'account.moneyLog.type.purchase': '่ณผ่ฒทๆŒ‡ๆจ™', - 'account.moneyLog.type.recharge': 'ๅ……ๅ€ผ', - 'account.moneyLog.type.refund': '้€€ๆฌพ', - 'account.moneyLog.type.reward': '็Žๅ‹ต', - 'account.moneyLog.type.income': 'ๆŒ‡ๆจ™ๆ”ถๅ…ฅ', - 'account.moneyLog.type.commission': 'ๅนณ่‡บๆ‰‹็บŒ่ฒป', - 'wallet.balance': 'QDT ้ค˜้ก', - 'wallet.recharge': 'ๅ……ๅ€ผ', - 'wallet.withdraw': 'ๆ็พ', - 'wallet.filter': '็ฏฉ้ธ', - 'wallet.reset': '้‡็ฝฎ', - 'wallet.totalRecharge': '็ดฏ่จˆๅ……ๅ€ผ', - 'wallet.totalWithdraw': '็ดฏ่จˆๆ็พ', - 'wallet.totalIncome': '็ดฏ่จˆๆ”ถๅ…ฅ', - 'wallet.records': 'ไบคๆ˜“่จ˜้Œ„่ˆ‡่ณ‡้‡‘ๆ˜Ž็ดฐ', - 'wallet.tradingRecords': 'ไบคๆ˜“่จ˜้Œ„', - 'wallet.moneyLog': '่ณ‡้‡‘ๆ˜Ž็ดฐ', - 'wallet.rechargeTip': '่ซ‹ไฝฟ็”จๅพฎไฟกๆˆ–ๆ”ฏไป˜ๅฏถๆŽƒๆไธ‹ๆ–นไบŒ็ถญ็ขผ้€ฒ่กŒๅ……ๅ€ผ', - 'wallet.qrCodePlaceholder': 'ไบŒ็ถญ็ขผไฝ”ไฝ็ฌฆ๏ผˆๆจกๆ“ฌ๏ผ‰', - 'wallet.rechargeAmount': 'ๅ……ๅ€ผ้‡‘้ก', - 'wallet.enterAmount': '่ซ‹่ผธๅ…ฅๅ……ๅ€ผ้‡‘้ก', - 'wallet.rechargeHint': 'ๆœ€ๅฐๅ……ๅ€ผ้‡‘้ก๏ผš1 QDT', - 'wallet.confirmRecharge': '็ขบ่ชๅ……ๅ€ผ', - 'wallet.enterValidAmount': '่ซ‹่ผธๅ…ฅๆœ‰ๆ•ˆ็š„ๅ……ๅ€ผ้‡‘้ก', - 'wallet.rechargeSuccess': 'ๅ……ๅ€ผๆˆๅŠŸ๏ผๅทฒๅ……ๅ€ผ {amount} QDT', - 'wallet.rechargeFailed': 'ๅ……ๅ€ผๅคฑๆ•—', - 'wallet.withdrawTip': '่ซ‹่ผธๅ…ฅๆ็พ้‡‘้กๅ’Œๆ็พๅœฐๅ€', - 'wallet.withdrawAmount': 'ๆ็พ้‡‘้ก', - 'wallet.enterWithdrawAmount': '่ซ‹่ผธๅ…ฅๆ็พ้‡‘้ก', - 'wallet.withdrawHint': 'ๆœ€ๅฐๆ็พ้‡‘้ก๏ผš1 QDT', - 'wallet.withdrawAddress': 'ๆ็พๅœฐๅ€๏ผˆๅฏ้ธ๏ผ‰', - 'wallet.enterWithdrawAddress': '่ซ‹่ผธๅ…ฅๆ็พๅœฐๅ€', - 'wallet.confirmWithdraw': '็ขบ่ชๆ็พ', - 'wallet.enterValidWithdrawAmount': '่ซ‹่ผธๅ…ฅๆœ‰ๆ•ˆ็š„ๆ็พ้‡‘้ก', - 'wallet.insufficientBalance': '้ค˜้กไธ่ถณ', - 'wallet.withdrawSuccess': 'ๆ็พๆˆๅŠŸ๏ผๅทฒๆ็พ {amount} QDT', - 'wallet.withdrawFailed': 'ๆ็พๅคฑๆ•—', - 'wallet.noTradingRecords': 'ๆšซ็„กไบคๆ˜“่จ˜้Œ„', - 'wallet.noMoneyLog': 'ๆšซ็„ก่ณ‡้‡‘ๆ˜Ž็ดฐ', - 'wallet.loadTradingRecordsFailed': 'ๅŠ ่ผ‰ไบคๆ˜“่จ˜้Œ„ๅคฑๆ•—', - 'wallet.loadMoneyLogFailed': 'ๅŠ ่ผ‰่ณ‡้‡‘ๆ˜Ž็ดฐๅคฑๆ•—', - 'wallet.moneyLogTotal': 'ๅ…ฑ {total} ๆข่จ˜้Œ„', - 'wallet.moneyLogTypeTitle': '้กžๅž‹', - 'wallet.moneyLogType.all': 'ๅ…จ้ƒจ้กžๅž‹', - 'wallet.table.time': 'ๆ™‚้–“', - 'wallet.table.type': '้กžๅž‹', - 'wallet.table.price': 'ๅƒนๆ ผ', - 'wallet.table.amount': 'ๆ•ธ้‡', - 'wallet.table.money': '้‡‘้ก', - 'wallet.table.balance': '้ค˜้ก', - 'wallet.table.memo': 'ๅ‚™ๆณจ', - 'wallet.table.value': 'ๅƒนๅ€ผ', - 'wallet.table.profit': '็›ˆ่™ง', - 'wallet.table.commission': 'ๆ‰‹็บŒ่ฒป', - 'wallet.table.total': 'ๅ…ฑ {total} ๆข่จ˜้Œ„', - 'wallet.tradeType.buy': '่ฒทๅ…ฅ', - 'wallet.tradeType.sell': '่ณฃๅ‡บ', - 'wallet.tradeType.liquidation': 'ๅผทๅนณ', - 'wallet.tradeType.openLong': '้–‹ๅคš', - 'wallet.tradeType.addLong': 'ๅŠ ๅคš', - 'wallet.tradeType.closeLong': 'ๅนณๅคš', - 'wallet.tradeType.closeLongStop': 'ๆญขๆๅนณๅคš', - 'wallet.tradeType.closeLongProfit': 'ๆญข็›ˆๅนณๅคš', - 'wallet.tradeType.openShort': '้–‹็ฉบ', - 'wallet.tradeType.addShort': 'ๅŠ ็ฉบ', - 'wallet.tradeType.closeShort': 'ๅนณ็ฉบ', - 'wallet.tradeType.closeShortStop': 'ๆญขๆๅนณ็ฉบ', - 'wallet.tradeType.closeShortProfit': 'ๆญข็›ˆๅนณ็ฉบ', - 'wallet.moneyLogType.purchase': '่ณผ่ฒทๆŒ‡ๆจ™', - 'wallet.moneyLogType.recharge': 'ๅ……ๅ€ผ', - 'wallet.moneyLogType.withdraw': 'ๆ็พ', - 'wallet.moneyLogType.refund': '้€€ๆฌพ', - 'wallet.moneyLogType.reward': '็Žๅ‹ต', - 'wallet.moneyLogType.income': 'ๆ”ถๅ…ฅ', - 'wallet.moneyLogType.commission': 'ๆ‰‹็บŒ่ฒป', - 'wallet.web3Address.required': '่ซ‹ๅ…ˆๅกซๅฏซWeb3้ŒขๅŒ…ๅœฐๅ€', - 'wallet.web3Address.requiredDescription': 'ๅ……ๅ€ผๅ‰้œ€่ฆๅ…ˆ็ถๅฎšๆ‚จ็š„Web3้ŒขๅŒ…ๅœฐๅ€๏ผŒ็”จๆ–ผๆŽฅๆ”ถๅ……ๅ€ผ', - 'wallet.web3Address.placeholder': '่ซ‹่ผธๅ…ฅๆ‚จ็š„Web3้ŒขๅŒ…ๅœฐๅ€๏ผˆ0x้–‹้ ญ๏ผ‰', - 'wallet.web3Address.save': 'ไฟๅญ˜้ŒขๅŒ…ๅœฐๅ€', - 'wallet.web3Address.saveSuccess': '้ŒขๅŒ…ๅœฐๅ€ไฟๅญ˜ๆˆๅŠŸ', - 'wallet.web3Address.saveFailed': 'ไฟๅญ˜้ŒขๅŒ…ๅœฐๅ€ๅคฑๆ•—', - 'wallet.web3Address.invalidFormat': '่ซ‹่ผธๅ…ฅๆœ‰ๆ•ˆ็š„Web3้ŒขๅŒ…ๅœฐๅ€๏ผˆไปฅๅคชๅŠๆ ผๅผ๏ผš0x้–‹้ ญ42ไฝๅญ—็ฌฆ๏ผŒๆˆ–TRC20ๆ ผๅผ๏ผšT้–‹้ ญ34ไฝๅญ—็ฌฆ๏ผ‰', - 'wallet.selectCoin': '้ธๆ“‡ๅนฃ็จฎ', - 'wallet.selectChain': '้ธๆ“‡้ˆ', - 'wallet.chain.eth': 'ETH(ERC20)', - 'wallet.chain.trc20': 'TRC20', - 'wallet.chain.bsc': 'BSC', - 'wallet.targetQdtAmount': 'ๆƒณ่ฆๅ…Œๆ›็š„QDTๆ•ธ้‡๏ผˆๅฏ้ธ๏ผ‰', - 'wallet.targetQdtAmount.placeholder': '่ซ‹่ผธๅ…ฅๆƒณ่ฆๅ…Œๆ›็š„QDTๆ•ธ้‡๏ผŒ็•ถๅ‰QDTๅƒนๆ ผ๏ผš{price} USDT', - 'wallet.targetQdtAmount.requiredUsdt': '้œ€่ฆๅ……ๅ€ผ๏ผš{amount} USDT', - 'wallet.rechargeAddress': 'ๅ……ๅ€ผๅœฐๅ€', - 'wallet.copyAddress': 'ๅพฉๅˆถ', - 'wallet.copySuccess': 'ๅพฉๅˆถๆˆๅŠŸ๏ผ', - 'wallet.copyFailed': 'ๅพฉๅˆถๅคฑๆ•—๏ผŒ่ซ‹ๆ‰‹ๅ‹•ๅพฉๅˆถ', - 'wallet.rechargeAddressHint': '่ซ‹็ขบไฟไฝฟ็”จ{chain}้ˆๅ‘ๆญคๅœฐๅ€ๅ……ๅ€ผ{coin}', - 'wallet.qdtPrice.loading': 'ๅŠ ่ผ‰ไธญ...', - 'wallet.rechargeTip.new': '่ซ‹้ธๆ“‡ๅนฃ็จฎๅ’Œ้ˆ๏ผŒ็„ถๅพŒๆŽƒๆไธ‹ๆ–นไบŒ็ถญ็ขผ้€ฒ่กŒๅ……ๅ€ผ', - 'wallet.exchangeRate': '1 QDT โ‰ˆ {rate} USDT', - 'wallet.withdrawableAmount': 'ๅฏๆ็พ้‡‘้ก', - 'wallet.totalBalance': '็ธฝ้ค˜้ก', - 'wallet.insufficientWithdrawable': 'ๅฏๆ็พ้‡‘้กไธ่ถณ๏ผŒ็•ถๅ‰ๅฏๆ็พ๏ผš{amount} QDT', - 'wallet.withdrawAddressRequired': '่ซ‹่ผธๅ…ฅๆ็พๅœฐๅ€', - 'wallet.withdrawAddressHint': '่ซ‹็ขบไฟๅœฐๅ€ๆญฃ็ขบ๏ผŒๆ็พๅพŒ็„กๆณ•ๆ’ค้Šท', - 'wallet.withdrawSubmitSuccess': 'ๆ็พ็”ณ่ซ‹ๆไบคๆˆๅŠŸ๏ผŒ่ซ‹็ญ‰ๅพ…ๅฏฉๆ ธ', - 'menu.footer.contactUs': '่ฏ็ณปๆˆ‘ๅ€‘', - 'menu.footer.getSupport': '็ฒๅ–ๆ”ฏๆŒ', - 'menu.footer.socialAccounts': '็คพไบค่ณฌๆˆถ', - 'menu.footer.userAgreement': '็”จๆˆถๅ”่ญฐ', - 'menu.footer.privacyPolicy': '้šฑ็งๆขไพ‹', - 'menu.footer.support': 'Support', - 'menu.footer.featureRequest': 'Feature request', - 'menu.footer.email': 'Email', - 'menu.footer.liveChat': '24/7 live chat', - 'dashboard.analysis.title': 'Multi-Dimensional Analysis', - 'dashboard.analysis.subtitle': 'AI้ฉ…ๅ‹•็š„็ถœๅˆ้‡‘่žๅˆ†ๆžๅนณ่‡บ', - 'dashboard.analysis.selectSymbol': '้ธๆ“‡ๆˆ–่ผธๅ…ฅๆจ™็š„ไปฃ็ขผ', - 'dashboard.analysis.selectModel': '้ธๆ“‡ๆจกๅž‹', - 'dashboard.analysis.startAnalysis': '้–‹ๅง‹ๅˆ†ๆž', - 'dashboard.analysis.history': 'ๆญทๅฒ่จ˜้Œ„', - 'dashboard.analysis.tab.overview': '็ถœๅˆๅˆ†ๆž', - 'dashboard.analysis.tab.fundamental': 'ๅŸบๆœฌ้ข', - 'dashboard.analysis.tab.technical': 'ๆŠ€่ก“', - 'dashboard.analysis.tab.news': 'ๆ–ฐ่ž', - 'dashboard.analysis.tab.sentiment': 'ๆƒ…็ท’', - 'dashboard.analysis.tab.risk': '้ขจ้šช', - 'dashboard.analysis.tab.debate': 'ๅคš็ฉบ่พฏ่ซ–', - 'dashboard.analysis.tab.decision': 'ๆœ€็ต‚ๆฑบ็ญ–', - 'dashboard.analysis.empty.selectSymbol': '้ธๆ“‡ๆจ™็š„้–‹ๅง‹ๅˆ†ๆž', - 'dashboard.analysis.empty.selectSymbolDesc': 'ๅพž่‡ช้ธ่‚กๅˆ—่กจไธญ้ธๆ“‡ๆˆ–่ผธๅ…ฅๆจ™็š„ไปฃ็ขผ๏ผŒ็ฒๅ–ๅคš็ถญๅบฆAIๅˆ†ๆžๅ ฑๅ‘Š', - 'dashboard.analysis.empty.startAnalysis': '้ปžๆ“Š"้–‹ๅง‹ๅˆ†ๆž"ๆŒ‰้ˆ•้€ฒ่กŒๅคš็ถญๅบฆๅˆ†ๆž', - 'dashboard.analysis.empty.startAnalysisDesc': 'ๆˆ‘ๅ€‘ๅฐ‡ๅพžๅŸบๆœฌ้ขใ€ๆŠ€่ก“ใ€ๆ–ฐ่žใ€ๆƒ…็ท’ๅ’Œ้ขจ้šช็ญ‰ๅคšๅ€‹็ถญๅบฆ็ˆฒๆ‚จๆไพ›ๅ…จ้ข็š„ๅˆ†ๆž', - 'dashboard.analysis.empty.noData': 'ๆšซ็„ก{type}ๅˆ†ๆžๆ•ธๆ“š๏ผŒ่ซ‹ๅ…ˆ้€ฒ่กŒ็ถœๅˆๅˆ†ๆž', - 'dashboard.analysis.empty.noWatchlist': 'ๆšซ็„ก่‡ช้ธ่‚ก', - 'dashboard.analysis.empty.noHistory': 'ๆšซ็„กๆญทๅฒ่จ˜้Œ„', - 'dashboard.analysis.empty.watchlistHint': 'ๆšซ็„ก่‡ช้ธ่‚ก๏ผŒ่ซ‹ๅ…ˆ', - 'dashboard.analysis.empty.noDebateData': 'ๆšซ็„ก่พฏ่ซ–ๆ•ธๆ“š', - 'dashboard.analysis.empty.noDecisionData': 'ๆšซ็„กๆฑบ็ญ–ๆ•ธๆ“š', - 'dashboard.analysis.empty.selectAgent': '่ซ‹้ธๆ“‡ไธ€ๅ€‹ Agent ๆŸฅ็œ‹ๅˆ†ๆž็ตๆžœ', - 'dashboard.analysis.loading.analyzing': 'ๆญฃๅœจๅˆ†ๆžไธญ๏ผŒ่ซ‹็จๅ€™...', - 'dashboard.analysis.loading.fundamental': 'ๆญฃๅœจๅˆ†ๆžๅŸบๆœฌ้ขๆ•ธๆ“š...', - 'dashboard.analysis.loading.technical': 'ๆญฃๅœจๅˆ†ๆžๆŠ€่ก“ๆŒ‡ๆจ™...', - 'dashboard.analysis.loading.news': 'ๆญฃๅœจๅˆ†ๆžๆ–ฐ่žๆ•ธๆ“š...', - 'dashboard.analysis.loading.sentiment': 'ๆญฃๅœจๅˆ†ๆžๅธ‚ๅ ดๆƒ…็ท’...', - 'dashboard.analysis.loading.risk': 'ๆญฃๅœจ่ฉ•ไผฐ้ขจ้šช...', - 'dashboard.analysis.loading.debate': 'ๆญฃๅœจ้€ฒ่กŒๅคš็ฉบ่พฏ่ซ–...', - 'dashboard.analysis.loading.decision': 'ๆญฃๅœจ็”Ÿๆˆๆœ€็ต‚ๆฑบ็ญ–...', - 'dashboard.analysis.score.overall': '็ถœๅˆ่ฉ•ๅˆ†', - 'dashboard.analysis.score.recommendation': 'ๆŠ•่ณ‡ๅปบ่ญฐ', - 'dashboard.analysis.score.confidence': '็ฝฎไฟกๅบฆ', - 'dashboard.analysis.dimension.fundamental': 'ๅŸบๆœฌ้ข', - 'dashboard.analysis.dimension.technical': 'ๆŠ€่ก“', - 'dashboard.analysis.dimension.news': 'ๆ–ฐ่ž', - 'dashboard.analysis.dimension.sentiment': 'ๆƒ…็ท’', - 'dashboard.analysis.dimension.risk': '้ขจ้šช', - 'dashboard.analysis.card.dimensionScores': 'ๅ„็ถญๅบฆ่ฉ•ๅˆ†', - 'dashboard.analysis.card.overviewReport': '็ถœๅˆๅˆ†ๆžๅ ฑๅ‘Š', - 'dashboard.analysis.card.financialMetrics': '่ฒกๅ‹™ๆŒ‡ๆจ™', - 'dashboard.analysis.card.fundamentalReport': 'ๅŸบๆœฌ้ขๅˆ†ๆžๅ ฑๅ‘Š', - 'dashboard.analysis.card.technicalIndicators': 'ๆŠ€่ก“ๆŒ‡ๆจ™', - 'dashboard.analysis.card.technicalReport': 'ๆŠ€่ก“ๅˆ†ๆžๅ ฑๅ‘Š', - 'dashboard.analysis.card.newsList': '็›ธ้—œๆ–ฐ่ž', - 'dashboard.analysis.card.newsReport': 'ๆ–ฐ่žๅˆ†ๆžๅ ฑๅ‘Š', - 'dashboard.analysis.card.sentimentIndicators': 'ๆƒ…็ท’ๆŒ‡ๆจ™', - 'dashboard.analysis.card.sentimentReport': 'ๆƒ…็ท’ๅˆ†ๆžๅ ฑๅ‘Š', - 'dashboard.analysis.card.riskMetrics': '้ขจ้šชๆŒ‡ๆจ™', - 'dashboard.analysis.card.riskReport': '้ขจ้šช่ฉ•ไผฐๅ ฑๅ‘Š', - 'dashboard.analysis.card.bullView': '็œ‹ๆผฒ่ง€้ปž (Bull)', - 'dashboard.analysis.card.bearView': '็œ‹่ทŒ่ง€้ปž (Bear)', - 'dashboard.analysis.card.researchConclusion': '็ ”็ฉถๅ“ก็ต่ซ–', - 'dashboard.analysis.card.traderPlan': 'ไบคๆ˜“ๅ“ก่จˆๅŠƒ', - 'dashboard.analysis.card.riskDebate': '้ขจ้šชๅง”ๅ“กๆœƒ่พฏ่ซ–', - 'dashboard.analysis.card.finalDecision': 'ๆœ€็ต‚ๆฑบ็ญ– (Final Decision)', - 'dashboard.analysis.card.tradePlanDetail': 'ไบคๆ˜“่จˆๅŠƒ่ฉณๆƒ…', - 'dashboard.analysis.tradingPlan.entry_price': 'ๅ…ฅๅ ดๅƒนๆ ผ', - 'dashboard.analysis.tradingPlan.position_size': 'ๅ€‰ไฝๅคงๅฐ', - 'dashboard.analysis.tradingPlan.stop_loss': 'ๆญขๆ', - 'dashboard.analysis.tradingPlan.take_profit': 'ๆญข็›ˆ', - 'dashboard.analysis.label.confidence': '็ฝฎไฟกๅบฆ', - 'dashboard.analysis.label.keyPoints': 'ๆ ธๅฟƒ่ฆ้ปž', - 'dashboard.analysis.label.riskWarning': '้ขจ้šชๆ็คบ', - 'dashboard.analysis.risk.risky': 'ๆฟ€้€ฒๆดพ่ง€้ปž (Risky)', - 'dashboard.analysis.risk.neutral': 'ไธญ็ซ‹ๆดพ่ง€้ปž (Neutral)', - 'dashboard.analysis.risk.safe': 'ไฟๅฎˆๆดพ่ง€้ปž (Safe)', - 'dashboard.analysis.risk.conclusion': '็ต่ซ–', - 'dashboard.analysis.feature.fundamental': 'ๅŸบๆœฌ้ขๅˆ†ๆž', - 'dashboard.analysis.feature.technical': 'ๆŠ€่ก“ๅˆ†ๆž', - 'dashboard.analysis.feature.news': 'ๆ–ฐ่žๅˆ†ๆž', - 'dashboard.analysis.feature.sentiment': 'ๆƒ…็ท’ๅˆ†ๆž', - 'dashboard.analysis.feature.risk': '้ขจ้šช่ฉ•ไผฐ', - 'dashboard.analysis.watchlist.title': 'ๆˆ‘็š„่‡ช้ธ่‚ก', - 'dashboard.analysis.watchlist.add': 'ๆทปๅŠ ', - 'dashboard.analysis.watchlist.addStock': 'ๆทปๅŠ ่‚ก็ฅจ', - 'dashboard.analysis.modal.addStock.title': 'ๆทปๅŠ ่‡ช้ธ่‚ก', - 'dashboard.analysis.modal.addStock.confirm': '็ขบๅฎš', - 'dashboard.analysis.modal.addStock.cancel': 'ๅ–ๆถˆ', - 'dashboard.analysis.modal.addStock.market': 'ๅธ‚ๅ ด้กžๅž‹', - 'dashboard.analysis.modal.addStock.marketPlaceholder': '่ซ‹้ธๆ“‡ๅธ‚ๅ ด', - 'dashboard.analysis.modal.addStock.marketRequired': '่ซ‹้ธๆ“‡ๅธ‚ๅ ด้กžๅž‹', - 'dashboard.analysis.modal.addStock.symbol': '่‚ก็ฅจไปฃ็ขผ', - 'dashboard.analysis.modal.addStock.symbolPlaceholder': 'ไพ‹ๅฆ‚: AAPL, TSLA, GOOGL, 000001, BTC', - 'dashboard.analysis.modal.addStock.symbolRequired': '่ซ‹่ผธๅ…ฅ่‚ก็ฅจไปฃ็ขผ', - 'dashboard.analysis.modal.addStock.searchPlaceholder': 'ๆœ็ดขๆจ™็š„ไปฃ็ขผๆˆ–ๅ็จฑ', - 'dashboard.analysis.modal.addStock.searchOrInputPlaceholder': 'ๆœ็ดขๆˆ–่ผธๅ…ฅๆจ™็š„ไปฃ็ขผ๏ผˆๅฆ‚๏ผšAAPLใ€BTC/USDTใ€EUR/USD๏ผ‰', - 'dashboard.analysis.modal.addStock.searchOrInputHint': 'ๆ”ฏๆŒๆœ็ดขๆ•ธๆ“šๅบซไธญ็š„ๆจ™็š„๏ผŒๆˆ–็›ดๆŽฅ่ผธๅ…ฅไปฃ็ขผ๏ผˆ็ณป็ตฑๅฐ‡่‡ชๅ‹•็ฒๅ–ๅ็จฑ๏ผ‰', - 'dashboard.analysis.modal.addStock.search': 'ๆœ็ดข', - 'dashboard.analysis.modal.addStock.searchResults': 'ๆœ็ดข็ตๆžœ', - 'dashboard.analysis.modal.addStock.hotSymbols': '็†ฑ้–€ๆจ™็š„', - 'dashboard.analysis.modal.addStock.noHotSymbols': 'ๆšซ็„ก็†ฑ้–€ๆจ™็š„', - 'dashboard.analysis.modal.addStock.selectedSymbol': 'ๅทฒ้ธๆจ™็š„', - 'dashboard.analysis.modal.addStock.pleaseSelectSymbol': '่ซ‹ๅ…ˆ้ธๆ“‡ไธ€ๅ€‹ๆจ™็š„', - 'dashboard.analysis.modal.addStock.pleaseSelectOrEnterSymbol': '่ซ‹ๅ…ˆ้ธๆ“‡ไธ€ๅ€‹ๆจ™็š„ๆˆ–่ผธๅ…ฅๆจ™็š„ไปฃ็ขผ', - 'dashboard.analysis.modal.addStock.pleaseEnterSymbol': '่ซ‹่ผธๅ…ฅๆจ™็š„ไปฃ็ขผ', - 'dashboard.analysis.modal.addStock.pleaseSelectMarket': '่ซ‹ๅ…ˆ้ธๆ“‡ๅธ‚ๅ ด้กžๅž‹', - 'dashboard.analysis.modal.addStock.searchFailed': 'ๆœ็ดขๅคฑๆ•—๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'dashboard.analysis.modal.addStock.noSearchResults': 'ๆœชๆ‰พๅˆฐๅŒน้…็š„ๆจ™็š„', - 'dashboard.analysis.modal.addStock.willAutoFetchName': '็ณป็ตฑๅฐ‡่‡ชๅ‹•็ฒๅ–ๅ็จฑ', - 'dashboard.analysis.modal.addStock.addDirectly': '็›ดๆŽฅๆทปๅŠ ', - 'dashboard.analysis.modal.addStock.nameWillBeFetched': 'ๅ็จฑๅฐ‡ๅœจๆทปๅŠ ๆ™‚่‡ชๅ‹•็ฒๅ–', - 'dashboard.analysis.market.USStock': '็พŽ่‚ก', - 'dashboard.analysis.market.Crypto': 'ๅŠ ๅฏ†่ฒจๅนฃ', - 'dashboard.analysis.market.Forex': 'ๅค–ๅŒฏ', - 'dashboard.analysis.market.Futures': 'ๆœŸ่ฒจ', - 'dashboard.analysis.modal.history.title': 'ๆญทๅฒๅˆ†ๆž่จ˜้Œ„', - 'dashboard.analysis.modal.history.viewResult': 'ๆŸฅ็œ‹็ตๆžœ', - 'dashboard.analysis.modal.history.completeTime': 'ๅฎŒๆˆๆ™‚้–“', - 'dashboard.analysis.modal.history.error': '้Œฏ่ชค', - 'dashboard.analysis.status.pending': 'ๅพ…่™•็†', - 'dashboard.analysis.status.processing': '่™•็†ไธญ', - 'dashboard.analysis.status.completed': 'ๅทฒๅฎŒๆˆ', - 'dashboard.analysis.status.failed': 'ๅคฑๆ•—', - 'dashboard.analysis.message.selectSymbol': '่ซ‹ๅ…ˆ้ธๆ“‡ๆจ™็š„', - 'dashboard.analysis.message.taskCreated': 'ๅˆ†ๆžไปปๅ‹™ๅทฒๅ‰ตๅปบ๏ผŒๆญฃๅœจๅพŒ่‡บๅŸท่กŒ...', - 'dashboard.analysis.message.analysisComplete': 'ๅˆ†ๆžๅฎŒๆˆ', - 'dashboard.analysis.message.analysisCompleteCache': 'ๅˆ†ๆžๅฎŒๆˆ๏ผˆไฝฟ็”จ็ทฉๅญ˜ๆ•ธๆ“š๏ผ‰', - 'dashboard.analysis.message.analysisFailed': 'ๅˆ†ๆžๅคฑๆ•—๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'dashboard.analysis.message.addStockSuccess': 'ๆทปๅŠ ๆˆๅŠŸ', - 'dashboard.analysis.message.addStockFailed': 'ๆทปๅŠ ๅคฑๆ•—', - 'dashboard.analysis.message.removeStockSuccess': '็งป้™คๆˆๅŠŸ', - 'dashboard.analysis.message.removeStockFailed': '็งป้™คๅคฑๆ•—', - 'dashboard.analysis.message.resumingAnalysis': 'ๆญฃๅœจๆขๅพฉๅˆ†ๆžไปปๅ‹™...', - 'dashboard.analysis.message.deleteSuccess': 'ๅˆช้™คๆˆๅŠŸ', - 'dashboard.analysis.message.deleteFailed': 'ๅˆช้™คๅคฑๆ•—', - 'dashboard.analysis.modal.history.delete': 'ๅˆช้™ค', - 'dashboard.analysis.modal.history.deleteConfirm': '็ขบๅฎš่ฆๅˆช้™ค้€™ๆขๅˆ†ๆž่จ˜้Œ„ๅ—Ž๏ผŸ', - 'dashboard.analysis.test': 'ๅทฅๅฐˆ่ทฏ {no} ่™Ÿๅบ—', - 'dashboard.analysis.introduce': 'ๆŒ‡ๆจ™่ชชๆ˜Ž', - 'dashboard.analysis.total-sales': '็ธฝ้Šทๅ”ฎ้ก', - 'dashboard.analysis.day-sales': 'ๆ—ฅๅ‡้Šทๅ”ฎ้ก๏ฟฅ', - 'dashboard.analysis.visits': '่จชๅ•้‡', - 'dashboard.analysis.visits-trend': '่จชๅ•้‡่ถจๅ‹ข', - 'dashboard.analysis.visits-ranking': '้–€ๅบ—่จชๅ•้‡ๆŽ’ๅ', - 'dashboard.analysis.day-visits': 'ๆ—ฅ่จชๅ•้‡', - 'dashboard.analysis.week': 'ๅ‘จๅŒๆฏ”', - 'dashboard.analysis.day': 'ๆ—ฅๅŒๆฏ”', - 'dashboard.analysis.payments': 'ๆ”ฏไป˜็ญ†ๆ•ธ', - 'dashboard.analysis.conversion-rate': '่ฝ‰ๅŒ–็އ', - 'dashboard.analysis.operational-effect': '้‹็‡Ÿๆดปๅ‹•ๆ•ˆๆžœ', - 'dashboard.analysis.sales-trend': '้Šทๅ”ฎ่ถจๅ‹ข', - 'dashboard.analysis.sales-ranking': '้–€ๅบ—้Šทๅ”ฎ้กๆŽ’ๅ', - 'dashboard.analysis.all-year': 'ๅ…จๅนด', - 'dashboard.analysis.all-month': 'ๆœฌๆœˆ', - 'dashboard.analysis.all-week': 'ๆœฌๅ‘จ', - 'dashboard.analysis.all-day': 'ไปŠๆ—ฅ', - 'dashboard.analysis.search-users': 'ๆœ็ดข็”จๆˆถๆ•ธ', - 'dashboard.analysis.per-capita-search': 'ไบบๅ‡ๆœ็ดขๆฌกๆ•ธ', - 'dashboard.analysis.online-top-search': '็ทšไธŠ็†ฑ้–€ๆœ็ดข', - 'dashboard.analysis.the-proportion-of-sales': '้Šทๅ”ฎ้ก้กžๅˆฅไฝ”ๆฏ”', - 'dashboard.analysis.dropdown-option-one': 'ๆ“ไฝœไธ€', - 'dashboard.analysis.dropdown-option-two': 'ๆ“ไฝœไบŒ', - 'dashboard.analysis.channel.all': 'ๅ…จ้ƒจๆธ ้“', - 'dashboard.analysis.channel.online': '็ทšไธŠ', - 'dashboard.analysis.channel.stores': '้–€ๅบ—', - 'dashboard.analysis.sales': '้Šทๅ”ฎ้ก', - 'dashboard.analysis.traffic': 'ๅฎขๆต้‡', - 'dashboard.analysis.table.rank': 'ๆŽ’ๅ', - 'dashboard.analysis.table.search-keyword': 'ๆœ็ดข้—œ้ต่ฉž', - 'dashboard.analysis.table.users': '็”จๆˆถๆ•ธ', - 'dashboard.analysis.table.weekly-range': 'ๅ‘จๆผฒๅน…', - 'dashboard.indicator.selectSymbol': '้ธๆ“‡ๆˆ–่ผธๅ…ฅๆจ™็š„ไปฃ็ขผ', - 'dashboard.indicator.emptyWatchlistHint': 'ๆšซ็„ก่‡ช้ธ่‚ก๏ผŒ่ซ‹ๅ…ˆๆทปๅŠ ', - 'dashboard.indicator.hint.selectSymbol': '่ซ‹้ธๆ“‡ๆจ™็š„้–‹ๅง‹ๅˆ†ๆž', - 'dashboard.indicator.hint.selectSymbolDesc': 'ๅœจไธŠๆ–นๆœ็ดขๆก†ไธญ้ธๆ“‡ๆˆ–่ผธๅ…ฅ่‚ก็ฅจไปฃ็ขผ๏ผŒๆŸฅ็œ‹K็ทšๅœ–่กจๅ’ŒๆŠ€่ก“ๆŒ‡ๆจ™', - 'dashboard.indicator.retry': '้‡่ฉฆ', - 'dashboard.indicator.panel.title': 'ๆŠ€่ก“ๆŒ‡ๆจ™', - 'dashboard.indicator.panel.realtimeOn': '้—œ้–‰ๅฏฆๆ™‚ๆ›ดๆ–ฐ', - 'dashboard.indicator.panel.realtimeOff': '้–‹ๅ•“ๅฏฆๆ™‚ๆ›ดๆ–ฐ', - 'dashboard.indicator.panel.themeLight': 'ๅˆ‡ๆ›ๅˆฐๆทฑ่‰ฒไธป้กŒ', - 'dashboard.indicator.panel.themeDark': 'ๅˆ‡ๆ›ๅˆฐๆทบ่‰ฒไธป้กŒ', - 'dashboard.indicator.section.enabled': 'ๅทฒๅ•“็”จ', - 'dashboard.indicator.section.added': 'ๆˆ‘ๆทปๅŠ ็š„ๆŒ‡ๆจ™', - 'dashboard.indicator.section.custom': '่‡ชๅทฑๅ‰ตๅปบ็š„ๆŒ‡ๆจ™', - 'dashboard.indicator.section.bought': 'ๆˆ‘้ธ่ณผ็š„ๆŒ‡ๆจ™', - 'dashboard.indicator.section.myCreated': 'ๆˆ‘ๅ‰ตๅปบ็š„ๆŒ‡ๆจ™', - 'dashboard.indicator.empty': 'ๆšซ็„กๆŒ‡ๆจ™๏ผŒ่ซ‹ๅ…ˆๆทปๅŠ ๆˆ–ๅ‰ตๅปบๆŒ‡ๆจ™', - 'dashboard.indicator.buy': '่ณผ่ฒทๆŒ‡ๆจ™', - 'dashboard.indicator.action.start': 'ๅ•“ๅ‹•', - 'dashboard.indicator.action.stop': '้—œ้–‰', - 'dashboard.indicator.action.edit': '็ทจ่ผฏ', - 'dashboard.indicator.action.delete': 'ๅˆช้™ค', - 'dashboard.indicator.action.backtest': 'ๅ›žๆธฌ', - 'dashboard.indicator.status.normal': 'ๆญฃๅธธ', - 'dashboard.indicator.status.normalPermanent': 'ๆญฃๅธธ๏ผˆๆฐธไน…ๆœ‰ๆ•ˆ๏ผ‰', - 'dashboard.indicator.status.expired': 'ๅทฒ้ŽๆœŸ', - 'dashboard.indicator.expiry.permanent': 'ๆฐธไน…ๆœ‰ๆ•ˆ', - 'dashboard.indicator.expiry.noExpiry': '็„กๅˆฐๆœŸๆ™‚้–“', - 'dashboard.indicator.expiry.expired': 'ๅทฒ้ŽๆœŸ๏ผš{date}', - 'dashboard.indicator.expiry.expiresOn': 'ๅˆฐๆœŸๆ™‚้–“๏ผš{date}', - 'dashboard.indicator.delete.confirmTitle': '็ขบ่ชๅˆช้™ค', - 'dashboard.indicator.delete.confirmContent': '็ขบๅฎš่ฆๅˆช้™คๆŒ‡ๆจ™"{name}"ๅ—Ž๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅพฉใ€‚', - 'dashboard.indicator.delete.confirmOk': 'ๅˆช้™ค', - 'dashboard.indicator.delete.confirmCancel': 'ๅ–ๆถˆ', - 'dashboard.indicator.delete.success': 'ๅˆช้™คๆˆๅŠŸ', - 'dashboard.indicator.delete.failed': 'ๅˆช้™คๅคฑๆ•—', - 'dashboard.indicator.save.success': 'ไฟๅญ˜ๆˆๅŠŸ', - 'dashboard.indicator.save.failed': 'ไฟๅญ˜ๅคฑๆ•—', - 'dashboard.indicator.error.loadWatchlistFailed': 'ๅŠ ่ผ‰่‡ช้ธ่‚กๅคฑๆ•—', - 'dashboard.indicator.error.chartNotReady': 'ๅœ–่กจ็ต„ไปถๆœชๅˆๅง‹ๅŒ–๏ผŒ่ซ‹ๅ…ˆ้ธๆ“‡ๆจ™็š„ไธฆ็ญ‰ๅพ…ๅœ–่กจๅŠ ่ผ‰ๅฎŒๆˆ', - 'dashboard.indicator.error.chartMethodNotReady': 'ๅœ–่กจ็ต„ไปถๆ–นๆณ•ๆœชๅฐฑ็ท’๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'dashboard.indicator.error.chartExecuteNotReady': 'ๅœ–่กจ็ต„ไปถๅŸท่กŒๆ–นๆณ•ๆœชๅฐฑ็ท’๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'dashboard.indicator.error.parseFailed': '็„กๆณ•่งฃๆžPythonไปฃ็ขผ', - 'dashboard.indicator.error.parseFailedCheck': '็„กๆณ•่งฃๆžPythonไปฃ็ขผ๏ผŒ่ซ‹ๆชขๆŸฅไปฃ็ขผๆ ผๅผ', - 'dashboard.indicator.error.addIndicatorFailed': 'ๆทปๅŠ ๆŒ‡ๆจ™ๅคฑๆ•—', - 'dashboard.indicator.error.runIndicatorFailed': '้‹่กŒๆŒ‡ๆจ™ๅคฑๆ•—', - 'dashboard.indicator.error.pleaseLogin': '่ซ‹ๅ…ˆ็™ป้Œ„', - 'dashboard.indicator.error.loadDataFailed': 'ๆ•ธๆ“šๅŠ ่ผ‰ๅคฑๆ•—', - 'dashboard.indicator.error.loadDataFailedDesc': '่ซ‹ๆชขๆŸฅ็ถฒ็ตก้€ฃๆŽฅ', - 'dashboard.indicator.error.tiingoSubscription': 'ๅค–ๅŒฏ1ๅˆ†้˜ๆ•ธๆ“š้œ€่ฆ Tiingo ไป˜่ฒป่จ‚้–ฑ๏ผŒ่ซ‹ไฝฟ็”จๅ…ถไป–ๆ™‚้–“้€ฑๆœŸๆˆ–ๅ‡็ดš่จ‚้–ฑ', - 'dashboard.indicator.error.pythonEngineFailed': 'Python ๅผ•ๆ“ŽๅŠ ่ผ‰ๅคฑๆ•—๏ผŒๆŒ‡ๆจ™ๅŠŸ่ƒฝๅฏ่ƒฝ็„กๆณ•ไฝฟ็”จ', - 'dashboard.indicator.error.chartInitFailed': 'ๅœ–่กจๅˆๅง‹ๅŒ–ๅคฑๆ•—', - 'dashboard.indicator.warning.enterCode': '่ซ‹ๅ…ˆ่ผธๅ…ฅๆŒ‡ๆจ™ไปฃ็ขผ', - 'dashboard.indicator.warning.pyodideLoadFailed': 'Python ๅผ•ๆ“ŽๅŠ ่ผ‰ๅคฑๆ•—', - 'dashboard.indicator.warning.pyodideLoadFailedDesc': 'ๆ‚จ็•ถๅ‰ๆ‰€ๅœจๅ€ๅŸŸๆˆ–็ถฒ็ตก็’ฐๅขƒ็„กๆณ•ไฝฟ็”จ่ฉฒๅŠŸ่ƒฝ', - 'dashboard.indicator.warning.chartNotInitialized': 'ๅœ–่กจๆœชๅˆๅง‹ๅŒ–๏ผŒ็„กๆณ•ไฝฟ็”จ็•ซ็ทšๅทฅๅ…ท', - 'dashboard.indicator.success.runIndicator': 'ๆŒ‡ๆจ™้‹่กŒๆˆๅŠŸ', - 'dashboard.indicator.success.clearDrawings': 'ๅทฒๆธ…้™คๆ‰€ๆœ‰็•ซ็ทš', - 'dashboard.indicator.sma': 'SMA (ๅ‡็ทš็ต„ๅˆ)', - 'dashboard.indicator.ema': 'EMA (ๆŒ‡ๆ•ธๅ‡็ทš็ต„ๅˆ)', - 'dashboard.indicator.rsi': 'RSI (็›ธๅฐๅผทๅผฑ)', - 'dashboard.indicator.macd': 'MACD', - 'dashboard.indicator.bb': 'ๅธƒๆž—ๅธถ (Bollinger Bands)', - 'dashboard.indicator.atr': 'ATR (ๅนณๅ‡็œŸๅฏฆๆณขๅน…)', - 'dashboard.indicator.cci': 'CCI (ๅ•†ๅ“้€š้“ๆŒ‡ๆ•ธ)', - 'dashboard.indicator.williams': 'Williams %R (ๅจๅป‰ๆŒ‡ๆจ™)', - 'dashboard.indicator.mfi': 'MFI (่ณ‡้‡‘ๆต้‡ๆŒ‡ๆจ™)', - 'dashboard.indicator.adx': 'ADX (ๅนณๅ‡่ถจๅ‘ๆŒ‡ๆ•ธ)', - 'dashboard.indicator.obv': 'OBV (่ƒฝ้‡ๆฝฎ)', - 'dashboard.indicator.adosc': 'ADOSC (็ฉ็ดฏ/ๆดพ็™ผๆŒฏ่•ฉๅ™จ)', - 'dashboard.indicator.ad': 'AD (็ฉ็ดฏ/ๆดพ็™ผ็ทš)', - 'dashboard.indicator.kdj': 'KDJ (้šจๆฉŸๆŒ‡ๆจ™)', - 'dashboard.indicator.signal.buy': 'BUY', - 'dashboard.indicator.signal.sell': 'SELL', - 'dashboard.indicator.signal.supertrendBuy': 'SuperTrend Buy', - 'dashboard.indicator.signal.supertrendSell': 'SuperTrend Sell', - 'dashboard.indicator.chart.kline': 'K็ทš', - 'dashboard.indicator.chart.volume': 'ๆˆไบค้‡', - 'dashboard.indicator.chart.uptrend': 'Up Trend', - 'dashboard.indicator.chart.downtrend': 'Down Trend', - 'dashboard.indicator.tooltip.time': 'ๆ™‚้–“', - 'dashboard.indicator.tooltip.open': '้–‹', - 'dashboard.indicator.tooltip.close': 'ๆ”ถ', - 'dashboard.indicator.tooltip.high': '้ซ˜', - 'dashboard.indicator.tooltip.low': 'ไฝŽ', - 'dashboard.indicator.tooltip.volume': 'ๆˆไบค้‡', - 'dashboard.indicator.drawing.line': '็ทšๆฎต', - 'dashboard.indicator.drawing.horizontalLine': 'ๆฐดๅนณ็ทš', - 'dashboard.indicator.drawing.verticalLine': 'ๅž‚็›ด็ทš', - 'dashboard.indicator.drawing.ray': 'ๅฐ„็ทš', - 'dashboard.indicator.drawing.straightLine': '็›ด็ทš', - 'dashboard.indicator.drawing.parallelLine': 'ๅนณ่กŒ็ทš', - 'dashboard.indicator.drawing.priceLine': 'ๅƒนๆ ผ็ทš', - 'dashboard.indicator.drawing.priceChannel': 'ๅƒนๆ ผ้€š้“', - 'dashboard.indicator.drawing.fibonacciLine': 'ๆ–ๆณข้‚ฃๅฅ‘็ทš', - 'dashboard.indicator.drawing.clearAll': 'ๆธ…้™คๆ‰€ๆœ‰็•ซ็ทš', - 'dashboard.indicator.market.USStock': '็พŽ่‚ก', - 'dashboard.indicator.market.Crypto': 'ๅŠ ๅฏ†่ฒจๅนฃ', - 'dashboard.indicator.market.Forex': 'ๅค–ๅŒฏ', - 'dashboard.indicator.market.Futures': 'ๆœŸ่ฒจ', - 'dashboard.indicator.create': 'ๅ‰ตๅปบๆŒ‡ๆจ™', - 'dashboard.indicator.editor.title': 'ๅ‰ตๅปบ/็ทจ่ผฏๆŒ‡ๆจ™', - 'dashboard.indicator.editor.name': 'ๆŒ‡ๆจ™ๅ็จฑ', - 'dashboard.indicator.editor.nameRequired': '่ซ‹่ผธๅ…ฅๆŒ‡ๆจ™ๅ็จฑ', - 'dashboard.indicator.editor.namePlaceholder': '่ซ‹่ผธๅ…ฅๆŒ‡ๆจ™ๅ็จฑ', - 'dashboard.indicator.editor.description': 'ๆŒ‡ๆจ™ๆ่ฟฐ', - 'dashboard.indicator.editor.descriptionPlaceholder': '่ซ‹่ผธๅ…ฅๆŒ‡ๆจ™ๆ่ฟฐ๏ผˆๅฏ้ธ๏ผ‰', - 'dashboard.indicator.editor.code': 'ๆŒ‡ๆจ™่…ณๆœฌ๏ผˆPython๏ผ‰', - 'dashboard.indicator.editor.codeRequired': '่ซ‹่ผธๅ…ฅๆŒ‡ๆจ™ไปฃ็ขผ', - 'dashboard.indicator.editor.codePlaceholder': '่ซ‹่ผธๅ…ฅPythonไปฃ็ขผ', - 'dashboard.indicator.editor.run': '้‹่กŒ', - 'dashboard.indicator.editor.runHint': '้ปžๆ“Š้‹่กŒๆŒ‰้ˆ•ๅฏไปฅๅœจK็ทšๅœ–ไธŠ้ ่ฆฝๆŒ‡ๆจ™ๆ•ˆๆžœ', - 'dashboard.indicator.editor.guide': '้–‹็™ผๆŒ‡ๅ—', - 'dashboard.indicator.editor.guideTitle': 'Python ๆŒ‡ๆจ™้–‹็™ผๆŒ‡ๅ—', - 'dashboard.indicator.editor.save': 'ไฟๅญ˜', - 'dashboard.indicator.editor.cancel': 'ๅ–ๆถˆ', - 'dashboard.indicator.editor.unnamed': 'ๆœชๅ‘ฝๅๆŒ‡ๆจ™', - 'dashboard.indicator.editor.publishToCommunity': '็™ผๅธƒๅˆฐ็คพๅ€', - 'dashboard.indicator.editor.publishToCommunityHint': '็™ผๅธƒๅพŒ๏ผŒๅ…ถไป–็”จๆˆถๅฏไปฅๅœจ็คพๅ€ไธญๆŸฅ็œ‹ๅ’Œไฝฟ็”จๆ‚จ็š„ๆŒ‡ๆจ™', - 'dashboard.indicator.editor.indicatorType': 'ๆŒ‡ๆจ™้กžๅž‹', - 'dashboard.indicator.editor.indicatorTypeRequired': '่ซ‹้ธๆ“‡ๆŒ‡ๆจ™้กžๅž‹', - 'dashboard.indicator.editor.indicatorTypePlaceholder': '่ซ‹้ธๆ“‡ๆŒ‡ๆจ™้กžๅž‹', - 'dashboard.indicator.editor.previewImage': '้ ่ฆฝๅœ–', - 'dashboard.indicator.editor.uploadImage': 'ไธŠๅ‚ณๅœ–็‰‡', - 'dashboard.indicator.editor.previewImageHint': 'ๅปบ่ญฐๅฐบๅฏธ๏ผš800x400๏ผŒๅคงๅฐไธ่ถ…้Ž2MB', - 'dashboard.indicator.editor.pricing': 'ๅ”ฎๅƒน๏ผˆQDT๏ผ‰', - 'dashboard.indicator.editor.pricingType.free': 'ๅ…่ฒป', - 'dashboard.indicator.editor.pricingType.permanent': 'ๆฐธไน…', - 'dashboard.indicator.editor.pricingType.monthly': 'ๆœˆไป˜', - 'dashboard.indicator.editor.price': 'ๅƒนๆ ผ', - 'dashboard.indicator.editor.priceRequired': '่ซ‹่ผธๅ…ฅๅƒนๆ ผ', - 'dashboard.indicator.editor.pricePlaceholder': '่ซ‹่ผธๅ…ฅๅƒนๆ ผ', - 'dashboard.indicator.editor.pricingHint': 'ๅ…่ฒปๆŒ‡ๆจ™้›–็„ถๅƒนๆ ผ็ˆฒ0๏ผŒไฝ†ๅนณ่‡บๆœƒๆ นๆ“šๆ‚จ็š„ๆŒ‡ๆจ™ไฝฟ็”จ้‡ๅ’Œๅฅฝ่ฉ•็އ็ตฆไบˆ็Žๅ‹ต๏ผˆQDT๏ผ‰', - 'dashboard.indicator.editor.aiGenerate': 'ๆ™บ่ƒฝ็”Ÿๆˆ', - 'dashboard.indicator.editor.aiPromptPlaceholder': '่ซ‹ๆ่ฟฐไฝ ็š„ไฟก่™Ÿ้‚่ผฏ๏ผˆๅช่ผธๅ‡บ buy/sell๏ผ‰่ˆ‡็นชๅœ–๏ผˆplots๏ผ‰ใ€‚ๅ€‰ไฝ/้ขจๆŽง/ๅŠ ๆธ›ๅ€‰่ซ‹ๅœจๅ›žๆธฌ้…็ฝฎไธญ่จญๅฎšใ€‚', - 'dashboard.indicator.editor.aiGenerateBtn': 'AI็”Ÿๆˆไปฃ็ขผ', - 'dashboard.indicator.editor.aiPromptRequired': '่ซ‹่ผธๅ…ฅๆ‚จ็š„ๆƒณๆณ•', - 'dashboard.indicator.editor.aiGenerateSuccess': 'ไปฃ็ขผ็”ŸๆˆๆˆๅŠŸ', - 'dashboard.indicator.editor.aiGenerateError': 'ไปฃ็ขผ็”Ÿๆˆๅคฑๆ•—๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'dashboard.indicator.editor.verifyCode': 'ไปฃ็ขผๆชขๆŸฅ', - 'dashboard.indicator.editor.verifyCodeSuccess': 'ไปฃ็ขผๆชขๆŸฅ้€š้Ž', - 'dashboard.indicator.editor.verifyCodeFailed': 'ไปฃ็ขผๆชขๆŸฅๆœช้€š้Ž', - 'dashboard.indicator.editor.verifyCodeEmpty': 'ไปฃ็ขผไธ่ƒฝ็‚บ็ฉบ', - 'dashboard.indicator.boundary.message': 'ๆ็คบ๏ผšๆŒ‡ๆจ™่…ณๆœฌๅช่ฒ ่ฒฌใ€Œ่จˆ็ฎ— + ็นชๅœ– + buy/sell ไฟก่™Ÿใ€๏ผ›ๅ€‰ไฝใ€้ขจๆŽงใ€ๅŠ ๆธ›ๅ€‰ใ€ๆ‰‹็บŒ่ฒป/ๆป‘้ปžๅฑฌๆ–ผ็ญ–็•ฅๅŸท่กŒ้…็ฝฎใ€‚', - 'dashboard.indicator.boundary.indicatorRule': "ๆŒ‡ๆจ™่…ณๆœฌ่ซ‹ๅช่ผธๅ‡บ buy/sell๏ผˆไธฆ่จญๅฎš df['buy']/df['sell']๏ผ‰ใ€‚ไธ่ฆๅœจ่…ณๆœฌๅ…งๆ’ฐๅฏซๅ€‰ไฝ็ฎก็†ใ€ๆญข็›ˆๆญขๆใ€ๅŠ ๆธ›ๅ€‰ใ€‚", - 'dashboard.indicator.boundary.backtestRule': '่ฆๅ‰‡๏ผšๅŒไธ€ๆ นK็ทš่‹ฅๅ‡บ็พไธปไฟก่™Ÿ๏ผˆbuy/sellโ†’้–‹/ๅนณๅ€‰/ๅๆ‰‹๏ผ‰๏ผŒๆœฌK็ทšๅฐ‡่ทณ้Žๆ‰€ๆœ‰ๅŠ ๅ€‰่ˆ‡ๆธ›ๅ€‰ใ€‚', - 'dashboard.indicator.backtest.title': 'ๆŒ‡ๆจ™ๅ›žๆธฌ', - 'dashboard.indicator.backtest.config': 'ๅ›žๆธฌๅƒๆ•ธ', - 'dashboard.indicator.backtest.startDate': '้–‹ๅง‹ๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.endDate': '็ตๆŸๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.selectStartDate': '้ธๆ“‡้–‹ๅง‹ๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.selectEndDate': '้ธๆ“‡็ตๆŸๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.startDateRequired': '่ซ‹้ธๆ“‡้–‹ๅง‹ๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.endDateRequired': '่ซ‹้ธๆ“‡็ตๆŸๆ—ฅๆœŸ', - 'dashboard.indicator.backtest.initialCapital': 'ๅˆๅง‹่ณ‡้‡‘', - 'dashboard.indicator.backtest.initialCapitalRequired': '่ซ‹่ผธๅ…ฅๅˆๅง‹่ณ‡้‡‘', - 'dashboard.indicator.backtest.commission': 'ๆ‰‹็บŒ่ฒป็އ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.commissionHint': 'ๆŒ‰ๅ็พฉๅƒนๅ€ผ๏ผˆๅซๆง“ๆกฟ๏ผ‰ๆ”ถๅ–๏ผ›ๆฏ็ญ†ๆˆไบค๏ผˆ้–‹/ๅนณๅ€‰๏ผ‰้ƒฝๆœƒๅพž้ค˜้กๆ‰ฃ้™คใ€‚', - 'dashboard.indicator.backtest.leverage': 'ๆง“ๆ†ๅ€็އ', - 'dashboard.indicator.backtest.timeframe': 'K็ทš้€ฑๆœŸ', - 'dashboard.indicator.backtest.tradeDirection': 'ไบคๆ˜“ๆ–นๅ‘', - 'dashboard.indicator.backtest.longOnly': 'ๅšๅคš', - 'dashboard.indicator.backtest.shortOnly': 'ๅš็ฉบ', - 'dashboard.indicator.backtest.both': '้›™ๅ‘', - 'dashboard.indicator.backtest.run': '้–‹ๅง‹ๅ›žๆธฌ', - 'dashboard.indicator.backtest.rerun': '้‡ๆ–ฐๅ›žๆธฌ', - 'dashboard.indicator.backtest.close': '้—œ้–‰', - 'dashboard.indicator.backtest.running': 'ๆญฃๅœจ้€ฒ่กŒๆŒ‡ๆจ™ๅ›žๆธฌ...', - 'dashboard.indicator.backtest.loadingTip1': 'ๆญฃๅœจ็ฒๅ–ๆญทๅฒK็ทšๆ•ธๆ“š...', - 'dashboard.indicator.backtest.loadingTip2': 'ๆญฃๅœจๅŸท่กŒ็ญ–็•ฅไฟก่™Ÿ่จˆ็ฎ—...', - 'dashboard.indicator.backtest.loadingTip3': 'ๆญฃๅœจๆจกๆ“ฌไบคๆ˜“ๅŸท่กŒ...', - 'dashboard.indicator.backtest.loadingTip4': 'ๆญฃๅœจ่จˆ็ฎ—ๅ›žๆธฌๆŒ‡ๆจ™...', - 'dashboard.indicator.backtest.loadingTip5': 'ๅณๅฐ‡ๅฎŒๆˆ๏ผŒ่ซ‹็จๅ€™...', - 'dashboard.indicator.backtest.results': 'ๅ›žๆธฌ็ตๆžœ', - 'dashboard.indicator.backtest.totalReturn': '็ธฝๆ”ถ็›Š็އ', - 'dashboard.indicator.backtest.annualReturn': 'ๅนดๅŒ–ๆ”ถ็›Š', - 'dashboard.indicator.backtest.maxDrawdown': 'ๆœ€ๅคงๅ›žๆ’ค', - 'dashboard.indicator.backtest.sharpeRatio': 'ๅคๆ™ฎๆฏ”็އ', - 'dashboard.indicator.backtest.winRate': 'ๅ‹็އ', - 'dashboard.indicator.backtest.profitFactor': '็›ˆ่™งๆฏ”', - 'dashboard.indicator.backtest.totalTrades': 'ไบคๆ˜“ๆฌกๆ•ธ', - 'dashboard.indicator.totalReturn': '็ธฝๆ”ถ็›Š็އ', - 'dashboard.indicator.annualReturn': 'ๅนดๅŒ–ๆ”ถ็›Š็އ', - 'dashboard.indicator.maxDrawdown': 'ๆœ€ๅคงๅ›žๆ’ค', - 'dashboard.indicator.sharpeRatio': 'ๅคๆ™ฎๆฏ”็އ', - 'dashboard.indicator.winRate': 'ๅ‹็އ', - 'dashboard.indicator.profitFactor': '็›ˆ่™งๆฏ”', - 'dashboard.indicator.totalTrades': '็ธฝไบคๆ˜“ๆฌกๆ•ธ', - 'dashboard.indicator.backtest.totalCommission': '็ธฝๆ‰‹็บŒ่ฒป', - 'dashboard.indicator.backtest.equityCurve': 'ๆ”ถ็›Šๆ›ฒ็ทš', - 'dashboard.indicator.backtest.strategy': 'ๆŒ‡ๆจ™ๆ”ถ็›Š', - 'dashboard.indicator.backtest.benchmark': 'ๅŸบๆบ–ๆ”ถ็›Š', - 'dashboard.indicator.backtest.tradeHistory': 'ไบคๆ˜“่จ˜้Œ„', - 'dashboard.indicator.backtest.tradeTime': 'ๆ™‚้–“', - 'dashboard.indicator.backtest.tradeType': '้กžๅž‹', - 'dashboard.indicator.backtest.buy': '่ฒทๅ…ฅ', - 'dashboard.indicator.backtest.sell': '่ณฃๅ‡บ', - 'dashboard.indicator.backtest.liquidation': '็ˆ†ๅ€‰', - 'dashboard.indicator.backtest.openLong': '้–‹ๅคš', - 'dashboard.indicator.backtest.closeLong': 'ๅนณๅคš', - 'dashboard.indicator.backtest.closeLongStop': 'ๅนณๅคš(ๆญขๆ)', - 'dashboard.indicator.backtest.closeLongProfit': 'ๅนณๅคš(ๆญข็›ˆ)', - 'dashboard.indicator.backtest.addLong': 'ๅŠ ๅคšๅ€‰', - 'dashboard.indicator.backtest.openShort': '้–‹็ฉบ', - 'dashboard.indicator.backtest.closeShort': 'ๅนณ็ฉบ', - 'dashboard.indicator.backtest.closeShortStop': 'ๅนณ็ฉบ(ๆญขๆ)', - 'dashboard.indicator.backtest.closeShortProfit': 'ๅนณ็ฉบ(ๆญข็›ˆ)', - 'dashboard.indicator.backtest.addShort': 'ๅŠ ็ฉบๅ€‰', - 'dashboard.indicator.backtest.price': 'ๅƒนๆ ผ', - 'dashboard.indicator.backtest.amount': 'ๆ•ธ้‡', - 'dashboard.indicator.backtest.balance': '่ณฌๆˆถ้ค˜้ก', - 'dashboard.indicator.backtest.profit': '็›ˆ่™ง', - 'dashboard.indicator.backtest.success': 'ๅ›žๆธฌๅฎŒๆˆ', - 'dashboard.indicator.backtest.failed': 'ๅ›žๆธฌๅคฑๆ•—๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'dashboard.indicator.backtest.quickSelect': 'ๅฟซ้€Ÿ้ธๆ“‡', - // ๅคšๆ™‚้–“ๆก†ๆžถๅ›žๆธฌ็ฒพๅบฆๆ็คบ - 'dashboard.indicator.backtest.precisionMode': 'ๅ›žๆธฌ็ฒพๅบฆๆจกๅผ', - 'dashboard.indicator.backtest.estimatedCandles': '้ ่จˆ่™•็†็ด„ {count} ๆ นK็ทš', - 'dashboard.indicator.backtest.highPrecisionDesc': 'ไฝฟ็”จ1ๅˆ†้˜็ดšๅˆฅK็ทš้€ฒ่กŒ้ซ˜็ฒพๅบฆๅ›žๆธฌ๏ผŒๆญขๆๆญข็›ˆ่งธ็™ผๆ›ด็ฒพ็ขบ', - 'dashboard.indicator.backtest.mediumPrecisionDesc': 'ๅ›žๆธฌๅ€้–“่ถ…้Ž30ๅคฉ๏ผŒไฝฟ็”จ5ๅˆ†้˜็ดšๅˆฅK็ทšไปฅๅนณ่กก็ฒพๅบฆ่ˆ‡ๆ€ง่ƒฝ', - 'dashboard.indicator.backtest.standardModeWarning': 'ไฝฟ็”จๆจ™ๆบ–ๅ›žๆธฌๆจกๅผ', - 'dashboard.indicator.backtest.standardModeDesc': '็•ถๅ‰้…็ฝฎไธๆ”ฏๆŒ้ซ˜็ฒพๅบฆๅ›žๆธฌ๏ผŒๅฐ‡ไฝฟ็”จ็ญ–็•ฅK็ทš้€ฒ่กŒๅ›žๆธฌ', - 'dashboard.indicator.backtest.onlyCryptoSupported': '้ซ˜็ฒพๅบฆๅ›žๆธฌๅƒ…ๆ”ฏๆŒๅŠ ๅฏ†่ฒจๅนฃๅธ‚ๅ ด', - 'dashboard.indicator.backtest.noIndicatorCode': '่ฉฒๆŒ‡ๆจ™ๆฒ’ๆœ‰ๅฏๅ›žๆธฌ็š„ไปฃ็ขผ', - 'dashboard.indicator.backtest.noSymbol': '่ซ‹ๅ…ˆ้ธๆ“‡ไบคๆ˜“ๆจ™็š„', - 'dashboard.indicator.backtest.dateRangeExceeded': 'ๅ›žๆธฌๆ™‚้–“็ฏ„ๅœ่ถ…ๅ‡บ้™ๅˆถ๏ผš{timeframe}ๅ‘จๆœŸๆœ€ๅคšๅฏๅ›žๆธฌ{maxRange}', - 'dashboard.indicator.backtest.dateRangeExceededDays': 'ๅ›žๆธฌๆ™‚้–“็ฏ„ๅœ่ถ…ๅ‡บ้™ๅˆถ๏ผš{timeframe}ๅ‘จๆœŸๆœ€ๅคšๅฏๅ›žๆธฌ{maxRange}๏ผˆ{maxDays}ๅคฉ๏ผ‰', - 'dashboard.indicator.backtest.metaLine': 'ๆจ™็š„๏ผš{symbol} | ๅธ‚ๅ ด๏ผš{market} | ้€ฑๆœŸ๏ผš{timeframe}', - 'dashboard.indicator.backtest.savedRunId': 'ๅ›žๆธฌๅทฒไฟๅญ˜๏ผŒ่จ˜้Œ„ID๏ผš{id}', - 'dashboard.indicator.backtest.historyTitle': 'ๅ›žๆธฌ่จ˜้Œ„', - 'dashboard.indicator.backtest.historyRefresh': '้‡ๆ–ฐๆ•ด็†', - 'dashboard.indicator.backtest.historyView': 'ๆŸฅ็œ‹', - 'dashboard.indicator.backtest.historyNoData': 'ๆšซ็„กๅ›žๆธฌ่จ˜้Œ„', - 'dashboard.indicator.backtest.historyUseCurrent': 'ๅƒ…็›ฎๅ‰ๅนฃ็จฎ/้€ฑๆœŸ', - 'dashboard.indicator.backtest.historyFilterSymbol': 'ๅนฃ็จฎ๏ผˆSymbol๏ผ‰', - 'dashboard.indicator.backtest.historyFilterTimeframe': '้€ฑๆœŸ๏ผˆTimeframe๏ผ‰', - 'dashboard.indicator.backtest.historyApply': 'ๅฅ—็”จ็ฏฉ้ธ', - 'dashboard.indicator.backtest.historyAIAnalyze': 'AIๅˆ†ๆž', - 'dashboard.indicator.backtest.historyAIAnalyzeTitle': 'AI ๅˆ†ๆžๅปบ่ญฐ', - 'dashboard.indicator.backtest.historyNoAIResult': 'ๆšซ็„ก AI ๅˆ†ๆž็ตๆžœ', - 'dashboard.indicator.backtest.historyRunId': '่จ˜้Œ„ID', - 'dashboard.indicator.backtest.historyCreatedAt': 'ๆ™‚้–“', - 'dashboard.indicator.backtest.historyRange': 'ๅ€้–“', - 'dashboard.indicator.backtest.historyStatus': '็‹€ๆ…‹', - 'dashboard.indicator.backtest.historyStatusSuccess': 'ๆˆๅŠŸ', - 'dashboard.indicator.backtest.historyStatusFailed': 'ๅคฑๆ•—', - 'dashboard.indicator.backtest.historyActions': 'ๆ“ไฝœ', - 'dashboard.indicator.backtest.prev': 'ไธŠไธ€ๆญฅ', - 'dashboard.indicator.backtest.next': 'ไธ‹ไธ€ๆญฅ', - 'dashboard.indicator.backtest.steps.strategy.title': 'ๅŸท่กŒ้…็ฝฎ', - 'dashboard.indicator.backtest.steps.strategy.desc': 'ๅ€‰ไฝ/้ขจๆŽง/ๅŠ ๆธ›ๅ€‰๏ผˆ็ญ–็•ฅๅฑค๏ผ‰', - 'dashboard.indicator.backtest.steps.trading.title': 'ๅ›žๆธฌ็’ฐๅขƒ', - 'dashboard.indicator.backtest.steps.trading.desc': 'ๆ™‚้–“/่ณ‡้‡‘/่ฒป็އ/ๆง“ๆกฟ/ๆป‘้ปž', - 'dashboard.indicator.backtest.steps.results.title': '็ตๆžœ', - 'dashboard.indicator.backtest.steps.results.desc': '็ตฑ่จˆ่ˆ‡ไบคๆ˜“ๆ˜Ž็ดฐ', - 'dashboard.indicator.backtest.panel.risk': 'ๅŸท่กŒ้…็ฝฎ๏ผš้ขจๆŽง๏ผˆๆญขๆ/็งปๅ‹•ๆญข็›ˆ๏ผ‰', - 'dashboard.indicator.backtest.panel.scale': 'ๅŸท่กŒ้…็ฝฎ๏ผšๅŠ ๅ€‰๏ผˆ้ †ๅ‹ข/้€†ๅ‹ข๏ผ‰', - 'dashboard.indicator.backtest.panel.reduce': 'ๅŸท่กŒ้…็ฝฎ๏ผšๆธ›ๅ€‰๏ผˆ้ †ๅ‹ข/้€†ๅ‹ข๏ผ‰', - 'dashboard.indicator.backtest.panel.position': 'ๅŸท่กŒ้…็ฝฎ๏ผš้–‹ๅ€‰ๅ€‰ไฝ', - 'dashboard.indicator.backtest.field.stopLossPct': 'ๆญขๆ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.takeProfitPct': 'ๆญข็›ˆ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trailingEnabled': '็งปๅ‹•ๆญข็›ˆ', - 'dashboard.indicator.backtest.field.trailingStopPct': '็งปๅ‹•ๅ›žๆ’ค๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trailingActivationPct': '็งปๅ‹•ๆญข็›ˆๆฟ€ๆดป๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.slippage': 'ๆป‘้ปž๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendAddEnabled': '้ †ๅ‹ขๅŠ ๅ€‰', - 'dashboard.indicator.backtest.field.dcaAddEnabled': '้€†ๅ‹ขๅŠ ๅ€‰', - 'dashboard.indicator.backtest.field.trendAddStepPct': 'ๅŠ ๅ€‰่งธ็™ผ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.dcaAddStepPct': 'ๅŠ ๅ€‰่งธ็™ผ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendAddSizePct': 'ๆฏๆฌกๅŠ ๅ€‰่ณ‡้‡‘ๅ ๆฏ”๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.dcaAddSizePct': 'ๆฏๆฌกๅŠ ๅ€‰่ณ‡้‡‘ๅ ๆฏ”๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendAddMaxTimes': 'ๆœ€ๅคšๅŠ ๅ€‰ๆฌกๆ•ธ', - 'dashboard.indicator.backtest.field.dcaAddMaxTimes': 'ๆœ€ๅคšๅŠ ๅ€‰ๆฌกๆ•ธ', - 'dashboard.indicator.backtest.field.trendReduceEnabled': '้ †ๅ‹ขๆธ›ๅ€‰', - 'dashboard.indicator.backtest.field.adverseReduceEnabled': '้€†ๅ‹ขๆธ›ๅ€‰', - 'dashboard.indicator.backtest.field.trendReduceStepPct': '้ †ๅ‹ข่งธ็™ผ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.adverseReduceStepPct': '้€†ๅ‹ข่งธ็™ผ๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendReduceSizePct': 'ๆฏๆฌกๆธ›ๅ€‰ๆฏ”ไพ‹๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.adverseReduceSizePct': 'ๆฏๆฌก้€†ๅ‹ขๆธ›ๅ€‰ๆฏ”ไพ‹๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.trendReduceMaxTimes': 'ๆœ€ๅคš้ †ๅ‹ขๆธ›ๅ€‰ๆฌกๆ•ธ', - 'dashboard.indicator.backtest.field.adverseReduceMaxTimes': 'ๆœ€ๅคš้€†ๅ‹ขๆธ›ๅ€‰ๆฌกๆ•ธ', - 'dashboard.indicator.backtest.field.entryPct': '้–‹ๅ€‰่ณ‡้‡‘ๅ ๆฏ”๏ผˆ%๏ผ‰', - 'dashboard.indicator.backtest.field.minOrderPct': 'ๅ–ฎๆฌกๆœ€ๅฐ่ณ‡้‡‘ๅ ๆฏ”๏ผˆ%๏ผ‰๏ผˆๅฏ้ธ๏ผ‰', - 'dashboard.indicator.backtest.hint.entryPctMax': 'ๆœ€ๅคงๅฏ้–‹ๅ€‰๏ผš{maxPct}%๏ผˆ็‚บๅพŒ็บŒๅŠ ๅ€‰้ ็•™่ณ‡้‡‘๏ผ‰', - 'dashboard.indicator.backtest.closeLongTrailing': 'ๅนณๅคš(็งปๅ‹•ๆญขๆ/ๆญข็›ˆ)', - 'dashboard.indicator.backtest.reduceLong': 'ๅคš้ ญๆธ›ๅ€‰', - 'dashboard.indicator.backtest.closeShortTrailing': 'ๅนณ็ฉบ(็งปๅ‹•ๆญขๆ/ๆญข็›ˆ)', - 'dashboard.indicator.backtest.reduceShort': '็ฉบ้ ญๆธ›ๅ€‰', - 'dashboard.docs.title': 'ๆ–‡ๆช”ไธญๅฟƒ', - 'dashboard.docs.search.placeholder': 'ๆœ็ดขๆ–‡ๆช”...', - 'dashboard.docs.category.all': 'ๅ…จ้ƒจ', - 'dashboard.docs.category.guide': '้–‹็™ผๆŒ‡ๅ—', - 'dashboard.docs.category.api': 'APIๆ–‡ๆช”', - 'dashboard.docs.category.tutorial': 'ๆ•™็จ‹', - 'dashboard.docs.category.faq': 'ๅธธ่ฆ‹ๅ•้กŒ', - 'dashboard.docs.featured.title': 'ๆŽจ่–ฆๆ–‡ๆช”', - 'dashboard.docs.featured.tag': 'ๆŽจ่–ฆ', - 'dashboard.docs.list.views': '็€่ฆฝ', - 'dashboard.docs.list.author': 'ไฝœ่€…', - 'dashboard.docs.list.empty': 'ๆšซ็„กๆ–‡ๆช”', - 'dashboard.docs.list.backToAll': '่ฟ”ๅ›žๅ…จ้ƒจๆ–‡ๆช”', - 'dashboard.docs.list.total': 'ๅ…ฑ {count} ็ฏ‡ๆ–‡ๆช”', - 'dashboard.docs.detail.back': '่ฟ”ๅ›žๆ–‡ๆช”ๅˆ—่กจ', - 'dashboard.docs.detail.updatedAt': 'ๆ›ดๆ–ฐๆ–ผ', - 'dashboard.docs.detail.related': '็›ธ้—œๆ–‡ๆช”', - 'dashboard.docs.detail.notFound': 'ๆ–‡ๆช”ไธๅญ˜ๅœจ', - 'dashboard.docs.detail.error': 'ๆ–‡ๆช”ไธๅญ˜ๅœจๆˆ–ๅทฒ่ขซๅˆช้™ค', - 'dashboard.docs.search.result': 'ๆœ็ดข็ตๆžœ', - 'dashboard.docs.search.keyword': '้—œ้ต่ฉž', - 'community.filter.indicatorType': 'ๆŒ‡ๆจ™้กžๅž‹', - 'community.filter.all': 'ๅ…จ้ƒจ', - 'community.filter.other': 'ๅ…ถไป–้ธ้ …', - 'community.filter.pricing': 'ๅฎšๅƒน้กžๅž‹', - 'community.filter.allPricing': 'ๅ…จ้ƒจๅฎšๅƒน', - 'community.filter.sortBy': 'ๆŽ’ๅบๆ–นๅผ', - 'community.filter.search': 'ๆœ็ดข', - 'community.filter.searchPlaceholder': 'ๆœ็ดขๆŒ‡ๆจ™ๅ็จฑ', - 'community.indicatorType.trend': '่ถจๅ‹ขๅž‹', - 'community.indicatorType.momentum': 'ๅ‹•้‡ๅž‹', - 'community.indicatorType.volatility': 'ๆณขๅ‹•็އ', - 'community.indicatorType.volume': 'ๆˆไบค้‡', - 'community.indicatorType.custom': '่‡ชๅฎš็พฉ', - 'community.pricing.free': 'ๅ…่ฒป', - 'community.pricing.paid': 'ไป˜่ฒป', - 'community.sort.downloads': 'ไธ‹่ผ‰้‡', - 'community.sort.rating': '่ฉ•ๅˆ†', - 'community.sort.newest': 'ๆœ€ๆ–ฐ็™ผๅธƒ', - 'community.pagination.total': 'ๅ…ฑ {total} ๅ€‹ๆŒ‡ๆจ™', - 'community.noDescription': 'ๆšซ็„กๆ่ฟฐ', - 'community.detail.type': '้กžๅž‹', - 'community.detail.pricing': 'ๅฎšๅƒน', - 'community.detail.rating': '่ฉ•ๅˆ†', - 'community.detail.downloads': 'ไธ‹่ผ‰้‡', - 'community.detail.author': 'ไฝœ่€…', - 'community.detail.description': '็ฐกไป‹', - 'community.detail.detailContent': '่ฉณ็ดฐ่ชชๆ˜Ž', - 'community.detail.backtestStats': 'ๅ›žๆธฌ็ตฑ่จˆ', - 'community.action.purchase': '่ณผ่ฒทๆŒ‡ๆจ™', - 'community.action.addToMyIndicators': 'ๆทปๅŠ ๅˆฐๆˆ‘็š„ๆŒ‡ๆจ™', - 'community.action.favorite': 'ๆ”ถ่—', - 'community.action.unfavorite': 'ๅ–ๆถˆๆ”ถ่—', - 'community.action.buyNow': '็ซ‹ๅณ่ณผ่ฒท', - 'community.action.renew': '็บŒ่ฒป', - 'community.purchase.price': 'ๅƒนๆ ผ', - 'community.purchase.permanent': 'ๆฐธไน…', - 'community.purchase.monthly': 'ๆœˆ', - 'community.purchase.confirmBuy': '็ขบ่ช่ณผ่ฒท่ฉฒๆŒ‡ๆจ™๏ผˆ{price} QDT๏ผ‰๏ผŸ', - 'community.purchase.confirmRenew': '็ขบ่ช็บŒ่ฒป่ฉฒๆŒ‡ๆจ™๏ผˆ{price} QDT/ๆœˆ๏ผ‰๏ผŸ', - 'community.purchase.confirmFree': '็ขบ่ชๆทปๅŠ ่ฉฒๅ…่ฒปๆŒ‡ๆจ™๏ผŸ', - 'community.purchase.confirmTitle': '็ขบ่ชๆ“ไฝœ', - 'community.purchase.owned': 'ๆ‚จๅทฒ่ณผ่ฒท่ฉฒๆŒ‡ๆจ™๏ผˆๆฐธไน…ๆœ‰ๆ•ˆ๏ผ‰', - 'community.purchase.ownIndicator': '้€™ๆ˜ฏๆ‚จ็™ผๅธƒ็š„ๆŒ‡ๆจ™', - 'community.purchase.expired': 'ๆ‚จ็š„่จ‚้–ฑๅทฒ้ŽๆœŸ', - 'community.purchase.expiresOn': 'ๅˆฐๆœŸๆ™‚้–“๏ผš{date}', - 'community.tabs.detail': 'ๆŒ‡ๆจ™่ฉณๆƒ…', - 'community.tabs.backtest': 'ๅ›žๆธฌๆ•ธๆ“š', - 'community.tabs.ratings': '็”จๆˆถ่ฉ•ๅƒน', - 'community.rating.myRating': 'ๆˆ‘็š„่ฉ•ๅˆ†', - 'community.rating.stars': '{count} ๆ˜Ÿ', - 'community.rating.commentPlaceholder': 'ๅˆ†ไบซๆ‚จ็š„ไฝฟ็”จ้ซ”้ฉ—...', - 'community.rating.submit': 'ๆไบค่ฉ•ๅˆ†', - 'community.rating.modify': 'ไฟฎๆ”น', - 'community.rating.saveModify': 'ไฟๅญ˜ไฟฎๆ”น', - 'community.rating.cancel': 'ๅ–ๆถˆ', - 'community.rating.selectRating': '่ซ‹้ธๆ“‡่ฉ•ๅˆ†', - 'community.rating.success': '่ฉ•ๅˆ†ๆˆๅŠŸ', - 'community.rating.modifySuccess': 'ไฟฎๆ”น่ฉ•ๅƒนๆˆๅŠŸ', - 'community.rating.failed': '่ฉ•ๅˆ†ๅคฑๆ•—', - 'community.rating.noRatings': 'ๆšซ็„ก่ฉ•ๅƒน', - 'community.backtest.note': 'ไปฅไธŠๆ•ธๆ“š็ˆฒๆญทๅฒๅ›žๆธฌ็ตๆžœ๏ผŒๅƒ…ไพ›ๅƒ่€ƒ๏ผŒไธไปฃ่กจๆœชไพ†ๆ”ถ็›Š', - 'community.backtest.noData': 'ๆšซ็„กๅ›žๆธฌๆ•ธๆ“š', - 'community.backtest.uploadHint': 'ไฝœ่€…ๅฐšๆœชไธŠๅ‚ณๅ›žๆธฌๆ•ธๆ“š', - 'community.message.loadFailed': 'ๅŠ ่ผ‰ๆŒ‡ๆจ™ๅˆ—่กจๅคฑๆ•—', - 'community.message.purchaseProcessing': 'ๆญฃๅœจ่™•็†่ณผ่ฒท่ซ‹ๆฑ‚...', - 'community.message.downloadSuccess': 'ๆŒ‡ๆจ™ๅทฒๆทปๅŠ ๅˆฐๆˆ‘็š„ๆŒ‡ๆจ™ๅˆ—่กจ', - 'community.message.favoriteSuccess': 'ๆ”ถ่—ๆˆๅŠŸ', - 'community.message.unfavoriteSuccess': 'ๅ–ๆถˆๆ”ถ่—ๆˆๅŠŸ', - 'community.message.operationSuccess': 'ๆ“ไฝœๆˆๅŠŸ', - 'community.message.operationFailed': 'ๆ“ไฝœๅคฑๆ•—', - 'community.banner.readOnly': 'ๅƒ…ไพ›็€่ฆฝ', - 'community.banner.loginHint': 'ๅฆ‚้œ€็™ป้Œ„่จปๅ†Š่ซ‹้ปžๆ“ŠๆŒ‰้ˆ•่ทณ่ฝ‰ๅˆฐ็จ็ซ‹้ ้ข๏ผŒๅพž่€Œ้ฟๅ…CSRFๅ•้กŒ', - 'community.banner.jumpButton': '่ทณ่ฝ‰ๅˆฐ็™ป้Œ„/่จปๅ†Š', - 'dashboard.totalEquity': '็ธฝๆฌŠ็›Š', - 'dashboard.totalPnL': '็ธฝ็›ˆ่™ง', - 'dashboard.aiStrategies': 'AI ็ญ–็•ฅ', - 'dashboard.indicatorStrategies': 'ๆŒ‡ๆจ™็ญ–็•ฅ', - 'dashboard.running': '้‹่กŒไธญ', - 'dashboard.enabled': 'ๅทฒๅ•Ÿ็”จ', - 'dashboard.pnlHistory': 'ๆญทๅฒ็›ˆ่™ง', - 'dashboard.strategyPerformance': '็ญ–็•ฅ็›ˆ่™งไฝ”ๆฏ”', - 'dashboard.drawdown': 'ๅ›žๆ’คๆ›ฒ็ทš', - 'dashboard.strategyRanking': '็ญ–็•ฅๆŽ’่กŒๆฆœ', - // New KPI labels - 'dashboard.winRate': 'ๅ‹็އ', - 'dashboard.profitFactor': '็›ˆ่™งๆฏ”', - 'dashboard.maxDrawdown': 'ๆœ€ๅคงๅ›žๆ’ค', - 'dashboard.totalTrades': '็ธฝไบคๆ˜“', - 'dashboard.runningStrategies': '้‹่กŒไธญ็ญ–็•ฅ', - 'dashboard.equityCurve': 'ๆฌŠ็›Šๆ›ฒ็ทš', - 'dashboard.strategyAllocation': '็ญ–็•ฅๅˆ†ไฝˆ', - 'dashboard.drawdownCurve': 'ๅ›žๆ’คๆ›ฒ็ทš', - 'dashboard.hourlyDistribution': 'ไบคๆ˜“ๆ™‚ๆฎต', - // Chart labels - 'dashboard.dailyPnl': 'ๆ—ฅ็›ˆ่™ง', - 'dashboard.cumulativePnl': '็ดฏ่จˆ็›ˆ่™ง', - 'dashboard.tradeCount': 'ไบคๆ˜“ๆฌกๆ•ธ', - 'dashboard.profit': '็›ˆ่™ง', - 'dashboard.noData': 'ๆšซ็„กๆ•ธๆ“š', - 'dashboard.noStrategyData': 'ๆšซ็„ก็ญ–็•ฅๆ•ธๆ“š', - // Ranking labels - 'dashboard.ranking.totalProfit': '็ธฝๆ”ถ็›Š', - 'dashboard.ranking.roi': 'ๆ”ถ็›Š็އ', - 'dashboard.ranking.trades': 'ไบคๆ˜“ๆ•ธ', - // Units and labels - 'dashboard.unit.trades': '็ญ†', - 'dashboard.unit.strategies': 'ๅ€‹', - 'dashboard.label.avgDaily': 'ๆ—ฅๅ‡', - 'dashboard.label.avgProfit': 'ๅนณๅ‡็›ˆๅˆฉ', - 'dashboard.label.win': 'ๅ‹', - 'dashboard.label.lose': '่ฒ ', - 'dashboard.label.trade': 'ไบคๆ˜“', - 'dashboard.label.indicator': 'ๆŒ‡ๆจ™', - 'dashboard.label.totalPnl': '็ธฝ็›ˆ่™ง', - 'dashboard.label.maxDrawdownPoint': 'ๆœ€ๅคงๅ›žๆ’ค', - 'dashboard.profitCalendar': 'ๆ”ถ็›Šๆ—ฅๆ›†', - 'dashboard.recentTrades': 'ๆœ€่ฟ‘ไบคๆ˜“', - 'dashboard.currentPositions': '็•ถๅ‰ๆŒๅ€‰', - 'dashboard.table.time': 'ๆ™‚้–“', - 'dashboard.table.strategy': '็ญ–็•ฅๅ็จฑ', - 'dashboard.table.symbol': 'ๆจ™็š„', - 'dashboard.table.type': '้กžๅž‹', - 'dashboard.table.side': 'ๆ–นๅ‘', - 'dashboard.table.size': 'ๆŒๅ€‰้‡', - 'dashboard.table.entryPrice': '้–‹ๅ€‰ๅ‡ๅƒน', - 'dashboard.table.price': 'ๅƒนๆ ผ', - 'dashboard.table.amount': 'ๆ•ธ้‡', - 'dashboard.table.profit': '็›ˆ่™ง', - 'dashboard.pendingOrders': '่จ‚ๅ–ฎๅŸท่กŒ่จ˜้Œ„', - 'dashboard.totalOrders': 'ๅ…ฑ {total} ๆข', - 'dashboard.viewError': 'ๆŸฅ็œ‹้Œฏ่ชค', - 'dashboard.filled': 'ๅทฒๆˆไบค', - 'dashboard.orderTable.time': 'ๅ‰ตๅปบๆ™‚้–“', - 'dashboard.orderTable.strategy': '็ญ–็•ฅ', - 'dashboard.orderTable.symbol': 'ไบคๆ˜“ๅฐ', - 'dashboard.orderTable.signalType': 'ไฟก่™Ÿ้กžๅž‹', - 'dashboard.orderTable.amount': 'ๆ•ธ้‡', - 'dashboard.orderTable.price': 'ๆˆไบคๅƒน', - 'dashboard.orderTable.status': '็‹€ๆ…‹', - 'dashboard.orderTable.timeInfo': 'ๆ™‚้–“', - 'dashboard.orderTable.executedAt': 'ๅŸท่กŒๆ™‚้–“', - 'dashboard.orderTable.exchange': 'ไบคๆ˜“ๆ‰€', - 'dashboard.orderTable.notify': '้€š็Ÿฅๆ–นๅผ', - 'dashboard.orderTable.actions': 'ๆ“ไฝœ', - 'dashboard.orderTable.delete': 'ๅˆช้™ค', - 'dashboard.orderTable.deleteConfirm': '็ขบ่ชๅˆช้™ค้€™ๆข่จ˜้Œ„๏ผŸ', - 'dashboard.orderTable.deleteSuccess': 'ๅˆช้™คๆˆๅŠŸ', - 'dashboard.orderTable.deleteFailed': 'ๅˆช้™คๅคฑๆ•—', - 'dashboard.newOrderNotify': 'ๆ–ฐ่จ‚ๅ–ฎๆ้†’', - 'dashboard.newOrderDesc': 'ๆœ‰ๆ–ฐ็š„่จ‚ๅ–ฎๅŸท่กŒ่จ˜้Œ„', - 'dashboard.soundEnabled': '่ฒ้Ÿณๆ้†’ๅทฒ้–‹ๅ•Ÿ', - 'dashboard.soundDisabled': '่ฒ้Ÿณๆ้†’ๅทฒ้—œ้–‰', - 'dashboard.clickToMute': '้ปžๆ“Š้—œ้–‰่ฒ้Ÿณๆ้†’', - 'dashboard.clickToUnmute': '้ปžๆ“Š้–‹ๅ•Ÿ่ฒ้Ÿณๆ้†’', - 'dashboard.signalType.openLong': '้–‹ๅคš', - 'dashboard.signalType.openShort': '้–‹็ฉบ', - 'dashboard.signalType.closeLong': 'ๅนณๅคš', - 'dashboard.signalType.closeShort': 'ๅนณ็ฉบ', - 'dashboard.signalType.addLong': 'ๅŠ ๅคš', - 'dashboard.signalType.addShort': 'ๅŠ ็ฉบ', - 'dashboard.status.pending': 'ๅพ…่™•็†', - 'dashboard.status.processing': '่™•็†ไธญ', - 'dashboard.status.completed': 'ๅทฒๅฎŒๆˆ', - 'dashboard.status.failed': 'ๅคฑๆ•—', - 'dashboard.status.cancelled': 'ๅทฒๅ–ๆถˆ', - 'dashboard.table.pnl': 'ๆœชๅฏฆ็พ็›ˆ่™ง', - 'form.basic-form.basic.title': 'ๅŸบ็คŽ่กจๅ–ฎ', - 'form.basic-form.basic.description': '่กจๅ–ฎ้ ็”จๆ–ผๅ‘็”จๆˆถๆ”ถ้›†ๆˆ–้ฉ—่ญ‰ไฟกๆฏ๏ผŒๅŸบ็คŽ่กจๅ–ฎๅธธ่ฆ‹ๆ–ผๆ•ธๆ“š้ …่ผƒๅฐ‘็š„่กจๅ–ฎๅ ดๆ™ฏใ€‚', - 'form.basic-form.title.label': 'ๆจ™้กŒ', - 'form.basic-form.title.placeholder': '็ตฆ็›ฎๆจ™่ตทๅ€‹ๅๅญ—', - 'form.basic-form.title.required': '่ซ‹่ผธๅ…ฅๆจ™้กŒ', - 'form.basic-form.date.label': '่ตทๆญขๆ—ฅๆœŸ', - 'form.basic-form.placeholder.start': '้–‹ๅง‹ๆ—ฅๆœŸ', - 'form.basic-form.placeholder.end': '็ตๆŸๆ—ฅๆœŸ', - 'form.basic-form.date.required': '่ซ‹้ธๆ“‡่ตทๆญขๆ—ฅๆœŸ', - 'form.basic-form.goal.label': '็›ฎๆจ™ๆ่ฟฐ', - 'form.basic-form.goal.placeholder': '่ซ‹่ผธๅ…ฅไฝ ็š„้šŽๆฎตๆ€งๅทฅไฝœ็›ฎๆจ™', - 'form.basic-form.goal.required': '่ซ‹่ผธๅ…ฅ็›ฎๆจ™ๆ่ฟฐ', - 'form.basic-form.standard.label': '่กก้‡ๆจ™ๆบ–', - 'form.basic-form.standard.placeholder': '่ซ‹่ผธๅ…ฅ่กก้‡ๆจ™ๆบ–', - 'form.basic-form.standard.required': '่ซ‹่ผธๅ…ฅ่กก้‡ๆจ™ๆบ–', - 'form.basic-form.client.label': 'ๅฎขๆˆถ', - 'form.basic-form.client.required': '่ซ‹ๆ่ฟฐไฝ ๆœๅ‹™็š„ๅฎขๆˆถ', - 'form.basic-form.label.tooltip': '็›ฎๆจ™็š„ๆœๅ‹™ๅฐ่ฑก', - 'form.basic-form.client.placeholder': '่ซ‹ๆ่ฟฐไฝ ๆœๅ‹™็š„ๅฎขๆˆถ๏ผŒๅ…ง้ƒจๅฎขๆˆถ็›ดๆŽฅ @ๅง“ๅ๏ผๅทฅ่™Ÿ', - 'form.basic-form.invites.label': '้‚€่ฉ•ไบบ', - 'form.basic-form.invites.placeholder': '่ซ‹็›ดๆŽฅ @ๅง“ๅ๏ผๅทฅ่™Ÿ๏ผŒๆœ€ๅคšๅฏ้‚€่ซ‹ 5 ไบบ', - 'form.basic-form.weight.label': 'ๆฌŠ้‡', - 'form.basic-form.weight.placeholder': '่ซ‹่ผธๅ…ฅ', - 'form.basic-form.public.label': '็›ฎๆจ™ๅ…ฌ้–‹', - 'form.basic-form.label.help': 'ๅฎขๆˆถใ€้‚€่ฉ•ไบบ้ป˜่ช่ขซๅˆ†ไบซ', - 'form.basic-form.radio.public': 'ๅ…ฌ้–‹', - 'form.basic-form.radio.partially-public': '้ƒจๅˆ†ๅ…ฌ้–‹', - 'form.basic-form.radio.private': 'ไธๅ…ฌ้–‹', - 'form.basic-form.publicUsers.placeholder': 'ๅ…ฌ้–‹็ตฆ', - 'form.basic-form.option.A': 'ๅŒไบ‹ไธ€', - 'form.basic-form.option.B': 'ๅŒไบ‹ไบŒ', - 'form.basic-form.option.C': 'ๅŒไบ‹ไธ‰', - 'form.basic-form.email.required': '่ซ‹่ผธๅ…ฅ้ƒต็ฎฑๅœฐๅ€๏ผ', - 'form.basic-form.email.wrong-format': '้ƒต็ฎฑๅœฐๅ€ๆ ผๅผ้Œฏ่ชค๏ผ', - 'form.basic-form.userName.required': '่ซ‹่ผธๅ…ฅ็”จๆˆถๅ!', - 'form.basic-form.password.required': '่ซ‹่ผธๅ…ฅๅฏ†็ขผ๏ผ', - 'form.basic-form.password.twice': 'ๅ…ฉๆฌก่ผธๅ…ฅ็š„ๅฏ†็ขผไธๅŒน้…!', - 'form.basic-form.strength.msg': '่ซ‹่‡ณๅฐ‘่ผธๅ…ฅ 6 ๅ€‹ๅญ—็ฌฆใ€‚่ซ‹ไธ่ฆไฝฟ็”จๅฎนๆ˜“่ขซ็Œœๅˆฐ็š„ๅฏ†็ขผใ€‚', - 'form.basic-form.strength.strong': 'ๅผทๅบฆ๏ผšๅผท', - 'form.basic-form.strength.medium': 'ๅผทๅบฆ๏ผšไธญ', - 'form.basic-form.strength.short': 'ๅผทๅบฆ๏ผšๅคช็Ÿญ', - 'form.basic-form.confirm-password.required': '่ซ‹็ขบ่ชๅฏ†็ขผ๏ผ', - 'form.basic-form.phone-number.required': '่ซ‹่ผธๅ…ฅๆ‰‹ๆฉŸ่™Ÿ๏ผ', - 'form.basic-form.phone-number.wrong-format': 'ๆ‰‹ๆฉŸ่™Ÿๆ ผๅผ้Œฏ่ชค๏ผ', - 'form.basic-form.verification-code.required': '่ซ‹่ผธๅ…ฅ้ฉ—่ญ‰็ขผ๏ผ', - 'form.basic-form.form.get-captcha': '็ฒๅ–้ฉ—่ญ‰็ขผ', - 'form.basic-form.captcha.second': '็ง’', - 'form.basic-form.form.optional': '๏ผˆ้ธๅกซ๏ผ‰', - 'form.basic-form.form.submit': 'ๆไบค', - 'form.basic-form.form.save': 'ไฟๅญ˜', - 'form.basic-form.email.placeholder': '้ƒต็ฎฑ', - 'form.basic-form.password.placeholder': '่‡ณๅฐ‘6ไฝๅฏ†็ขผ๏ผŒๅ€ๅˆ†ๅคงๅฐๅฏซ', - 'form.basic-form.confirm-password.placeholder': '็ขบ่ชๅฏ†็ขผ', - 'form.basic-form.phone-number.placeholder': 'ๆ‰‹ๆฉŸ่™Ÿ', - 'form.basic-form.verification-code.placeholder': '้ฉ—่ญ‰็ขผ', - 'result.success.title': 'ๆไบคๆˆๅŠŸ', - 'result.success.description': 'ๆไบค็ตๆžœ้ ็”จๆ–ผๅ้ฅ‹ไธ€็ณปๅˆ—ๆ“ไฝœไปปๅ‹™็š„่™•็†็ตๆžœ๏ผŒ ๅฆ‚ๆžœๅƒ…ๆ˜ฏ็ฐกๅ–ฎๆ“ไฝœ๏ผŒไฝฟ็”จ Message ๅ…จๅฑ€ๆ็คบๅ้ฅ‹ๅณๅฏใ€‚ ๆœฌๆ–‡ๅญ—ๅ€ๅŸŸๅฏไปฅๅฑ•็คบ็ฐกๅ–ฎ็š„่ฃœๅ……่ชชๆ˜Ž๏ผŒๅฆ‚ๆžœๆœ‰้กžไผผๅฑ•็คบ โ€œๅ–ฎๆ“šโ€็š„้œ€ๆฑ‚๏ผŒไธ‹้ข้€™ๅ€‹็ฐ่‰ฒๅ€ๅŸŸๅฏไปฅๅ‘ˆ็พๆฏ”่ผƒๅพฉ้›œ็š„ๅ…งๅฎนใ€‚', - 'result.success.operate-title': '้ …็›ฎๅ็จฑ', - 'result.success.operate-id': '้ …็›ฎ ID', - 'result.success.principal': '่ฒ ่ฒฌไบบ', - 'result.success.operate-time': '็”Ÿๆ•ˆๆ™‚้–“', - 'result.success.step1-title': 'ๅ‰ตๅปบ้ …็›ฎ', - 'result.success.step1-operator': 'ๆ›ฒ้บ—้บ—', - 'result.success.step2-title': '้ƒจ้–€ๅˆๅฏฉ', - 'result.success.step2-operator': 'ๅ‘จๆฏ›ๆฏ›', - 'result.success.step2-extra': 'ๅ‚ฌไธ€ไธ‹', - 'result.success.step3-title': '่ฒกๅ‹™ๅพฉๆ ธ', - 'result.success.step4-title': 'ๅฎŒๆˆ', - 'result.success.btn-return': '่ฟ”ๅ›žๅˆ—่กจ', - 'result.success.btn-project': 'ๆŸฅ็œ‹้ …็›ฎ', - 'result.success.btn-print': 'ๆ‰“ๅฐ', - 'result.fail.error.title': 'ๆไบคๅคฑๆ•—', - 'result.fail.error.description': '่ซ‹ๆ ธๅฐไธฆไฟฎๆ”นไปฅไธ‹ไฟกๆฏๅพŒ๏ผŒๅ†้‡ๆ–ฐๆไบคใ€‚', - 'result.fail.error.hint-title': 'ๆ‚จๆไบค็š„ๅ…งๅฎนๆœ‰ๅฆ‚ไธ‹้Œฏ่ชค๏ผš', - 'result.fail.error.hint-text1': 'ๆ‚จ็š„่ณฌๆˆถๅทฒ่ขซๅ‡็ต', - 'result.fail.error.hint-btn1': '็ซ‹ๅณ่งฃๅ‡', - 'result.fail.error.hint-text2': 'ๆ‚จ็š„่ณฌๆˆถ้‚„ไธๅ…ทๅ‚™็”ณ่ซ‹่ณ‡ๆ ผ', - 'result.fail.error.hint-btn2': '็ซ‹ๅณๅ‡็ดš', - 'result.fail.error.btn-text': '่ฟ”ๅ›žไฟฎๆ”น', - 'account.settings.menuMap.custom': 'ๅ€‹ๆ€งๅŒ–', - 'account.settings.menuMap.binding': '่ณฌ่™Ÿ็ถๅฎš', - 'account.settings.basic.avatar': '้ ญๅƒ', - 'account.settings.basic.change-avatar': 'ๆ›ดๆ›้ ญๅƒ', - 'account.settings.basic.email': '้ƒต็ฎฑ', - 'account.settings.basic.email-message': '่ซ‹่ผธๅ…ฅๆ‚จ็š„้ƒต็ฎฑ!', - 'account.settings.basic.nickname': 'ๆšฑ็จฑ', - 'account.settings.basic.nickname-message': '่ซ‹่ผธๅ…ฅๆ‚จ็š„ๆšฑ็จฑ!', - 'account.settings.basic.profile': 'ๅ€‹ไบบ็ฐกไป‹', - 'account.settings.basic.profile-message': '่ซ‹่ผธๅ…ฅๅ€‹ไบบ็ฐกไป‹!', - 'account.settings.basic.profile-placeholder': 'ๅ€‹ไบบ็ฐกไป‹', - 'account.settings.basic.country': 'ๅœ‹ๅฎถ/ๅœฐๅ€', - 'account.settings.basic.country-message': '่ซ‹่ผธๅ…ฅๆ‚จ็š„ๅœ‹ๅฎถๆˆ–ๅœฐๅ€!', - 'account.settings.basic.geographic': 'ๆ‰€ๅœจ็œๅธ‚', - 'account.settings.basic.geographic-message': '่ซ‹่ผธๅ…ฅๆ‚จ็š„ๆ‰€ๅœจ็œๅธ‚!', - 'account.settings.basic.address': '่ก—้“ๅœฐๅ€', - 'account.settings.basic.address-message': '่ซ‹่ผธๅ…ฅๆ‚จ็š„่ก—้“ๅœฐๅ€!', - 'account.settings.basic.phone': '่ฏ็ณป้›ป่ฉฑ', - 'account.settings.basic.phone-message': '่ซ‹่ผธๅ…ฅๆ‚จ็š„่ฏ็ณป้›ป่ฉฑ!', - 'account.settings.basic.update': 'ๆ›ดๆ–ฐๅŸบๆœฌไฟกๆฏ', - 'account.settings.basic.update.success': 'ๆ›ดๆ–ฐๅŸบๆœฌไฟกๆฏๆˆๅŠŸ', - 'account.settings.security.strong': 'ๅผท', - 'account.settings.security.medium': 'ไธญ', - 'account.settings.security.weak': 'ๅผฑ', - 'account.settings.security.password': '่ณฌๆˆถๅฏ†็ขผ', - 'account.settings.security.password-description': '็•ถๅ‰ๅฏ†็ขผๅผทๅบฆ๏ผš', - 'account.settings.security.phone': 'ๅฏ†ไฟๆ‰‹ๆฉŸ', - 'account.settings.security.phone-description': 'ๅทฒ็ถๅฎšๆ‰‹ๆฉŸ๏ผš', - 'account.settings.security.question': 'ๅฏ†ไฟๅ•้กŒ', - 'account.settings.security.question-description': 'ๆœช่จญ็ฝฎๅฏ†ไฟๅ•้กŒ๏ผŒๅฏ†ไฟๅ•้กŒๅฏๆœ‰ๆ•ˆไฟ่ญท่ณฌๆˆถๅฎ‰ๅ…จ', - 'account.settings.security.email': '็ถๅฎš้ƒต็ฎฑ', - 'account.settings.security.email-description': 'ๅทฒ็ถๅฎš้ƒต็ฎฑ๏ผš', - 'account.settings.security.mfa': 'MFA ่จญๅ‚™', - 'account.settings.security.mfa-description': 'ๆœช็ถๅฎš MFA ่จญๅ‚™๏ผŒ็ถๅฎšๅพŒ๏ผŒๅฏไปฅ้€ฒ่กŒไบŒๆฌก็ขบ่ช', - 'account.settings.security.modify': 'ไฟฎๆ”น', - 'account.settings.security.set': '่จญ็ฝฎ', - 'account.settings.security.bind': '็ถๅฎš', - 'account.settings.binding.taobao': '็ถๅฎšๆท˜ๅฏถ', - 'account.settings.binding.taobao-description': '็•ถๅ‰ๆœช็ถๅฎšๆท˜ๅฏถ่ณฌ่™Ÿ', - 'account.settings.binding.alipay': '็ถๅฎšๆ”ฏไป˜ๅฏถ', - 'account.settings.binding.alipay-description': '็•ถๅ‰ๆœช็ถๅฎšๆ”ฏไป˜ๅฏถ่ณฌ่™Ÿ', - 'account.settings.binding.dingding': '็ถๅฎš้‡˜้‡˜', - 'account.settings.binding.dingding-description': '็•ถๅ‰ๆœช็ถๅฎš้‡˜้‡˜่ณฌ่™Ÿ', - 'account.settings.binding.bind': '็ถๅฎš', - 'account.settings.notification.password': '่ณฌๆˆถๅฏ†็ขผ', - 'account.settings.notification.password-description': 'ๅ…ถไป–็”จๆˆถ็š„ๆถˆๆฏๅฐ‡ไปฅ็ซ™ๅ…งไฟก็š„ๅฝขๅผ้€š็Ÿฅ', - 'account.settings.notification.messages': '็ณป็ตฑๆถˆๆฏ', - 'account.settings.notification.messages-description': '็ณป็ตฑๆถˆๆฏๅฐ‡ไปฅ็ซ™ๅ…งไฟก็š„ๅฝขๅผ้€š็Ÿฅ', - 'account.settings.notification.todo': 'ๅพ…่พฆไปปๅ‹™', - 'account.settings.notification.todo-description': 'ๅพ…่พฆไปปๅ‹™ๅฐ‡ไปฅ็ซ™ๅ…งไฟก็š„ๅฝขๅผ้€š็Ÿฅ', - 'account.settings.settings.open': '้–‹', - 'account.settings.settings.close': '้—œ', - 'trading-assistant.title': 'ไบคๆ˜“ๅŠฉๆ‰‹', - 'trading-assistant.strategyList': '็ญ–็•ฅๅˆ—่กจ', - 'trading-assistant.createStrategy': 'ๅ‰ตๅปบ็ญ–็•ฅ', - 'trading-assistant.noStrategy': 'ๆšซ็„ก็ญ–็•ฅ', - 'trading-assistant.selectStrategy': '่ซ‹ๅพžๅทฆๅด้ธๆ“‡ไธ€ๅ€‹็ญ–็•ฅๆŸฅ็œ‹่ฉณๆƒ…', - 'trading-assistant.startStrategy': 'ๅ•“ๅ‹•็ญ–็•ฅ', - 'trading-assistant.stopStrategy': 'ๅœๆญข็ญ–็•ฅ', - 'trading-assistant.editStrategy': '็ทจ่ผฏ็ญ–็•ฅ', - 'trading-assistant.deleteStrategy': 'ๅˆช้™ค็ญ–็•ฅ', - 'trading-assistant.startAll': 'ๅ…จ้ƒจๅ•Ÿๅ‹•', - 'trading-assistant.stopAll': 'ๅ…จ้ƒจๅœๆญข', - 'trading-assistant.deleteAll': 'ๅ…จ้ƒจๅˆช้™ค', - 'trading-assistant.symbolCount': 'ๅ€‹ๅนฃ็จฎ', - 'trading-assistant.status.running': '้‹่กŒไธญ', - 'trading-assistant.status.stopped': 'ๅทฒๅœๆญข', - 'trading-assistant.status.error': '้Œฏ่ชค', - 'trading-assistant.strategyType.IndicatorStrategy': 'ๆŠ€่ก“ๆŒ‡ๆจ™็ญ–็•ฅ', - 'trading-assistant.strategyType.PromptBasedStrategy': 'ๆ็คบ่ฉž็ญ–็•ฅ', - 'trading-assistant.strategyType.GridStrategy': '็ถฒๆ ผ็ญ–็•ฅ', - 'trading-assistant.tabs.tradingRecords': 'ไบคๆ˜“่จ˜้Œ„', - 'trading-assistant.tabs.positions': 'ๆŒๅ€‰่จ˜้Œ„', - 'trading-assistant.tabs.equityCurve': 'ๆทจๅ€ผๆ›ฒ็ทš', - 'trading-assistant.form.step1': '้ธๆ“‡ๆŒ‡ๆจ™', - 'trading-assistant.form.step2': 'ไบคๆ˜“ๆ‰€้…็ฝฎ', - 'trading-assistant.form.step3': '็ญ–็•ฅๅƒๆ•ธ', - 'trading-assistant.form.step2Params': '็ญ–็•ฅๅƒๆ•ธ', - 'trading-assistant.form.step3Signal': 'ไฟก่™Ÿ้€š็Ÿฅ', - 'trading-assistant.form.indicator': '้ธๆ“‡ๆŒ‡ๆจ™', - 'trading-assistant.form.indicatorHint': 'ๅช่ƒฝ้ธๆ“‡ๆ‚จๅทฒ่ณผ่ฒทๆˆ–ๅ‰ตๅปบ็š„ๆŠ€่ก“ๆŒ‡ๆจ™', - 'trading-assistant.form.qdtCostHints': 'ไฝฟ็”จ็ญ–็•ฅๅฐ‡ๆถˆ่€—QDT๏ผŒ่ซ‹็ขบไฟ่ณฌๆˆถๆœ‰่ถณๅค ็š„QDT้ค˜้ก', - 'trading-assistant.form.indicatorDescription': 'ๆŒ‡ๆจ™ๆ่ฟฐ', - 'trading-assistant.form.noDescription': 'ๆšซ็„กๆ่ฟฐ', - 'trading-assistant.form.exchange': '้ธๆ“‡ไบคๆ˜“ๆ‰€', - 'trading-assistant.form.apiKey': 'API Key', - 'trading-assistant.form.secretKey': 'Secret Key', - 'trading-assistant.form.passphrase': 'Passphrase', - 'trading-assistant.form.testConnection': 'ๆธฌ่ฉฆ้€ฃๆŽฅ', - 'trading-assistant.form.strategyName': '็ญ–็•ฅๅ็จฑ', - 'trading-assistant.form.symbol': 'ไบคๆ˜“ๅฐ', - 'trading-assistant.form.symbols': 'ไบคๆ˜“ๅฐ๏ผˆๅคš้ธ๏ผ‰', - 'trading-assistant.form.symbolHint': '็›ฎๅ‰ๅƒ…ๆ”ฏๆŒๅŠ ๅฏ†่ฒจๅนฃไบคๆ˜“ๅฐ', - 'trading-assistant.form.symbolHintCrypto': 'ๅŠ ๅฏ†่ฒจๅนฃ๏ผšไฝฟ็”จBTC/USDT็ญ‰ไบคๆ˜“ๅฐๆ ผๅผ', - 'trading-assistant.form.symbolsHint': '้ธๆ“‡ๅคšๅ€‹ไบคๆ˜“ๅฐ๏ผŒๅฐ‡่‡ชๅ‹•ๅ‰ตๅปบๅคšๅ€‹็ญ–็•ฅ', - 'trading-assistant.form.initialCapital': 'ๆŠ•ๅ…ฅ้‡‘้ก', - 'trading-assistant.form.marketType': 'ๅธ‚ๅ ด้กžๅž‹', - 'trading-assistant.form.marketTypeFutures': 'ๅˆ็ด„', - 'trading-assistant.form.marketTypeSpot': '็พ่ฒจ', - 'trading-assistant.form.marketTypeHint': 'ๅˆ็ด„ๆ”ฏๆŒ้›™ๅ‘ไบคๆ˜“ๅ’Œๆง“ๆ†๏ผŒ็พ่ฒจๅƒ…ๆ”ฏๆŒๅšๅคšไธ”ๆง“ๆ†ๅ›บๅฎš็ˆฒ1ๅ€', - 'trading-assistant.form.leverage': 'ๆง“ๆ†ๅ€ๆ•ธ', - 'trading-assistant.form.leverageHint': 'ๅˆ็ด„๏ผš1-125ๅ€๏ผŒ็พ่ฒจ๏ผšๅ›บๅฎš1ๅ€', - 'trading-assistant.form.spotLeverageFixed': '็พ่ฒจไบคๆ˜“ๆง“ๆ†ๅ›บๅฎš็ˆฒ1ๅ€', - 'trading-assistant.form.spotOnlyLongHint': '็พ่ฒจไบคๆ˜“ๅƒ…ๆ”ฏๆŒๅšๅคš', - 'trading-assistant.form.tradeDirection': 'ไบคๆ˜“ๆ–นๅ‘', - 'trading-assistant.form.tradeDirectionLong': 'ๅƒ…ๅšๅคš', - 'trading-assistant.form.tradeDirectionShort': 'ๅƒ…ๅš็ฉบ', - 'trading-assistant.form.tradeDirectionBoth': '้›™ๅ‘ไบคๆ˜“', - 'trading-assistant.form.timeframe': 'ๆ™‚้–“ๅ‘จๆœŸ', - 'trading-assistant.form.klinePeriod': 'K็ทšๅ‘จๆœŸ', - 'trading-assistant.form.timeframe1m': '1ๅˆ†้พ', - 'trading-assistant.form.timeframe5m': '5ๅˆ†้พ', - 'trading-assistant.form.timeframe15m': '15ๅˆ†้พ', - 'trading-assistant.form.timeframe30m': '30ๅˆ†้พ', - 'trading-assistant.form.timeframe1H': '1ๅฐๆ™‚', - 'trading-assistant.form.timeframe4H': '4ๅฐๆ™‚', - 'trading-assistant.form.timeframe1D': '1ๅคฉ', - 'trading-assistant.form.selectStrategyType': '้ธๆ“‡็ญ–็•ฅ้กžๅž‹', - 'trading-assistant.form.indicatorStrategy': 'ๆŒ‡ๆจ™็ญ–็•ฅ', - 'trading-assistant.form.indicatorStrategyDesc': 'ๅŸบๆ–ผๆŠ€่ก“ๆŒ‡ๆจ™็š„่‡ชๅ‹•ๅŒ–ไบคๆ˜“็ญ–็•ฅ', - 'trading-assistant.form.aiStrategy': 'AI็ญ–็•ฅ', - 'trading-assistant.form.aiStrategyDesc': 'ๅŸบๆ–ผAIๆ™บ่ƒฝๆฑบ็ญ–็š„่‡ชๅ‹•ๅŒ–ไบคๆ˜“็ญ–็•ฅ', - 'trading-assistant.form.enableAiFilter': 'ๅ•Ÿ็”จAIๆ™บ่ƒฝๆฑบ็ญ–้Žๆฟพ', - 'trading-assistant.form.enableAiFilterHint': 'ๅ•Ÿ็”จๅพŒ๏ผŒๆŒ‡ๆจ™ไฟก่™Ÿๅฐ‡็ถ“้ŽAIๆ™บ่ƒฝ้Žๆฟพ๏ผŒๆ้ซ˜ไบคๆ˜“่ณช้‡', - 'trading-assistant.form.aiFilterPrompt': '่‡ชๅฎš็พฉๆ็คบ่ฉž', - 'trading-assistant.form.aiFilterPromptHint': '็‚บAI้Žๆฟพๆไพ›่‡ชๅฎš็พฉๆŒ‡ไปค๏ผŒ็•™็ฉบๅ‰‡ไฝฟ็”จ็ณป็ตฑ้ป˜่ช', - 'trading-assistant.form.executionMode': 'ๅŸท่กŒๆจกๅผ', - 'trading-assistant.form.executionModeSignal': 'ๅƒ…ไฟก่™Ÿ้€š็Ÿฅ', - 'trading-assistant.form.executionModeLive': 'ๅฏฆ็›ค่‡ชๅ‹•ไบคๆ˜“', - 'trading-assistant.form.liveTradingCryptoOnlyHint': 'ๅฏฆ็›คไบคๆ˜“ๅŠŸ่ƒฝๅƒ…ๆ”ฏๆŒๅŠ ๅฏ†่ฒจๅนฃๅธ‚ๅ ด', - 'trading-assistant.form.notifyChannels': '้€š็Ÿฅๆธ ้“', - 'trading-assistant.form.notifyChannelsHint': '้ธๆ“‡ไฟก่™Ÿ่งธ็™ผๆ™‚็š„้€š็Ÿฅๆ–นๅผ', - 'trading-assistant.form.notifyEmail': '้ƒต็ฎฑๅœฐๅ€', - 'trading-assistant.form.notifyPhone': 'ๆ‰‹ๆฉŸ่™Ÿ็ขผ', - 'trading-assistant.form.notifyTelegram': 'Telegram ID', - 'trading-assistant.form.notifyDiscord': 'Discord Webhook', - 'trading-assistant.form.notifyWebhook': 'Webhook ๅœฐๅ€', - 'trading-assistant.form.liveTradingConfigTitle': 'ๅฏฆ็›คไบคๆ˜“้…็ฝฎ', - 'trading-assistant.form.liveTradingConfigHint': '่ซ‹ๅกซๅฏซไบคๆ˜“ๆ‰€API่ณ‡่จŠ๏ผŒๅฏฆ็›คไบคๆ˜“ๅฐ‡ไฝฟ็”จๆ‚จ็š„API้€ฒ่กŒ็œŸๅฏฆไบคๆ˜“', - 'trading-assistant.form.savedCredential': 'ๅทฒๅ„ฒๅญ˜็š„ๆ†‘่ญ‰', - 'trading-assistant.form.savedCredentialHint': '้ธๆ“‡ๅทฒๅ„ฒๅญ˜็š„ไบคๆ˜“ๆ‰€ๆ†‘่ญ‰๏ผŒ่‡ชๅ‹•ๅกซๅ……API้…็ฝฎ', - 'trading-assistant.form.saveCredential': 'ๅ„ฒๅญ˜ๆญคๆ†‘่ญ‰ไปฅไพฟไธ‹ๆฌกไฝฟ็”จ', - 'trading-assistant.form.credentialName': 'ๆ†‘่ญ‰ๅ็จฑ', - 'trading-assistant.validation.strategyTypeRequired': '่ซ‹้ธๆ“‡็ญ–็•ฅ้กžๅž‹', - 'trading-assistant.form.advancedSettings': '้ซ˜็ดš่จญ็ฝฎ', - 'trading-assistant.form.orderMode': 'ไธ‹ๅ–ฎๆจกๅผ', - 'trading-assistant.form.orderModeMaker': 'ๆŽ›ๅ–ฎ๏ผˆMaker๏ผ‰', - 'trading-assistant.form.orderModeTaker': 'ๅธ‚ๅƒน๏ผˆTaker๏ผ‰', - 'trading-assistant.form.orderModeHint': 'ๆŽ›ๅ–ฎๆจกๅผไฝฟ็”จ้™ๅƒนๅ–ฎ๏ผŒๆ‰‹็บŒ่ฒปๆ›ดไฝŽ๏ผ›ๅธ‚ๅƒนๆจกๅผ็ซ‹ๅณๆˆไบค๏ผŒๆ‰‹็บŒ่ฒป่ผƒ้ซ˜', - 'trading-assistant.form.makerWaitSec': 'ๆŽ›ๅ–ฎ็ญ‰ๅพ…ๆ™‚้–“๏ผˆ็ง’๏ผ‰', - 'trading-assistant.form.makerWaitSecHint': 'ๆŽ›ๅ–ฎๅพŒ็ญ‰ๅพ…ๆˆไบค็š„ๆ™‚้–“๏ผŒ่ถ…ๆ™‚ๅพŒๅ–ๆถˆไธฆ้‡่ฉฆ', - 'trading-assistant.form.makerRetries': 'ๆŽ›ๅ–ฎ้‡่ฉฆๆฌกๆ•ธ', - 'trading-assistant.form.makerRetriesHint': 'ๆŽ›ๅ–ฎๆœชๆˆไบคๆ™‚็š„ๆœ€ๅคง้‡่ฉฆๆฌกๆ•ธ', - 'trading-assistant.form.fallbackToMarket': 'ๆŽ›ๅ–ฎๅคฑๆ•—้™็ดšๅธ‚ๅƒน', - 'trading-assistant.form.fallbackToMarketHint': '้–‹/ๅนณๅ€‰ๆŽ›ๅ–ฎๆœชๆˆไบคๆ™‚๏ผŒๆ˜ฏๅฆ้™็ดš็ˆฒๅธ‚ๅƒนๅ–ฎไปฅ็ขบไฟๆˆไบค', - 'trading-assistant.form.marginMode': 'ไฟ่ญ‰้‡‘ๆจกๅผ', - 'trading-assistant.form.marginModeCross': 'ๅ…จๅ€‰', - 'trading-assistant.form.marginModeIsolated': '้€ๅ€‰', - 'trading-assistant.form.stopLossPct': 'ๆญขๆๆฏ”ไพ‹๏ผˆ%๏ผ‰', - 'trading-assistant.form.stopLossPctHint': '่จญ็ฝฎๆญขๆ็™พๅˆ†ๆฏ”๏ผŒ0่กจ็คบไธๅ•“็”จๆญขๆ', - 'trading-assistant.form.takeProfitPct': 'ๆญข็›ˆๆฏ”ไพ‹๏ผˆ%๏ผ‰', - 'trading-assistant.form.takeProfitPctHint': '่จญ็ฝฎๆญข็›ˆ็™พๅˆ†ๆฏ”๏ผŒ0่กจ็คบไธๅ•“็”จๆญข็›ˆ', - 'trading-assistant.form.signalMode': 'ไฟก่™Ÿๆจกๅผ', - 'trading-assistant.form.signalModeConfirmed': '็ขบ่ชๆจกๅผ', - 'trading-assistant.form.signalModeAggressive': 'ๆฟ€้€ฒๆจกๅผ', - 'trading-assistant.form.signalModeHint': '็ขบ่ชๆจกๅผ๏ผšๅƒ…ๆชขๆŸฅๅทฒๅฎŒๆˆ็š„K็ทš๏ผ›ๆฟ€้€ฒๆจกๅผ๏ผšไนŸๆชขๆŸฅๆญฃๅœจๅฝขๆˆ็š„K็ทš', - 'trading-assistant.form.cancel': 'ๅ–ๆถˆ', - 'trading-assistant.form.prev': 'ไธŠไธ€ๆญฅ', - 'trading-assistant.form.next': 'ไธ‹ไธ€ๆญฅ', - 'trading-assistant.form.confirmCreate': '็ขบ่ชๅ‰ตๅปบ', - 'trading-assistant.form.confirmEdit': '็ขบ่ชไฟฎๆ”น', - 'trading-assistant.messages.createSuccess': '็ญ–็•ฅๅ‰ตๅปบๆˆๅŠŸ', - 'trading-assistant.messages.createFailed': 'ๅ‰ตๅปบ็ญ–็•ฅๅคฑๆ•—', - 'trading-assistant.messages.updateSuccess': '็ญ–็•ฅๆ›ดๆ–ฐๆˆๅŠŸ', - 'trading-assistant.messages.updateFailed': 'ๆ›ดๆ–ฐ็ญ–็•ฅๅคฑๆ•—', - 'trading-assistant.messages.deleteSuccess': '็ญ–็•ฅๅˆช้™คๆˆๅŠŸ', - 'trading-assistant.messages.deleteFailed': 'ๅˆช้™ค็ญ–็•ฅๅคฑๆ•—', - 'trading-assistant.messages.startSuccess': '็ญ–็•ฅๅ•“ๅ‹•ๆˆๅŠŸ', - 'trading-assistant.messages.startFailed': 'ๅ•“ๅ‹•็ญ–็•ฅๅคฑๆ•—', - 'trading-assistant.messages.stopSuccess': '็ญ–็•ฅๅœๆญขๆˆๅŠŸ', - 'trading-assistant.messages.stopFailed': 'ๅœๆญข็ญ–็•ฅๅคฑๆ•—', - 'trading-assistant.messages.loadFailed': '็ฒๅ–็ญ–็•ฅๅˆ—่กจๅคฑๆ•—', - 'trading-assistant.messages.runningWarning': '็ญ–็•ฅ้‹่กŒไธญ๏ผŒ่ซ‹ๅ…ˆๅœๆญข็ญ–็•ฅๅพŒๅ†ไฟฎๆ”น', - 'trading-assistant.messages.deleteConfirmWithName': '็ขบๅฎš่ฆๅˆช้™ค็ญ–็•ฅโ€œ{name}โ€ๅ—Ž๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅพฉใ€‚', - 'trading-assistant.messages.deleteConfirm': '็ขบๅฎš่ฆๅˆช้™ค่ฉฒ็ญ–็•ฅๅ—Ž๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅพฉใ€‚', - 'trading-assistant.messages.loadTradesFailed': '็ฒๅ–ไบคๆ˜“่จ˜้Œ„ๅคฑๆ•—', - 'trading-assistant.messages.loadPositionsFailed': '็ฒๅ–ๆŒๅ€‰่จ˜้Œ„ๅคฑๆ•—', - 'trading-assistant.messages.loadEquityFailed': '็ฒๅ–ๆทจๅ€ผๆ›ฒ็ทšๅคฑๆ•—', - 'trading-assistant.messages.loadIndicatorsFailed': 'ๅŠ ่ผ‰ๆŒ‡ๆจ™ๅˆ—่กจๅคฑๆ•—๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'trading-assistant.messages.spotLimitations': '็พ่ฒจไบคๆ˜“ๅทฒ่‡ชๅ‹•่จญ็ฝฎ็ˆฒๅƒ…ๅšๅคšใ€1ๅ€ๆง“ๆ†', - 'trading-assistant.messages.autoFillApiConfig': 'ๅทฒ่‡ชๅ‹•ๅกซๅ……่ฉฒไบคๆ˜“ๆ‰€็š„ๆญทๅฒAPI้…็ฝฎ', - 'trading-assistant.messages.batchCreateSuccess': 'ๆˆๅŠŸๅ‰ตๅปบ {count} ๅ€‹็ญ–็•ฅ', - 'trading-assistant.messages.batchStartSuccess': 'ๆˆๅŠŸๅ•Ÿๅ‹• {count} ๅ€‹็ญ–็•ฅ', - 'trading-assistant.messages.batchStartFailed': 'ๆ‰น้‡ๅ•Ÿๅ‹•็ญ–็•ฅๅคฑๆ•—', - 'trading-assistant.messages.batchStopSuccess': 'ๆˆๅŠŸๅœๆญข {count} ๅ€‹็ญ–็•ฅ', - 'trading-assistant.messages.batchStopFailed': 'ๆ‰น้‡ๅœๆญข็ญ–็•ฅๅคฑๆ•—', - 'trading-assistant.messages.batchDeleteSuccess': 'ๆˆๅŠŸๅˆช้™ค {count} ๅ€‹็ญ–็•ฅ', - 'trading-assistant.messages.batchDeleteFailed': 'ๆ‰น้‡ๅˆช้™ค็ญ–็•ฅๅคฑๆ•—', - 'trading-assistant.messages.batchDeleteConfirm': '็ขบๅฎš่ฆๅˆช้™ค็ญ–็•ฅ็ต„"{name}"ไธ‹็š„ {count} ๅ€‹็ญ–็•ฅๅ—Ž๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅพฉใ€‚', - 'trading-assistant.notify.browser': '็€่ฆฝๅ™จ้€š็Ÿฅ', - 'trading-assistant.notify.email': '้ƒต็ฎฑ', - 'trading-assistant.notify.phone': '็ฐก่จŠ', - 'trading-assistant.notify.telegram': 'Telegram', - 'trading-assistant.notify.discord': 'Discord', - 'trading-assistant.notify.webhook': 'Webhook', - 'trading-assistant.placeholders.selectIndicator': '่ซ‹้ธๆ“‡ๆŒ‡ๆจ™', - 'trading-assistant.placeholders.selectExchange': '่ซ‹้ธๆ“‡ไบคๆ˜“ๆ‰€', - 'trading-assistant.placeholders.inputApiKey': '่ซ‹่ผธๅ…ฅAPI Key', - 'trading-assistant.placeholders.inputSecretKey': '่ซ‹่ผธๅ…ฅSecret Key', - 'trading-assistant.placeholders.inputPassphrase': '่ซ‹่ผธๅ…ฅPassphrase', - 'trading-assistant.placeholders.inputStrategyName': '่ซ‹่ผธๅ…ฅ็ญ–็•ฅๅ็จฑ', - 'trading-assistant.placeholders.selectSymbol': '่ซ‹้ธๆ“‡ไบคๆ˜“ๅฐ', - 'trading-assistant.placeholders.selectSymbols': '่ซ‹้ธๆ“‡ไบคๆ˜“ๅฐ๏ผˆๆ”ฏๆŒๅคš้ธ๏ผ‰', - 'trading-assistant.placeholders.selectTimeframe': '่ซ‹้ธๆ“‡ๆ™‚้–“ๅ‘จๆœŸ', - 'trading-assistant.placeholders.selectKlinePeriod': '่ซ‹้ธๆ“‡K็ทšๅ‘จๆœŸ', - 'trading-assistant.placeholders.inputAiFilterPrompt': '่ซ‹่ผธๅ…ฅ่‡ชๅฎš็พฉๆ็คบ่ฉž๏ผˆๅฏ้ธ๏ผ‰', - 'trading-assistant.placeholders.selectSavedCredential': '่ซ‹้ธๆ“‡ๅทฒๅ„ฒๅญ˜็š„ๆ†‘่ญ‰', - 'trading-assistant.placeholders.inputEmail': '่ซ‹่ผธๅ…ฅ้ƒต็ฎฑๅœฐๅ€', - 'trading-assistant.placeholders.inputPhone': '่ซ‹่ผธๅ…ฅๆ‰‹ๆฉŸ่™Ÿ็ขผ', - 'trading-assistant.placeholders.inputTelegram': '่ซ‹่ผธๅ…ฅTelegram IDๆˆ–Chat ID', - 'trading-assistant.placeholders.inputDiscord': '่ซ‹่ผธๅ…ฅDiscord Webhookๅœฐๅ€', - 'trading-assistant.placeholders.inputWebhook': '่ซ‹่ผธๅ…ฅWebhookๅœฐๅ€', - 'trading-assistant.placeholders.inputCredentialName': '่ซ‹่ผธๅ…ฅๆ†‘่ญ‰ๅ็จฑ๏ผˆๅฆ‚๏ผšๆˆ‘็š„OKXๅธณๆˆถ๏ผ‰', - 'trading-assistant.validation.indicatorRequired': '่ซ‹้ธๆ“‡ๆŒ‡ๆจ™', - 'trading-assistant.validation.exchangeRequired': '่ซ‹้ธๆ“‡ไบคๆ˜“ๆ‰€', - 'trading-assistant.validation.apiKeyRequired': '่ซ‹่ผธๅ…ฅAPI Key', - 'trading-assistant.validation.secretKeyRequired': '่ซ‹่ผธๅ…ฅSecret Key', - 'trading-assistant.validation.passphraseRequired': '่ซ‹่ผธๅ…ฅPassphrase', - 'trading-assistant.validation.exchangeConfigIncomplete': '่ซ‹ๅกซๅฏซๅฎŒๆ•ด็š„ไบคๆ˜“ๆ‰€้…็ฝฎไฟกๆฏ', - 'trading-assistant.validation.testConnectionRequired': '่ซ‹ๅ…ˆ้ปžๆ“Š"ๆธฌ่ฉฆ้€ฃๆŽฅ"ๆŒ‰้ˆ•ไธฆ็ขบไฟ้€ฃๆŽฅๆˆๅŠŸ', - 'trading-assistant.validation.testConnectionFailed': '้€ฃๆŽฅๆธฌ่ฉฆๅคฑๆ•—๏ผŒ่ซ‹ๆชขๆŸฅ้…็ฝฎๅพŒ้‡ๆ–ฐๆธฌ่ฉฆ', - 'trading-assistant.validation.strategyNameRequired': '่ซ‹่ผธๅ…ฅ็ญ–็•ฅๅ็จฑ', - 'trading-assistant.validation.symbolRequired': '่ซ‹้ธๆ“‡ไบคๆ˜“ๅฐ', - 'trading-assistant.validation.symbolsRequired': '่ซ‹่‡ณๅฐ‘้ธๆ“‡ไธ€ๅ€‹ไบคๆ˜“ๅฐ', - 'trading-assistant.validation.emailInvalid': '่ซ‹่ผธๅ…ฅๆœ‰ๆ•ˆ็š„้ƒต็ฎฑๅœฐๅ€', - 'trading-assistant.validation.notifyChannelRequired': '่ซ‹่‡ณๅฐ‘้ธๆ“‡ไธ€ๅ€‹้€š็Ÿฅๆธ ้“', - 'trading-assistant.validation.initialCapitalRequired': '่ซ‹่ผธๅ…ฅๆŠ•ๅ…ฅ้‡‘้ก', - 'trading-assistant.validation.leverageRequired': '่ซ‹่ผธๅ…ฅๆง“ๆ†ๅ€ๆ•ธ', - 'trading-assistant.table.time': 'ๆ™‚้–“', - 'trading-assistant.table.type': '้กžๅž‹', - 'trading-assistant.table.price': 'ๅƒนๆ ผ', - 'trading-assistant.table.amount': 'ๆ•ธ้‡', - 'trading-assistant.table.value': '้‡‘้ก', - 'trading-assistant.table.commission': 'ๆ‰‹็บŒ่ฒป', - 'trading-assistant.table.symbol': 'ไบคๆ˜“ๅฐ', - 'trading-assistant.table.side': 'ๆ–นๅ‘', - 'trading-assistant.table.size': 'ๆŒๅ€‰ๆ•ธ้‡', - 'trading-assistant.table.entryPrice': '้–‹ๅ€‰ๅƒนๆ ผ', - 'trading-assistant.table.currentPrice': '็•ถๅ‰ๅƒนๆ ผ', - 'trading-assistant.table.unrealizedPnl': 'ๆœชๅฏฆ็พ็›ˆ่™ง', - 'trading-assistant.table.pnlPercent': '็›ˆ่™งๆฏ”ไพ‹', - 'trading-assistant.table.buy': '่ฒทๅ…ฅ', - 'trading-assistant.table.sell': '่ณฃๅ‡บ', - 'trading-assistant.table.long': 'ๅšๅคš', - 'trading-assistant.table.short': 'ๅš็ฉบ', - 'trading-assistant.table.noPositions': 'ๆšซ็„กๆŒๅ€‰', - 'trading-assistant.detail.title': '็ญ–็•ฅ่ฉณๆƒ…', - 'trading-assistant.detail.strategyName': '็ญ–็•ฅๅ็จฑ', - 'trading-assistant.detail.strategyType': '็ญ–็•ฅ้กžๅž‹', - 'trading-assistant.detail.status': '็‹€ๆ…‹', - 'trading-assistant.detail.tradingMode': 'ไบคๆ˜“ๆจกๅผ', - 'trading-assistant.detail.exchange': 'ไบคๆ˜“ๆ‰€', - 'trading-assistant.detail.initialCapital': 'ๅˆๅง‹่ณ‡้‡‘', - 'trading-assistant.detail.totalInvestment': '็ธฝๆŠ•ๅ…ฅ้‡‘้ก', - 'trading-assistant.detail.currentEquity': '็•ถๅ‰ๆทจๅ€ผ', - 'trading-assistant.detail.totalPnl': '็ธฝ็›ˆ่™ง', - 'trading-assistant.detail.indicatorName': 'ๆŒ‡ๆจ™ๅ็จฑ', - 'trading-assistant.detail.maxLeverage': 'ๆœ€ๅคงๆง“ๆ†', - 'trading-assistant.detail.decideInterval': 'ๆฑบ็ญ–้–“้š”', - 'trading-assistant.detail.symbols': 'ไบคๆ˜“ๆจ™็š„', - 'trading-assistant.detail.createdAt': 'ๅ‰ตๅปบๆ™‚้–“', - 'trading-assistant.detail.updatedAt': 'ๆ›ดๆ–ฐๆ™‚้–“', - 'trading-assistant.detail.llmConfig': 'AIๆจกๅž‹้…็ฝฎ', - 'trading-assistant.detail.exchangeConfig': 'ไบคๆ˜“ๆ‰€้…็ฝฎ', - 'trading-assistant.detail.provider': 'ๆไพ›ๅ•†', - 'trading-assistant.detail.modelId': 'ๆจกๅž‹ID', - 'trading-assistant.detail.close': '้—œ้–‰', - 'trading-assistant.detail.loadFailed': '็ฒๅ–็ญ–็•ฅ่ฉณๆƒ…ๅคฑๆ•—', - 'trading-assistant.equity.noData': 'ๆšซ็„กๆทจๅ€ผๆ•ธๆ“š', - 'trading-assistant.equity.equity': 'ๆทจๅ€ผ', - 'trading-assistant.exchange.tradingMode': 'ไบคๆ˜“ๆจกๅผ', - 'trading-assistant.exchange.virtual': 'ๆจกๆ“ฌไบคๆ˜“', - 'trading-assistant.exchange.live': 'ๅฏฆ็›คไบคๆ˜“', - 'trading-assistant.exchange.selectExchange': '้ธๆ“‡ไบคๆ˜“ๆ‰€', - 'trading-assistant.exchange.walletAddress': '้ŒขๅŒ…ๅœฐๅ€', - 'trading-assistant.exchange.walletAddressPlaceholder': '่ซ‹่ผธๅ…ฅ้ŒขๅŒ…ๅœฐๅ€๏ผˆไปฅ0x้–‹้ ญ๏ผ‰', - 'trading-assistant.exchange.privateKey': '็ง้‘ฐ', - 'trading-assistant.exchange.privateKeyPlaceholder': '่ซ‹่ผธๅ…ฅ็ง้‘ฐ๏ผˆ64ๅญ—็ฌฆ๏ผ‰', - 'trading-assistant.exchange.testConnection': 'ๆธฌ่ฉฆ้€ฃๆŽฅ', - 'trading-assistant.exchange.connectionSuccess': '้€ฃๆŽฅๆˆๅŠŸ', - 'trading-assistant.exchange.connectionFailed': '้€ฃๆŽฅๅคฑๆ•—', - 'trading-assistant.exchange.testFailed': '้€ฃๆŽฅๆธฌ่ฉฆๅคฑๆ•—', - 'trading-assistant.exchange.fillComplete': '่ซ‹ๅกซๅฏซๅฎŒๆ•ด็š„ไบคๆ˜“ๆ‰€้…็ฝฎไฟกๆฏ', - 'trading-assistant.strategyTypeOptions.ai': 'AI้ฉ…ๅ‹•็ญ–็•ฅ', - 'trading-assistant.strategyTypeOptions.indicator': 'ๆŠ€่ก“ๆŒ‡ๆจ™็ญ–็•ฅ', - 'trading-assistant.strategyTypeOptions.aiDeveloping': 'AI้ฉ…ๅ‹•็ญ–็•ฅๅŠŸ่ƒฝ้–‹็™ผไธญ๏ผŒๆ•ฌ่ซ‹ๆœŸๅพ…', - 'trading-assistant.strategyTypeOptions.aiDevelopingWarning': 'AI้ฉ…ๅ‹•็ญ–็•ฅๅŠŸ่ƒฝๆญฃๅœจ้–‹็™ผไธญ', - 'trading-assistant.indicatorType.trend': '่ถจๅ‹ข', - 'trading-assistant.indicatorType.momentum': 'ๅ‹•้‡', - 'trading-assistant.indicatorType.volatility': 'ๆณขๅ‹•', - 'trading-assistant.indicatorType.volume': 'ๆˆไบค้‡', - 'trading-assistant.indicatorType.custom': '่‡ชๅฎš็พฉ', - 'trading-assistant.exchangeNames': { - 'okx': 'OKX', - 'binance': 'ๅนฃๅฎ‰', - 'hyperliquid': 'Hyperliquid', - 'blockchaincom': 'Blockchain.com', - 'coinbaseexchange': 'Coinbase', - 'gate': 'Gate.io', - 'mexc': 'MEXC', - 'kraken': 'Kraken', - 'bitfinex': 'Bitfinex', - 'bybit': 'Bybit', - 'kucoin': 'KuCoin', - 'huobi': '็ซๅนฃ', - 'bitget': 'Bitget', - 'bitmex': 'BitMEX', - 'deribit': 'Deribit', - 'phemex': 'Phemex', - 'bitmart': 'BitMart', - 'bitstamp': 'Bitstamp', - 'bittrex': 'Bittrex', - 'poloniex': 'Poloniex', - 'gemini': 'Gemini', - 'cryptocom': 'Crypto.com', - 'bitflyer': 'bitFlyer', - 'upbit': 'Upbit', - 'bithumb': 'Bithumb', - 'coinone': 'Coinone', - 'zb': 'ZB', - 'lbank': 'LBank', - 'bibox': 'Bibox', - 'bigone': 'BigONE', - 'bitrue': 'Bitrue', - 'coinex': 'CoinEx', - 'digifinex': 'DigiFinex', - 'ftx': 'FTX', - 'ftxus': 'FTX US', - 'binanceus': 'Binance US', - 'binancecoinm': 'Binance COIN-M', - 'binanceusdm': 'Binance USDโ“ˆ-M', - 'deepcoin': 'Deepcoin' - }, - 'ai-trading-assistant.title': 'AIไบคๆ˜“ๅŠฉๆ‰‹', - 'ai-trading-assistant.strategyList': '็ญ–็•ฅๅˆ—่กจ', - 'ai-trading-assistant.createStrategy': 'ๅ‰ตๅปบ็ญ–็•ฅ', - 'ai-trading-assistant.noStrategy': 'ๆšซ็„ก็ญ–็•ฅ', - 'ai-trading-assistant.selectStrategy': '่ซ‹ๅพžๅทฆๅด้ธๆ“‡ไธ€ๅ€‹็ญ–็•ฅๆŸฅ็œ‹่ฉณๆƒ…', - 'ai-trading-assistant.startStrategy': 'ๅ•“ๅ‹•็ญ–็•ฅ', - 'ai-trading-assistant.stopStrategy': 'ๅœๆญข็ญ–็•ฅ', - 'ai-trading-assistant.editStrategy': '็ทจ่ผฏ็ญ–็•ฅ', - 'ai-trading-assistant.deleteStrategy': 'ๅˆช้™ค็ญ–็•ฅ', - 'ai-trading-assistant.status.running': '้‹่กŒไธญ', - 'ai-trading-assistant.status.stopped': 'ๅทฒๅœๆญข', - 'ai-trading-assistant.status.error': '้Œฏ่ชค', - 'ai-trading-assistant.tabs.tradingRecords': 'ไบคๆ˜“่จ˜้Œ„', - 'ai-trading-assistant.tabs.positions': 'ๆŒๅ€‰่จ˜้Œ„', - 'ai-trading-assistant.tabs.aiDecisions': 'AIๆฑบ็ญ–่จ˜้Œ„', - 'ai-trading-assistant.tabs.equityCurve': 'ๆทจๅ€ผๆ›ฒ็ทš', - 'ai-trading-assistant.form.createTitle': 'ๅ‰ตๅปบAIไบคๆ˜“็ญ–็•ฅ', - 'ai-trading-assistant.form.editTitle': '็ทจ่ผฏAIไบคๆ˜“็ญ–็•ฅ', - 'ai-trading-assistant.form.strategyName': '็ญ–็•ฅๅ็จฑ', - 'ai-trading-assistant.form.modelId': 'AIๆจกๅž‹', - 'ai-trading-assistant.form.modelIdHint': 'ไฝฟ็”จ็ณป็ตฑOpenRouterๆœๅ‹™๏ผŒ็„ก้œ€้…็ฝฎAPI Key', - 'ai-trading-assistant.form.decideInterval': 'ๆฑบ็ญ–้–“้š”', - 'ai-trading-assistant.form.decideInterval5m': '5ๅˆ†้พ', - 'ai-trading-assistant.form.decideInterval10m': '10ๅˆ†้พ', - 'ai-trading-assistant.form.decideInterval30m': '30ๅˆ†้พ', - 'ai-trading-assistant.form.decideInterval1h': '1ๅฐๆ™‚', - 'ai-trading-assistant.form.decideInterval4h': '4ๅฐๆ™‚', - 'ai-trading-assistant.form.decideInterval1d': '1ๅคฉ', - 'ai-trading-assistant.form.decideInterval1w': '1ๅ‘จ', - 'ai-trading-assistant.form.decideIntervalHint': 'AIๅšๆฑบ็ญ–็š„ๆ™‚้–“้–“้š”', - 'ai-trading-assistant.form.runPeriod': '้‹่กŒๅ‘จๆœŸ', - 'ai-trading-assistant.form.runPeriodHint': '็ญ–็•ฅ้‹่กŒ็š„้–‹ๅง‹ๆ™‚้–“ๅ’Œ็ตๆŸๆ™‚้–“', - 'ai-trading-assistant.form.startDate': '้–‹ๅง‹ๆ—ฅๆœŸ', - 'ai-trading-assistant.form.endDate': '็ตๆŸๆ—ฅๆœŸ', - 'ai-trading-assistant.form.qdtCostTitle': 'QDTๆ‰ฃ่ฒป่ชชๆ˜Ž', - 'ai-trading-assistant.form.qdtCostHint': 'ๆฏๆฌกAIๆฑบ็ญ–ๅฐ‡ๆ‰ฃ่ฒป {cost} ๅ€‹QDT๏ผŒ่ซ‹็ขบไฟ่ณฌๆˆถๆœ‰่ถณๅค ็š„QDT้ค˜้กใ€‚็ญ–็•ฅ้‹่กŒๆœŸ้–“๏ผŒๆฏๆฌกๆฑบ็ญ–้ƒฝๆœƒๅฏฆๆ™‚ๆ‰ฃ่ฒปใ€‚', - 'ai-trading-assistant.form.apiKey': 'API Key', - 'ai-trading-assistant.form.exchange': '้ธๆ“‡ไบคๆ˜“ๆ‰€', - 'ai-trading-assistant.form.secretKey': 'Secret Key', - 'ai-trading-assistant.form.passphrase': 'Passphrase', - 'ai-trading-assistant.form.testConnection': 'ๆธฌ่ฉฆ้€ฃๆŽฅ', - 'ai-trading-assistant.form.symbol': 'ไบคๆ˜“ๅฐ', - 'ai-trading-assistant.form.symbolHint': '้ธๆ“‡่ฆไบคๆ˜“็š„ไบคๆ˜“ๅฐ', - 'ai-trading-assistant.form.initialCapital': 'ๆŠ•ๅ…ฅ้‡‘้ก๏ผˆไฟ่ญ‰้‡‘๏ผ‰', - 'ai-trading-assistant.form.leverage': 'ๆง“ๆ†ๅ€ๆ•ธ', - 'ai-trading-assistant.form.timeframe': 'ๆ™‚้–“ๅ‘จๆœŸ', - 'ai-trading-assistant.form.timeframe1m': '1ๅˆ†้พ', - 'ai-trading-assistant.form.timeframe5m': '5ๅˆ†้พ', - 'ai-trading-assistant.form.timeframe15m': '15ๅˆ†้พ', - 'ai-trading-assistant.form.timeframe30m': '30ๅˆ†้พ', - 'ai-trading-assistant.form.timeframe1H': '1ๅฐๆ™‚', - 'ai-trading-assistant.form.timeframe4H': '4ๅฐๆ™‚', - 'ai-trading-assistant.form.timeframe1D': '1ๅคฉ', - 'ai-trading-assistant.form.marketType': 'ๅธ‚ๅ ด้กžๅž‹', - 'ai-trading-assistant.form.marketTypeFutures': 'ๅˆ็ด„', - 'ai-trading-assistant.form.marketTypeSpot': '็พ่ฒจ', - 'ai-trading-assistant.form.totalPnl': '็ธฝ็›ˆ่™ง', - 'ai-trading-assistant.form.customPrompt': '่‡ชๅฎš็พฉๆ็คบ่ฉž', - 'ai-trading-assistant.form.customPromptHint': 'ๅฏ้ธ๏ผŒ็”จๆ–ผ่‡ชๅฎš็พฉAI็š„ไบคๆ˜“็ญ–็•ฅๅ’Œๆฑบ็ญ–้‚่ผฏ', - 'ai-trading-assistant.form.cancel': 'ๅ–ๆถˆ', - 'ai-trading-assistant.form.prev': 'ไธŠไธ€ๆญฅ', - 'ai-trading-assistant.form.next': 'ไธ‹ไธ€ๆญฅ', - 'ai-trading-assistant.form.confirmCreate': '็ขบ่ชๅ‰ตๅปบ', - 'ai-trading-assistant.form.confirmEdit': '็ขบ่ชไฟฎๆ”น', - 'ai-trading-assistant.messages.createSuccess': '็ญ–็•ฅๅ‰ตๅปบๆˆๅŠŸ', - 'ai-trading-assistant.messages.createFailed': 'ๅ‰ตๅปบ็ญ–็•ฅๅคฑๆ•—', - 'ai-trading-assistant.messages.updateSuccess': '็ญ–็•ฅๆ›ดๆ–ฐๆˆๅŠŸ', - 'ai-trading-assistant.messages.updateFailed': 'ๆ›ดๆ–ฐ็ญ–็•ฅๅคฑๆ•—', - 'ai-trading-assistant.messages.deleteSuccess': '็ญ–็•ฅๅˆช้™คๆˆๅŠŸ', - 'ai-trading-assistant.messages.deleteFailed': 'ๅˆช้™ค็ญ–็•ฅๅคฑๆ•—', - 'ai-trading-assistant.messages.startSuccess': '็ญ–็•ฅๅ•“ๅ‹•ๆˆๅŠŸ', - 'ai-trading-assistant.messages.startFailed': 'ๅ•“ๅ‹•็ญ–็•ฅๅคฑๆ•—', - 'ai-trading-assistant.messages.stopSuccess': '็ญ–็•ฅๅœๆญขๆˆๅŠŸ', - 'ai-trading-assistant.messages.stopFailed': 'ๅœๆญข็ญ–็•ฅๅคฑๆ•—', - 'ai-trading-assistant.messages.loadFailed': '็ฒๅ–็ญ–็•ฅๅˆ—่กจๅคฑๆ•—', - 'ai-trading-assistant.messages.loadDecisionsFailed': '็ฒๅ–AIๆฑบ็ญ–่จ˜้Œ„ๅคฑๆ•—', - 'ai-trading-assistant.messages.deleteConfirm': '็ขบๅฎš่ฆๅˆช้™ค่ฉฒ็ญ–็•ฅๅ—Ž๏ผŸๆญคๆ“ไฝœไธๅฏๆขๅพฉใ€‚', - 'ai-trading-assistant.placeholders.inputStrategyName': '่ซ‹่ผธๅ…ฅ็ญ–็•ฅๅ็จฑ', - 'ai-trading-assistant.placeholders.selectModelId': '่ซ‹้ธๆ“‡AIๆจกๅž‹', - 'ai-trading-assistant.placeholders.selectDecideInterval': '่ซ‹้ธๆ“‡ๆฑบ็ญ–้–“้š”', - 'ai-trading-assistant.placeholders.startTime': '้–‹ๅง‹ๆ™‚้–“', - 'ai-trading-assistant.placeholders.endTime': '็ตๆŸๆ™‚้–“', - 'ai-trading-assistant.placeholders.inputApiKey': '่ซ‹่ผธๅ…ฅAPI Key', - 'ai-trading-assistant.placeholders.selectExchange': '่ซ‹้ธๆ“‡ไบคๆ˜“ๆ‰€', - 'ai-trading-assistant.placeholders.inputSecretKey': '่ซ‹่ผธๅ…ฅSecret Key', - 'ai-trading-assistant.placeholders.inputPassphrase': '่ซ‹่ผธๅ…ฅPassphrase', - 'ai-trading-assistant.placeholders.selectSymbol': '่ซ‹้ธๆ“‡ไบคๆ˜“ๅฐ๏ผŒๅฆ‚๏ผšBTC/USDT', - 'ai-trading-assistant.placeholders.selectTimeframe': '่ซ‹้ธๆ“‡ๆ™‚้–“ๅ‘จๆœŸ', - 'ai-trading-assistant.placeholders.inputCustomPrompt': '่ซ‹่ผธๅ…ฅ่‡ชๅฎš็พฉๆ็คบ่ฉž๏ผˆๅฏ้ธ๏ผ‰', - 'ai-trading-assistant.validation.strategyNameRequired': '่ซ‹่ผธๅ…ฅ็ญ–็•ฅๅ็จฑ', - 'ai-trading-assistant.validation.modelIdRequired': '่ซ‹้ธๆ“‡AIๆจกๅž‹', - 'ai-trading-assistant.validation.runPeriodRequired': '่ซ‹้ธๆ“‡้‹่กŒๅ‘จๆœŸ', - 'ai-trading-assistant.validation.apiKeyRequired': '่ซ‹่ผธๅ…ฅAPI Key', - 'ai-trading-assistant.validation.exchangeRequired': '่ซ‹้ธๆ“‡ไบคๆ˜“ๆ‰€', - 'ai-trading-assistant.validation.secretKeyRequired': '่ซ‹่ผธๅ…ฅSecret Key', - 'ai-trading-assistant.validation.symbolRequired': '่ซ‹้ธๆ“‡ไบคๆ˜“ๅฐ', - 'ai-trading-assistant.validation.initialCapitalRequired': '่ซ‹่ผธๅ…ฅๆŠ•ๅ…ฅ้‡‘้ก', - 'ai-trading-assistant.table.time': 'ๆ™‚้–“', - 'ai-trading-assistant.table.type': '้กžๅž‹', - 'ai-trading-assistant.table.price': 'ๅƒนๆ ผ', - 'ai-trading-assistant.table.amount': 'ๆ•ธ้‡', - 'ai-trading-assistant.table.value': '้‡‘้ก', - 'ai-trading-assistant.table.symbol': 'ไบคๆ˜“ๅฐ', - 'ai-trading-assistant.table.side': 'ๆ–นๅ‘', - 'ai-trading-assistant.table.size': 'ๆŒๅ€‰ๆ•ธ้‡', - 'ai-trading-assistant.table.entryPrice': '้–‹ๅ€‰ๅƒนๆ ผ', - 'ai-trading-assistant.table.currentPrice': '็•ถๅ‰ๅƒนๆ ผ', - 'ai-trading-assistant.table.unrealizedPnl': 'ๆœชๅฏฆ็พ็›ˆ่™ง', - 'ai-trading-assistant.table.profit': '็›ˆ่™ง', - 'ai-trading-assistant.table.openLong': '้–‹ๅคš', - 'ai-trading-assistant.table.closeLong': 'ๅนณๅคš', - 'ai-trading-assistant.table.openShort': '้–‹็ฉบ', - 'ai-trading-assistant.table.closeShort': 'ๅนณ็ฉบ', - 'ai-trading-assistant.table.addLong': 'ๅŠ ๅคš', - 'ai-trading-assistant.table.addShort': 'ๅŠ ็ฉบ', - 'ai-trading-assistant.table.closeShortProfit': 'ๅนณ็ฉบๆญข็›ˆ', - 'ai-trading-assistant.table.closeShortStop': 'ๅนณ็ฉบๆญขๆ', - 'ai-trading-assistant.table.closeLongProfit': 'ๅนณๅคšๆญข็›ˆ', - 'ai-trading-assistant.table.closeLongStop': 'ๅนณๅคšๆญขๆ', - 'ai-trading-assistant.table.buy': '่ฒทๅ…ฅ', - 'ai-trading-assistant.table.sell': '่ณฃๅ‡บ', - 'ai-trading-assistant.table.long': 'ๅšๅคš', - 'ai-trading-assistant.table.short': 'ๅš็ฉบ', - 'ai-trading-assistant.table.hold': 'ๆŒๆœ‰', - 'ai-trading-assistant.table.reasoning': 'ๅˆ†ๆž็†็”ฑ', - 'ai-trading-assistant.table.decisions': 'ๆฑบ็ญ–', - 'ai-trading-assistant.table.riskAssessment': '้ขจ้šช่ฉ•ไผฐ', - 'ai-trading-assistant.table.confidence': '็ฝฎไฟกๅบฆ', - 'ai-trading-assistant.table.totalRecords': 'ๅ…ฑ {total} ๆข่จ˜้Œ„', - 'ai-trading-assistant.table.noPositions': 'ๆšซ็„กๆŒๅ€‰', - 'ai-trading-assistant.detail.title': '็ญ–็•ฅ่ฉณๆƒ…', - 'ai-trading-assistant.equity.noData': 'ๆšซ็„กๆทจๅ€ผๆ•ธๆ“š', - 'ai-trading-assistant.equity.equity': 'ๆทจๅ€ผ', - 'ai-trading-assistant.exchange.testFailed': '้€ฃๆŽฅๆธฌ่ฉฆๅคฑๆ•—', - 'ai-trading-assistant.exchange.connectionSuccess': '้€ฃๆŽฅๆˆๅŠŸ', - 'ai-trading-assistant.exchange.connectionFailed': '้€ฃๆŽฅๅคฑๆ•—', - 'ai-trading-assistant.form.advancedSettings': '้ซ˜็ดš่จญ็ฝฎ', - 'ai-trading-assistant.form.orderMode': 'ไธ‹ๅ–ฎๆจกๅผ', - 'ai-trading-assistant.form.orderModeMaker': 'ๆŽ›ๅ–ฎ๏ผˆMaker๏ผ‰', - 'ai-trading-assistant.form.orderModeTaker': 'ๅธ‚ๅƒน๏ผˆTaker๏ผ‰', - 'ai-trading-assistant.form.orderModeHint': 'ๆŽ›ๅ–ฎๆจกๅผไฝฟ็”จ้™ๅƒนๅ–ฎ๏ผŒๆ‰‹็บŒ่ฒปๆ›ดไฝŽ๏ผ›ๅธ‚ๅƒนๆจกๅผ็ซ‹ๅณๆˆไบค๏ผŒๆ‰‹็บŒ่ฒป่ผƒ้ซ˜', - 'ai-trading-assistant.form.makerWaitSec': 'ๆŽ›ๅ–ฎ็ญ‰ๅพ…ๆ™‚้–“๏ผˆ็ง’๏ผ‰', - 'ai-trading-assistant.form.makerWaitSecHint': 'ๆŽ›ๅ–ฎๅพŒ็ญ‰ๅพ…ๆˆไบค็š„ๆ™‚้–“๏ผŒ่ถ…ๆ™‚ๅพŒๅ–ๆถˆไธฆ้‡่ฉฆ', - 'ai-trading-assistant.form.makerRetries': 'ๆŽ›ๅ–ฎ้‡่ฉฆๆฌกๆ•ธ', - 'ai-trading-assistant.form.makerRetriesHint': 'ๆŽ›ๅ–ฎๆœชๆˆไบคๆ™‚็š„ๆœ€ๅคง้‡่ฉฆๆฌกๆ•ธ', - 'ai-trading-assistant.form.fallbackToMarket': 'ๆŽ›ๅ–ฎๅคฑๆ•—้™็ดšๅธ‚ๅƒน', - 'ai-trading-assistant.form.fallbackToMarketHint': '้–‹/ๅนณๅ€‰ๆŽ›ๅ–ฎๆœชๆˆไบคๆ™‚๏ผŒๆ˜ฏๅฆ้™็ดš็ˆฒๅธ‚ๅƒนๅ–ฎไปฅ็ขบไฟๆˆไบค', - 'ai-trading-assistant.form.marginMode': 'ไฟ่ญ‰้‡‘ๆจกๅผ', - 'ai-trading-assistant.form.marginModeCross': 'ๅ…จๅ€‰', - 'ai-trading-assistant.form.marginModeIsolated': '้€ๅ€‰', - 'ai-analysis.title': '้‡ๅญไบคๆ˜“ๅผ•ๆ“Ž', - 'ai-analysis.system.online': 'ๅœจ็ทš', - 'ai-analysis.system.agents': 'ๆ™บ่ƒฝ้ซ”', - 'ai-analysis.system.active': 'ๆดป่บ', - 'ai-analysis.system.stage': '้šŽๆฎต', - 'ai-analysis.panel.roster': 'ๆ™บ่ƒฝ้ซ”้™ฃๅฎน', - 'ai-analysis.panel.thinking': 'ๆ€่€ƒไธญ...', - 'ai-analysis.panel.done': 'ๅฎŒๆˆ', - 'ai-analysis.panel.standby': 'ๅพ…ๆฉŸ', - 'ai-analysis.input.title': '้‡ๅญไบคๆ˜“ๅผ•ๆ“Ž', - 'ai-analysis.input.placeholder': '้ธๆ“‡็›ฎๆจ™่ณ‡็”ข (ๅฆ‚ BTC/USDT)', - 'ai-analysis.input.watchlist': '่‡ช้ธ่‚ก', - 'ai-analysis.input.start': '้–‹ๅง‹ๅˆ†ๆž', - 'ai-analysis.input.recent': 'ๆœ€่ฟ‘ไปปๅ‹™:', - 'ai-analysis.vis.stage': '้šŽๆฎต', - 'ai-analysis.vis.processing': '่™•็†ไธญ', - 'ai-analysis.result.complete': 'ๅˆ†ๆžๅฎŒๆˆ', - 'ai-analysis.result.signal': 'ๆœ€็ต‚ไฟก่™Ÿ', - 'ai-analysis.result.confidence': '็ฝฎไฟกๅบฆ:', - 'ai-analysis.result.new': 'ๆ–ฐๅˆ†ๆž', - 'ai-analysis.result.full': 'ๆŸฅ็œ‹ๅฎŒๆ•ดๅ ฑๅ‘Š', - 'ai-analysis.logs.title': '็ณป็ตฑๆ—ฅๅฟ—', - 'ai-analysis.modal.title': 'ๆฉŸๅฏ†ๅ ฑๅ‘Š', - 'ai-analysis.modal.fundamental': 'ๅŸบๆœฌ้ขๅˆ†ๆž', - 'ai-analysis.modal.technical': 'ๆŠ€่ก“้ขๅˆ†ๆž', - 'ai-analysis.modal.sentiment': 'ๆƒ…็ท’้ขๅˆ†ๆž', - 'ai-analysis.modal.risk': '้ขจ้šช่ฉ•ไผฐ', - 'ai-analysis.stage.idle': 'ๅพ…ๆฉŸ', - 'ai-analysis.stage.1': '็ฌฌไธ€้šŽๆฎต๏ผšๅคš็ถญๅˆ†ๆž', - 'ai-analysis.stage.2': '็ฌฌไบŒ้šŽๆฎต๏ผšๅคš็ฉบ่พฏ่ซ–', - 'ai-analysis.stage.3': '็ฌฌไธ‰้šŽๆฎต๏ผšๆˆฐ็•ฅ่ฆๅŠƒ', - 'ai-analysis.stage.4': '็ฌฌๅ››้šŽๆฎต๏ผš้ขจๆŽงๅฏฉๆŸฅ', - 'ai-analysis.stage.complete': 'ๅฎŒๆˆ', - 'ai-analysis.agent.investment_director': 'ๆŠ•่ณ‡็ธฝ็›ฃ', - 'ai-analysis.agent.role.investment_director': '็ถœๅˆๅˆ†ๆž & ๆœ€็ต‚็ต่ซ–', - 'ai-analysis.agent.market': 'ๅธ‚ๅ ดๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.market': 'ๆŠ€่ก“ & ๅธ‚ๅ ดๆ•ธๆ“š', - 'ai-analysis.agent.fundamental': 'ๅŸบๆœฌ้ขๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.fundamental': '่ฒกๅ‹™ & ไผฐๅ€ผ', - 'ai-analysis.agent.technical': 'ๆŠ€่ก“ๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.technical': 'ๆŠ€่ก“ๆŒ‡ๆจ™ & ๅœ–่กจ', - 'ai-analysis.agent.news': 'ๆ–ฐ่žๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.news': 'ๅ…จ็ƒๆ–ฐ่ž้Žๆฟพ', - 'ai-analysis.agent.sentiment': 'ๆƒ…็ท’ๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.sentiment': '็คพไบค & ๆƒ…็ท’', - 'ai-analysis.agent.risk': '้ขจ้šชๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.risk': 'ๅŸบ็คŽ้ขจ้šชๆชขๆŸฅ', - 'ai-analysis.agent.bull': '็œ‹ๆผฒ็ ”็ฉถๅ“ก', - 'ai-analysis.agent.role.bull': 'ๅขž้•ทๅ‚ฌๅŒ–ๅŠ‘ๆŒ–ๆŽ˜', - 'ai-analysis.agent.bear': '็œ‹่ทŒ็ ”็ฉถๅ“ก', - 'ai-analysis.agent.role.bear': '้ขจ้šช & ็ผบ้™ทๆŒ–ๆŽ˜', - 'ai-analysis.agent.manager': '็ ”็ฉถ็ถ“็†', - 'ai-analysis.agent.role.manager': '่พฏ่ซ–ไธปๆŒไบบ', - 'ai-analysis.agent.trader': 'ไบคๆ˜“ๅ“ก', - 'ai-analysis.agent.role.trader': 'ๅŸท่กŒ็ญ–็•ฅๅธซ', - 'ai-analysis.agent.risky': 'ๆฟ€้€ฒๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.risky': 'ๆฟ€้€ฒ็ญ–็•ฅ', - 'ai-analysis.agent.neutral': 'ๅนณ่กกๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.neutral': 'ๅนณ่กก็ญ–็•ฅ', - 'ai-analysis.agent.safe': 'ไฟๅฎˆๅˆ†ๆžๅธซ', - 'ai-analysis.agent.role.safe': 'ไฟๅฎˆ็ญ–็•ฅ', - 'ai-analysis.agent.cro': '้ขจๆŽง็ถ“็† (CRO)', - 'ai-analysis.agent.role.cro': 'ๆœ€็ต‚ๆฑบ็ญ–ๆฌŠๅจ', - 'ai-analysis.script.market': 'ๆญฃๅœจๅพžไธป่ฆไบคๆ˜“ๆ‰€็ฒๅ– OHLCV ๆ•ธๆ“š...', - 'ai-analysis.script.fundamental': 'ๆญฃๅœจๆชข็ดขๅญฃๅบฆ่ฒกๅ‹™ๅ ฑๅ‘Š...', - 'ai-analysis.script.technical': 'ๆญฃๅœจๅˆ†ๆžๆŠ€่ก“ๆŒ‡ๆจ™ๅ’Œๅœ–่กจๅฝขๆ…‹...', - 'ai-analysis.script.news': 'ๆญฃๅœจๆŽƒๆๅ…จ็ƒ่ฒก็ถ“ๆ–ฐ่ž...', - 'ai-analysis.script.sentiment': 'ๆญฃๅœจๅˆ†ๆž็คพไบคๅช’้ซ”่ถจๅ‹ข...', - 'ai-analysis.script.risk': 'ๆญฃๅœจ่จˆ็ฎ—ๆญทๅฒๆณขๅ‹•็އ...', - 'invite.inviteLink': '้‚€่ซ‹้ˆๆŽฅ', - 'invite.copy': 'ๅพฉๅˆถ้ˆๆŽฅ', - 'invite.copySuccess': 'ๅพฉๅˆถๆˆๅŠŸ๏ผ', - 'invite.copyFailed': 'ๅพฉๅˆถๅคฑๆ•—๏ผŒ่ซ‹ๆ‰‹ๅ‹•ๅพฉๅˆถ', - 'invite.noInviteLink': '้‚€่ซ‹้ˆๆŽฅๆœช็”Ÿๆˆ', - 'invite.totalInvites': '็ดฏ่จˆ้‚€่ซ‹', - 'invite.totalReward': '็ดฏ่จˆ็Žๅ‹ต', - 'invite.rules': '้‚€่ซ‹่ฆๅ‰‡', - 'invite.rule1': 'ๆฏๆˆๅŠŸ้‚€่ซ‹ไธ€ไฝๅฅฝๅ‹ๆณจๅ†Š๏ผŒๆ‚จๅฐ‡็ฒๅพ—็Žๅ‹ต', - 'invite.rule2': '่ขซ้‚€่ซ‹็š„ๅฅฝๅ‹ๅฎŒๆˆ้ฆ–ๆฌกไบคๆ˜“๏ผŒๆ‚จๅฐ‡็ฒๅพ—้กๅค–็Žๅ‹ต', - 'invite.rule3': '้‚€่ซ‹็Žๅ‹ตๅฐ‡็›ดๆŽฅ็™ผๆ”พๅˆฐๆ‚จ็š„่ณฌๆˆถ', - 'invite.inviteList': '้‚€่ซ‹ๅˆ—่กจ', - 'invite.tasks': 'ไปปๅ‹™ไธญๅฟƒ', - 'invite.inviteeName': '่ขซ้‚€่ซ‹ไบบ', - 'invite.inviteTime': '้‚€่ซ‹ๆ™‚้–“', - 'invite.status': '็‹€ๆ…‹', - 'invite.reward': '็Žๅ‹ต', - 'invite.active': 'ๆดป่บ', - 'invite.inactive': 'ๆœชๆฟ€ๆดป', - 'invite.completed': 'ๅทฒๅฎŒๆˆ', - 'invite.claimed': 'ๅทฒ้ ˜ๅ–', - 'invite.pending': 'ๅพ…ๅฎŒๆˆ', - 'invite.goToTask': 'ๅŽปๅฎŒๆˆ', - 'invite.claimReward': '้ ˜ๅ–็Žๅ‹ต', - 'invite.verify': '้ฉ—่ญ‰ๅฎŒๆˆ', - 'invite.verifySuccess': '้ฉ—่ญ‰ๆˆๅŠŸ๏ผไปปๅ‹™ๅทฒๅฎŒๆˆ', - 'invite.verifyNotCompleted': 'ไปปๅ‹™ๅฐšๆœชๅฎŒๆˆ๏ผŒ่ซ‹ๅ…ˆๅฎŒๆˆไปปๅ‹™', - 'invite.verifyFailed': '้ฉ—่ญ‰ๅคฑๆ•—๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'invite.claimSuccess': 'ๆˆๅŠŸ้ ˜ๅ– {reward} QDT๏ผ', - 'invite.claimFailed': '้ ˜ๅ–ๅคฑๆ•—๏ผŒ่ซ‹็จๅพŒ้‡่ฉฆ', - 'invite.totalRecords': 'ๅ…ฑ {total} ๆข่จ˜้Œ„', - 'invite.task.twitter.title': '่ฝ‰็™ผๆŽจๆ–‡ๅˆฐ X (Twitter)', - 'invite.task.twitter.desc': 'ๅˆ†ไบซๆˆ‘ๅ€‘็š„ๅฎ˜ๆ–นๆŽจๆ–‡ๅˆฐๆ‚จ็š„ X (Twitter) ่ณฌ่™Ÿ', - 'invite.task.youtube.title': '้—œๆณจๆˆ‘ๅ€‘็š„ YouTube ้ ป้“', - 'invite.task.youtube.desc': '่จ‚้–ฑไธฆ้—œๆณจๆˆ‘ๅ€‘็š„ YouTube ๅฎ˜ๆ–น้ ป้“', - 'invite.task.telegram.title': 'ๅŠ ๅ…ฅ Telegram ็พฃ็ต„', - 'invite.task.telegram.desc': 'ๅŠ ๅ…ฅๆˆ‘ๅ€‘็š„ๅฎ˜ๆ–น Telegram ็คพๅ€็พฃ็ต„', - 'invite.task.discord.title': 'ๅŠ ๅ…ฅ Discord ๆœๅ‹™ๅ™จ', - 'invite.task.discord.desc': 'ๅŠ ๅ…ฅๆˆ‘ๅ€‘็š„ Discord ็คพๅ€ๆœๅ‹™ๅ™จ', - 'message': '-', - 'layouts.usermenu.dialog.title': 'ไฟกๆฏ', - 'layouts.usermenu.dialog.content': 'ๆ‚จ็ขบๅฎš่ฆๆณจ้Šทๅ—Ž๏ผŸ', - 'layouts.userLayout.title': 'ๆ–ผไธ็ขบๅฎšไธญ๏ผŒๅฐ‹่ฆ‹็œŸ็†', - - // Settings - 'settings.title': '็ณป็ตฑ่จญ็ฝฎ', - 'settings.description': '้…็ฝฎๆ‡‰็”จ่จญ็ฝฎใ€APIๅฏ†้‘ฐๅ’Œ็ณป็ตฑๅๅฅฝ', - 'settings.save': 'ไฟๅญ˜่จญ็ฝฎ', - 'settings.reset': '้‡็ฝฎ', - 'settings.saveSuccess': '่จญ็ฝฎไฟๅญ˜ๆˆๅŠŸ', - 'settings.saveFailed': 'ไฟๅญ˜่จญ็ฝฎๅคฑๆ•—', - 'settings.loadFailed': 'ๅŠ ่ผ‰้…็ฝฎๅคฑๆ•—', - 'settings.openrouterBalance': 'OpenRouter ่ณฌๆˆถ้ค˜้ก', - 'settings.queryBalance': 'ๆŸฅ่ฉข้ค˜้ก', - 'settings.balanceUsage': 'ๅทฒไฝฟ็”จ', - 'settings.balanceRemaining': 'ๅ‰ฉ้ค˜้กๅบฆ', - 'settings.balanceLimit': '็ธฝ้™้ก', - 'settings.balanceQuerySuccess': '้ค˜้กๆŸฅ่ฉขๆˆๅŠŸ', - 'settings.balanceQueryFailed': '้ค˜้กๆŸฅ่ฉขๅคฑๆ•—', - 'settings.balanceNotQueried': '้ปžๆ“Š"ๆŸฅ่ฉข้ค˜้ก"็ฒๅ–่ณฌๆˆถไฟกๆฏ', - 'settings.default': '้ป˜่ช', - 'settings.pleaseSelect': '่ซ‹้ธๆ“‡', - 'settings.inputApiKey': '่ซ‹่ผธๅ…ฅๅฏ†้‘ฐ', - 'settings.getApi': '็ฒๅ–API', - // Settings link texts - 'settings.link.getApi': '็ฒๅ–API', - 'settings.link.getApiKey': '็ฒๅ–API Key', - 'settings.link.getToken': '็ฒๅ–Token', - 'settings.link.createBot': 'ๅ‰ตๅปบBot', - 'settings.link.viewModels': 'ๆŸฅ็œ‹ๆจกๅž‹ๅˆ—่กจ', - 'settings.link.freeRegister': 'ๅ…่ฒป่จปๅ†Š', - 'settings.link.supportedExchanges': 'ๆ”ฏๆŒ็š„ไบคๆ˜“ๆ‰€', - 'settings.link.applyApi': '็”ณ่ซ‹API', - 'settings.link.createSearchEngine': 'ๅ‰ตๅปบๆœ็ดขๅผ•ๆ“Ž', - 'settings.link.getTurnstileKey': '็ฒๅ–Turnstileๅฏ†้‘ฐ', - 'settings.link.getGoogleCredentials': '็ฒๅ–Googleๆ†‘ๆ“š', - 'settings.link.getGithubCredentials': '็ฒๅ–GitHubๆ†‘ๆ“š', - 'settings.restartRequired': '้…็ฝฎๅทฒไฟๅญ˜๏ผŒ้ƒจๅˆ†้…็ฝฎ้œ€่ฆ้‡ๅ•ŸPythonๆœๅ‹™ๆ‰่ƒฝ็”Ÿๆ•ˆ', - 'settings.copyRestartCmd': '่ค‡่ฃฝ้‡ๅ•Ÿๅ‘ฝไปค', - 'settings.copySuccess': '่ค‡่ฃฝๆˆๅŠŸ', - 'settings.copyFailed': '่ค‡่ฃฝๅคฑๆ•—', - // Settings groups - // Settings groups (ๆŒ‰ๅพŒ็ซฏ order ๆŽ’ๅบ) - 'settings.group.server': 'ๆœๅ‹™้…็ฝฎ', - 'settings.group.auth': 'ๅฎ‰ๅ…จ่ช่ญ‰', - 'settings.group.ai': 'AI/LLM้…็ฝฎ', - 'settings.group.trading': 'ๅฏฆ็›คไบคๆ˜“', - 'settings.group.strategy': '็ญ–็•ฅๅŸท่กŒ', - 'settings.group.data_source': 'ๆ•ธๆ“šๆบ', - 'settings.group.notification': '้€š็ŸฅๆŽจ้€', - 'settings.group.email': '้ƒตไปถ้…็ฝฎ', - 'settings.group.sms': '็Ÿญไฟก้…็ฝฎ', - 'settings.group.agent': 'AI Agent', - 'settings.group.network': '็ถฒ็ตกไปฃ็†', - 'settings.group.search': 'ๆœ็ดข้…็ฝฎ', - 'settings.group.security': '่จปๅ†Š่ˆ‡ๅฎ‰ๅ…จ', - 'settings.group.app': 'ๆ‡‰็”จ้…็ฝฎ', - // Settings fields - Auth - 'settings.field.SECRET_KEY': 'Secret Key', - 'settings.field.ADMIN_USER': '็ฎก็†ๅ“ก็”จๆˆถๅ', - 'settings.field.ADMIN_PASSWORD': '็ฎก็†ๅ“กๅฏ†็ขผ', - 'settings.field.ADMIN_EMAIL': '็ฎก็†ๅ“ก้ƒต็ฎฑ', - // Settings fields - Security - 'settings.field.ENABLE_REGISTRATION': 'ๅ…่จฑ่จปๅ†Š', - 'settings.field.TURNSTILE_SITE_KEY': 'Turnstile Site Key', - 'settings.field.TURNSTILE_SECRET_KEY': 'Turnstile Secret Key', - 'settings.field.FRONTEND_URL': 'ๅ‰็ซฏURL', - 'settings.field.GOOGLE_CLIENT_ID': 'Google Client ID', - 'settings.field.GOOGLE_CLIENT_SECRET': 'Google Client Secret', - 'settings.field.GOOGLE_REDIRECT_URI': 'Googleๅ›ž่ชฟURL', - 'settings.field.GITHUB_CLIENT_ID': 'GitHub Client ID', - 'settings.field.GITHUB_CLIENT_SECRET': 'GitHub Client Secret', - 'settings.field.GITHUB_REDIRECT_URI': 'GitHubๅ›ž่ชฟURL', - 'settings.field.SECURITY_IP_MAX_ATTEMPTS': 'IPๆœ€ๅคงๅคฑๆ•—ๆฌกๆ•ธ', - 'settings.field.SECURITY_IP_WINDOW_MINUTES': 'IP็ตฑ่จˆ็ช—ๅฃ(ๅˆ†้˜)', - 'settings.field.SECURITY_IP_BLOCK_MINUTES': 'IPๅฐ็ฆๆ™‚้•ท(ๅˆ†้˜)', - 'settings.field.SECURITY_ACCOUNT_MAX_ATTEMPTS': 'ๅธณๆˆถๆœ€ๅคงๅคฑๆ•—ๆฌกๆ•ธ', - 'settings.field.SECURITY_ACCOUNT_WINDOW_MINUTES': 'ๅธณๆˆถ็ตฑ่จˆ็ช—ๅฃ(ๅˆ†้˜)', - 'settings.field.SECURITY_ACCOUNT_BLOCK_MINUTES': 'ๅธณๆˆถ้Ž–ๅฎšๆ™‚้•ท(ๅˆ†้˜)', - 'settings.field.VERIFICATION_CODE_EXPIRE_MINUTES': '้ฉ—่ญ‰็ขผๆœ‰ๆ•ˆๆœŸ(ๅˆ†้˜)', - 'settings.field.VERIFICATION_CODE_RATE_LIMIT': '้ฉ—่ญ‰็ขผ็™ผ้€้–“้š”(็ง’)', - 'settings.field.VERIFICATION_CODE_IP_HOURLY_LIMIT': 'IPๆฏๅฐๆ™‚้ฉ—่ญ‰็ขผไธŠ้™', - 'settings.field.VERIFICATION_CODE_MAX_ATTEMPTS': '้ฉ—่ญ‰็ขผๆœ€ๅคงๅ˜—่ฉฆๆฌกๆ•ธ', - 'settings.field.VERIFICATION_CODE_LOCK_MINUTES': '้ฉ—่ญ‰็ขผ้Ž–ๅฎšๆ™‚้•ท(ๅˆ†้˜)', - // Settings fields - Server - 'settings.field.PYTHON_API_HOST': '็›ฃ่ฝๅœฐๅ€', - 'settings.field.PYTHON_API_PORT': '็ซฏๅฃ', - 'settings.field.PYTHON_API_DEBUG': '่ชฟ่ฉฆๆจกๅผ', - // Settings fields - Worker - 'settings.field.ENABLE_PENDING_ORDER_WORKER': 'ๅ•Ÿ็”จ่จ‚ๅ–ฎ่™•็†Worker', - 'settings.field.PENDING_ORDER_STALE_SEC': '่จ‚ๅ–ฎ่ถ…ๆ™‚ๆ™‚้–“(็ง’)', - // Settings fields - Trading - 'settings.field.ORDER_MODE': 'ไธ‹ๅ–ฎๆจกๅผ', - 'settings.field.MAKER_WAIT_SEC': '้™ๅƒนๅ–ฎ็ญ‰ๅพ…ๆ™‚้–“(็ง’)', - 'settings.field.MAKER_OFFSET_BPS': '้™ๅƒนๅ–ฎๅƒนๆ ผๅ็งป(ๅŸบ้ปž)', - // Settings fields - Notification - 'settings.field.SIGNAL_WEBHOOK_URL': 'Webhook URL', - 'settings.field.SIGNAL_WEBHOOK_TOKEN': 'Webhook Token', - 'settings.field.SIGNAL_NOTIFY_TIMEOUT_SEC': '้€š็Ÿฅ่ถ…ๆ™‚(็ง’)', - 'settings.field.TELEGRAM_BOT_TOKEN': 'Telegram Bot Token', - // Settings fields - SMTP - 'settings.field.SMTP_HOST': 'SMTPๆœๅ‹™ๅ™จ', - 'settings.field.SMTP_PORT': 'SMTP็ซฏๅฃ', - 'settings.field.SMTP_USER': 'SMTP็”จๆˆถๅ', - 'settings.field.SMTP_PASSWORD': 'SMTPๅฏ†็ขผ', - 'settings.field.SMTP_FROM': '็™ผไปถไบบๅœฐๅ€', - 'settings.field.SMTP_USE_TLS': 'ไฝฟ็”จTLS', - 'settings.field.SMTP_USE_SSL': 'ไฝฟ็”จSSL', - // Settings fields - Twilio - 'settings.field.TWILIO_ACCOUNT_SID': 'Account SID', - 'settings.field.TWILIO_AUTH_TOKEN': 'Auth Token', - 'settings.field.TWILIO_FROM_NUMBER': '็™ผ้€่™Ÿ็ขผ', - // Settings fields - Strategy - 'settings.field.DISABLE_RESTORE_RUNNING_STRATEGIES': '็ฆ็”จ่‡ชๅ‹•ๆขๅพฉ็ญ–็•ฅ', - 'settings.field.STRATEGY_TICK_INTERVAL_SEC': '็ญ–็•ฅTick้–“้š”(็ง’)', - 'settings.field.PRICE_CACHE_TTL_SEC': 'ๅƒนๆ ผ็ทฉๅญ˜TTL(็ง’)', - // Settings fields - Proxy - 'settings.field.PROXY_PORT': 'ไปฃ็†็ซฏๅฃ', - 'settings.field.PROXY_HOST': 'ไปฃ็†ไธปๆฉŸ', - 'settings.field.PROXY_SCHEME': 'ไปฃ็†ๅ”่ญฐ', - 'settings.field.PROXY_URL': 'ๅฎŒๆ•ดไปฃ็†URL', - // Settings fields - App - 'settings.field.CORS_ORIGINS': 'CORSไพ†ๆบ', - 'settings.field.RATE_LIMIT': '้€Ÿ็އ้™ๅˆถ(ๆฏๅˆ†้˜)', - 'settings.field.ENABLE_CACHE': 'ๅ•Ÿ็”จ็ทฉๅญ˜', - 'settings.field.ENABLE_REQUEST_LOG': 'ๅ•Ÿ็”จ่ซ‹ๆฑ‚ๆ—ฅ่ชŒ', - 'settings.field.ENABLE_AI_ANALYSIS': 'ๅ•Ÿ็”จAIๅˆ†ๆž', - // Settings fields - ่จ˜ๆ†ถ/ๅๆ€ - 'settings.field.ENABLE_AGENT_MEMORY': 'ๅ•Ÿ็”จAgent่จ˜ๆ†ถ', - 'settings.field.AGENT_MEMORY_ENABLE_VECTOR': 'ๅ•Ÿ็”จๅ‘้‡ๆชข็ดข(ๆœฌๅœฐ)', - 'settings.field.AGENT_MEMORY_EMBEDDING_DIM': 'Embedding็ถญๅบฆ', - 'settings.field.AGENT_MEMORY_TOP_K': 'ๅฌๅ›žๆ•ธ้‡TopK', - 'settings.field.AGENT_MEMORY_CANDIDATE_LIMIT': 'ๅ€™้ธ็ช—ๅฃๅคงๅฐ', - 'settings.field.AGENT_MEMORY_HALF_LIFE_DAYS': 'ๆ™‚้–“่กฐๆธ›ๅŠ่กฐๆœŸ(ๅคฉ)', - 'settings.field.AGENT_MEMORY_W_SIM': '็›ธไผผๅบฆๆฌŠ้‡', - 'settings.field.AGENT_MEMORY_W_RECENCY': 'ๆ™‚้–“ๆฌŠ้‡', - 'settings.field.AGENT_MEMORY_W_RETURNS': 'ๆ”ถ็›ŠๆฌŠ้‡', - // Settings fields - ่‡ชๅ‹•ๅๆ€้ฉ—่ญ‰Worker - 'settings.field.ENABLE_REFLECTION_WORKER': 'ๅ•Ÿ็”จ่‡ชๅ‹•้ฉ—่ญ‰', - 'settings.field.REFLECTION_WORKER_INTERVAL_SEC': '้ฉ—่ญ‰ๅ‘จๆœŸ้–“้š”(็ง’)', - // Settings fields - AI - 'settings.field.OPENROUTER_API_KEY': 'OpenRouter API Key', - 'settings.field.OPENROUTER_API_URL': 'OpenRouter API URL', - 'settings.field.OPENROUTER_MODEL': '้ป˜่ชๆจกๅž‹', - 'settings.field.OPENROUTER_TEMPERATURE': 'Temperature', - 'settings.field.OPENROUTER_MAX_TOKENS': 'Max Tokens', - 'settings.field.OPENROUTER_TIMEOUT': '่ถ…ๆ™‚ๆ™‚้–“(็ง’)', - 'settings.field.OPENROUTER_CONNECT_TIMEOUT': '้€ฃๆŽฅ่ถ…ๆ™‚(็ง’)', - 'settings.field.AI_MODELS_JSON': 'ๆจกๅž‹ๅˆ—่กจ(JSON)', - // Settings fields - Market - 'settings.field.MARKET_TYPES_JSON': 'ๅธ‚ๅ ด้กžๅž‹(JSON)', - 'settings.field.TRADING_SUPPORTED_SYMBOLS_JSON': 'ๆ”ฏๆŒ็š„ไบคๆ˜“ๅฐ(JSON)', - // Settings fields - Data Source - 'settings.field.DATA_SOURCE_TIMEOUT': 'ๆ•ธๆ“šๆบ่ถ…ๆ™‚(็ง’)', - 'settings.field.DATA_SOURCE_RETRY': '้‡่ฉฆๆฌกๆ•ธ', - 'settings.field.DATA_SOURCE_RETRY_BACKOFF': '้‡่ฉฆ้€€้ฟ(็ง’)', - 'settings.field.FINNHUB_API_KEY': 'Finnhub API Key', - 'settings.field.FINNHUB_TIMEOUT': 'Finnhub่ถ…ๆ™‚(็ง’)', - 'settings.field.FINNHUB_RATE_LIMIT': 'Finnhub้€Ÿ็އ้™ๅˆถ', - 'settings.field.CCXT_DEFAULT_EXCHANGE': 'CCXT้ป˜่ชไบคๆ˜“ๆ‰€', - 'settings.field.CCXT_TIMEOUT': 'CCXT่ถ…ๆ™‚(ms)', - 'settings.field.CCXT_PROXY': 'CCXTไปฃ็†', - 'settings.field.AKSHARE_TIMEOUT': 'Akshare่ถ…ๆ™‚(็ง’)', - 'settings.field.YFINANCE_TIMEOUT': 'YFinance่ถ…ๆ™‚(็ง’)', - 'settings.field.TIINGO_API_KEY': 'Tiingo API Key', - 'settings.field.TIINGO_TIMEOUT': 'Tiingo่ถ…ๆ™‚(็ง’)', - // Settings fields - Search - 'settings.field.SEARCH_PROVIDER': 'ๆœ็ดขๆไพ›ๅ•†', - 'settings.field.SEARCH_MAX_RESULTS': 'ๆœ€ๅคง็ตๆžœๆ•ธ', - 'settings.field.SEARCH_GOOGLE_API_KEY': 'Google API Key', - 'settings.field.SEARCH_GOOGLE_CX': 'Google CX', - 'settings.field.SEARCH_BING_API_KEY': 'Bing API Key', - 'settings.field.INTERNAL_API_KEY': 'ๅ…ง้ƒจAPI Key', - - // Settings descriptions (้…็ฝฎ้ …่ชชๆ˜Ž) - 'settings.desc.PYTHON_API_HOST': 'ๆœๅ‹™็›ฃ่ฝๅœฐๅ€ใ€‚0.0.0.0 ๅ…่จฑๅค–้ƒจ่จชๅ•๏ผŒ127.0.0.1 ๅƒ…ๆœฌๅœฐ่จชๅ•', - 'settings.desc.PYTHON_API_PORT': 'ๆœๅ‹™็›ฃ่ฝ็ซฏๅฃ๏ผŒ้ป˜่ช5000', - 'settings.desc.PYTHON_API_DEBUG': 'ๅ•Ÿ็”จ่ชฟ่ฉฆๆจกๅผ๏ผŒ้–‹็™ผๆ™‚ไฝฟ็”จใ€‚็”Ÿ็”ข็’ฐๅขƒ่ซ‹้—œ้–‰', - 'settings.desc.SECRET_KEY': 'JWT็ฐฝๅๅฏ†้‘ฐใ€‚็”Ÿ็”ข็’ฐๅขƒๅฟ…้ ˆไฟฎๆ”นไปฅ็ขบไฟๅฎ‰ๅ…จ', - 'settings.desc.ADMIN_USER': '็ฎก็†ๅ“ก็™ป้Œ„็”จๆˆถๅ', - 'settings.desc.ADMIN_PASSWORD': '็ฎก็†ๅ“ก็™ป้Œ„ๅฏ†็ขผใ€‚็”Ÿ็”ข็’ฐๅขƒๅฟ…้ ˆไฟฎๆ”น', - 'settings.desc.OPENROUTER_API_KEY': 'OpenRouter APIๅฏ†้‘ฐ๏ผŒ็”จๆ–ผ่จชๅ•ๅคš็จฎAIๆจกๅž‹', - 'settings.desc.OPENROUTER_API_URL': 'OpenRouter API็ซฏ้ปžๅœฐๅ€', - 'settings.desc.OPENROUTER_MODEL': '้ป˜่ชไฝฟ็”จ็š„AIๆจกๅž‹๏ผŒๅฆ‚ openai/gpt-4o, anthropic/claude-3.5-sonnet', - 'settings.desc.OPENROUTER_TEMPERATURE': 'ๆจกๅž‹ๅ‰ต้€ ๆ€ง(0-1)ใ€‚่ถŠไฝŽ่ถŠ็ขบๅฎšๆ€ง๏ผŒ่ถŠ้ซ˜่ถŠๆœ‰ๅ‰ตๆ„', - 'settings.desc.OPENROUTER_MAX_TOKENS': 'ๆฏๆฌก่ซ‹ๆฑ‚ๆœ€ๅคง่ผธๅ‡บtokenๆ•ธ', - 'settings.desc.OPENROUTER_TIMEOUT': 'API่ซ‹ๆฑ‚่ถ…ๆ™‚ๆ™‚้–“๏ผˆ็ง’๏ผ‰', - 'settings.desc.OPENROUTER_CONNECT_TIMEOUT': '้€ฃๆŽฅๅปบ็ซ‹่ถ…ๆ™‚ๆ™‚้–“๏ผˆ็ง’๏ผ‰', - 'settings.desc.AI_MODELS_JSON': '่‡ชๅฎš็พฉๆจกๅž‹ๅˆ—่กจ๏ผŒJSONๆ ผๅผ๏ผŒ็”จๆ–ผๆจกๅž‹้ธๆ“‡ๅ™จ', - 'settings.desc.ENABLE_PENDING_ORDER_WORKER': 'ๅ•Ÿ็”จๅพŒๅฐ่จ‚ๅ–ฎ่™•็†Worker๏ผŒๅฏฆ็›คไบคๆ˜“ๅฟ…้œ€', - 'settings.desc.PENDING_ORDER_STALE_SEC': '็ญ‰ๅพ…่จ‚ๅ–ฎ่ถ…ๆ™‚ๆ™‚้–“๏ผŒ่ถ…ๆ™‚ๅพŒๆจ™่จ˜็‚บ้ŽๆœŸ', - 'settings.desc.ORDER_MODE': 'maker: ้™ๅƒนๅ–ฎๅ„ชๅ…ˆ(ๆ‰‹็บŒ่ฒปไฝŽ)๏ผŒmarket: ๅธ‚ๅƒนๅ–ฎ(็ซ‹ๅณๆˆไบค)', - 'settings.desc.MAKER_WAIT_SEC': '้™ๅƒนๅ–ฎ็ญ‰ๅพ…ๆˆไบคๆ™‚้–“๏ผŒ่ถ…ๆ™‚ๅพŒ่‡ชๅ‹•ๅˆ‡ๆ›็‚บๅธ‚ๅƒนๅ–ฎ', - 'settings.desc.MAKER_OFFSET_BPS': '้™ๅƒนๅ–ฎๅƒนๆ ผๅ็งป(ๅŸบ้ปž)ใ€‚่ฒทๅ…ฅๅƒน=ๅธ‚ๅƒน*(1-ๅ็งป)๏ผŒ่ณฃๅ‡บๅƒน=ๅธ‚ๅƒน*(1+ๅ็งป)', - 'settings.desc.DISABLE_RESTORE_RUNNING_STRATEGIES': '็ฆๆญขๆœๅ‹™้‡ๅ•Ÿๆ™‚่‡ชๅ‹•ๆขๅพฉ้‹่กŒไธญ็š„็ญ–็•ฅ', - 'settings.desc.STRATEGY_TICK_INTERVAL_SEC': '็ญ–็•ฅไธปๅพช็’ฐๆชขๆŸฅ้–“้š”๏ผˆ็ง’๏ผ‰', - 'settings.desc.PRICE_CACHE_TTL_SEC': 'ๅƒนๆ ผๆ•ธๆ“š็ทฉๅญ˜ๆœ‰ๆ•ˆๆœŸ๏ผˆ็ง’๏ผ‰', - 'settings.desc.MARKET_TYPES_JSON': '่‡ชๅฎš็พฉๅธ‚ๅ ด้กžๅž‹้…็ฝฎ๏ผŒJSONๆ ผๅผ', - 'settings.desc.TRADING_SUPPORTED_SYMBOLS_JSON': 'ๆ”ฏๆŒ็š„ไบคๆ˜“ๅฐๅˆ—่กจ๏ผŒJSONๆ ผๅผ', - 'settings.desc.DATA_SOURCE_TIMEOUT': 'ๆ•ธๆ“šๆบ่ซ‹ๆฑ‚้ป˜่ช่ถ…ๆ™‚ๆ™‚้–“', - 'settings.desc.DATA_SOURCE_RETRY': 'ๆ•ธๆ“šๆบ่ซ‹ๆฑ‚ๅคฑๆ•—ๆ™‚็š„้‡่ฉฆๆฌกๆ•ธ', - 'settings.desc.DATA_SOURCE_RETRY_BACKOFF': '้‡่ฉฆ้–“้š”ๆ™‚้–“๏ผˆ็ง’๏ผ‰', - 'settings.desc.CCXT_DEFAULT_EXCHANGE': 'CCXT้ป˜่ชไบคๆ˜“ๆ‰€๏ผˆbinance, coinbase, okx็ญ‰๏ผ‰', - 'settings.desc.CCXT_TIMEOUT': 'CCXT่ซ‹ๆฑ‚่ถ…ๆ™‚ๆ™‚้–“๏ผˆๆฏซ็ง’๏ผ‰', - 'settings.desc.CCXT_PROXY': 'CCXT่ซ‹ๆฑ‚ไปฃ็†ๅœฐๅ€๏ผˆๅฆ‚ socks5h://127.0.0.1:1080๏ผ‰', - 'settings.desc.FINNHUB_API_KEY': 'Finnhub APIๅฏ†้‘ฐ๏ผŒ็”จๆ–ผ็พŽ่‚กๆ•ธๆ“š๏ผˆๆœ‰ๅ…่ฒป้กๅบฆ๏ผ‰', - 'settings.desc.FINNHUB_TIMEOUT': 'Finnhub API่ซ‹ๆฑ‚่ถ…ๆ™‚ๆ™‚้–“', - 'settings.desc.FINNHUB_RATE_LIMIT': 'Finnhub API้€Ÿ็އ้™ๅˆถ๏ผˆๆฏๅˆ†้˜่ซ‹ๆฑ‚ๆ•ธ๏ผ‰', - 'settings.desc.TIINGO_API_KEY': 'Tiingo APIๅฏ†้‘ฐ๏ผŒ็”จๆ–ผๅค–ๅŒฏ/่ฒด้‡‘ๅฑฌๆ•ธๆ“š๏ผˆๅ…่ฒป็‰ˆไธๆ”ฏๆŒ1ๅˆ†้˜ๆ•ธๆ“š๏ผ‰', - 'settings.desc.TIINGO_TIMEOUT': 'Tiingo API่ซ‹ๆฑ‚่ถ…ๆ™‚ๆ™‚้–“', - 'settings.desc.AKSHARE_TIMEOUT': 'Akshare API่ถ…ๆ™‚ๆ™‚้–“๏ผŒ็”จๆ–ผA่‚กๆ•ธๆ“š', - 'settings.desc.YFINANCE_TIMEOUT': 'Yahoo Finance API่ถ…ๆ™‚ๆ™‚้–“', - 'settings.desc.SIGNAL_WEBHOOK_URL': 'ไฟก่™Ÿ้€š็ŸฅWebhookๅœฐๅ€๏ผˆPOST JSON๏ผ‰', - 'settings.desc.SIGNAL_WEBHOOK_TOKEN': 'Webhook่ช่ญ‰ไปค็‰Œ๏ผŒ้€š้Ž่ซ‹ๆฑ‚้ ญ็™ผ้€', - 'settings.desc.SIGNAL_NOTIFY_TIMEOUT_SEC': '้€š็Ÿฅ่ซ‹ๆฑ‚่ถ…ๆ™‚ๆ™‚้–“', - 'settings.desc.TELEGRAM_BOT_TOKEN': 'TelegramๆฉŸๅ™จไบบToken๏ผŒๅพž@BotFather็ฒๅ–', - 'settings.desc.SMTP_HOST': 'SMTP้ƒตไปถๆœๅ‹™ๅ™จๅœฐๅ€๏ผˆๅฆ‚ smtp.gmail.com๏ผ‰', - 'settings.desc.SMTP_PORT': 'SMTP็ซฏๅฃ๏ผˆTLS็”จ587๏ผŒSSL็”จ465๏ผŒๆ˜Žๆ–‡็”จ25๏ผ‰', - 'settings.desc.SMTP_USER': 'SMTP่ช่ญ‰็”จๆˆถๅ๏ผˆ้€šๅธธๆ˜ฏ้ƒต็ฎฑๅœฐๅ€๏ผ‰', - 'settings.desc.SMTP_PASSWORD': 'SMTP่ช่ญ‰ๅฏ†็ขผๆˆ–ๆ‡‰็”จๅฐˆ็”จๅฏ†็ขผ', - 'settings.desc.SMTP_FROM': '้ƒตไปถ็™ผไปถไบบๅœฐๅ€', - 'settings.desc.SMTP_USE_TLS': 'ๅ•Ÿ็”จSTARTTLSๅŠ ๅฏ†๏ผˆๆŽจ่–ฆ็ซฏๅฃ587๏ผ‰', - 'settings.desc.SMTP_USE_SSL': 'ๅ•Ÿ็”จSSLๅŠ ๅฏ†๏ผˆ็ซฏๅฃ465๏ผ‰', - 'settings.desc.TWILIO_ACCOUNT_SID': 'Twilio่ณฌๆˆถSID๏ผŒๅพžๆŽงๅˆถๅฐ็ฒๅ–', - 'settings.desc.TWILIO_AUTH_TOKEN': 'Twilio่ช่ญ‰Token๏ผŒๅพžๆŽงๅˆถๅฐ็ฒๅ–', - 'settings.desc.TWILIO_FROM_NUMBER': 'Twilio็™ผ้€็Ÿญไฟก็š„่™Ÿ็ขผ๏ผˆๅฆ‚ +1234567890๏ผ‰', - 'settings.desc.ENABLE_AGENT_MEMORY': 'ๅ•Ÿ็”จAI Agent่จ˜ๆ†ถๅŠŸ่ƒฝ๏ผŒ็”จๆ–ผๅญธ็ฟ’ๆญทๅฒไบคๆ˜“', - 'settings.desc.AGENT_MEMORY_ENABLE_VECTOR': 'ๅ•Ÿ็”จๆœฌๅœฐๅ‘้‡็›ธไผผๅบฆๆœ็ดข้€ฒ่กŒ่จ˜ๆ†ถๆชข็ดข', - 'settings.desc.AGENT_MEMORY_EMBEDDING_DIM': '่จ˜ๆ†ถๅ‘้‡ๅตŒๅ…ฅ็ถญๅบฆ', - 'settings.desc.AGENT_MEMORY_TOP_K': 'ๆชข็ดขๆ™‚่ฟ”ๅ›ž็š„็›ธไผผ่จ˜ๆ†ถๆ•ธ้‡', - 'settings.desc.AGENT_MEMORY_CANDIDATE_LIMIT': '็›ธไผผๅบฆๆœ็ดข็š„ๅ€™้ธ่จ˜ๆ†ถไธŠ้™', - 'settings.desc.AGENT_MEMORY_HALF_LIFE_DAYS': '่จ˜ๆ†ถๆ™‚้–“่กฐๆธ›็š„ๅŠ่กฐๆœŸ๏ผˆๅคฉ๏ผ‰', - 'settings.desc.AGENT_MEMORY_W_SIM': '่จ˜ๆ†ถๆŽ’ๅบไธญ็›ธไผผๅบฆๅˆ†ๆ•ธ็š„ๆฌŠ้‡(0-1)', - 'settings.desc.AGENT_MEMORY_W_RECENCY': '่จ˜ๆ†ถๆŽ’ๅบไธญๆ™‚้–“ๆ–ฐ่ฟ‘ๅบฆ็š„ๆฌŠ้‡(0-1)', - 'settings.desc.AGENT_MEMORY_W_RETURNS': '่จ˜ๆ†ถๆŽ’ๅบไธญๆ”ถ็›Š่กจ็พ็š„ๆฌŠ้‡(0-1)', - 'settings.desc.ENABLE_REFLECTION_WORKER': 'ๅ•Ÿ็”จๅพŒๅฐ่‡ชๅ‹•ไบคๆ˜“ๅๆ€Worker', - 'settings.desc.REFLECTION_WORKER_INTERVAL_SEC': '่‡ชๅ‹•ๅๆ€้‹่กŒ้–“้š”๏ผˆ้ป˜่ช24ๅฐๆ™‚๏ผ‰', - 'settings.desc.PROXY_HOST': 'ไปฃ็†ๆœๅ‹™ๅ™จไธปๆฉŸๅๆˆ–IP', - 'settings.desc.PROXY_PORT': 'ไปฃ็†ๆœๅ‹™ๅ™จ็ซฏๅฃ๏ผˆ็•™็ฉบๅ‰‡็ฆ็”จไปฃ็†๏ผ‰', - 'settings.desc.PROXY_SCHEME': 'ไปฃ็†ๅ”่ญฐ้กžๅž‹ใ€‚socks5h ่กจ็คบDNSไนŸ่ตฐไปฃ็†', - 'settings.desc.PROXY_URL': 'ๅฎŒๆ•ดไปฃ็†URL๏ผˆ่จญ็ฝฎๅพŒ่ฆ†่“‹ไธŠ้ข็š„้…็ฝฎ๏ผ‰', - 'settings.desc.SEARCH_PROVIDER': '็ถฒ้ ๆœ็ดขๆไพ›ๅ•†๏ผŒ็”จๆ–ผAI็ ”็ฉถๅŠŸ่ƒฝ', - 'settings.desc.SEARCH_MAX_RESULTS': 'ๆœ็ดข่ฟ”ๅ›ž็š„ๆœ€ๅคง็ตๆžœๆ•ธ', - 'settings.desc.SEARCH_GOOGLE_API_KEY': 'Google่‡ชๅฎš็พฉๆœ็ดขAPIๅฏ†้‘ฐ', - 'settings.desc.SEARCH_GOOGLE_CX': 'Googleๅฏ็ทจ็จ‹ๆœ็ดขๅผ•ๆ“ŽID (CX)', - 'settings.desc.SEARCH_BING_API_KEY': 'Microsoft Bing็ถฒ้ ๆœ็ดขAPIๅฏ†้‘ฐ', - 'settings.desc.INTERNAL_API_KEY': 'ๅ…ง้ƒจAPI่ช่ญ‰ๅฏ†้‘ฐ๏ผŒ็”จๆ–ผๆœๅ‹™้–“่ชฟ็”จ', - 'settings.desc.CORS_ORIGINS': 'ๅ…่จฑ็š„CORSไพ†ๆบ๏ผˆ* ่กจ็คบๅ…จ้ƒจ๏ผŒๆˆ–้€—่™Ÿๅˆ†้š”็š„ๅˆ—่กจ๏ผ‰', - 'settings.desc.RATE_LIMIT': 'ๆฏIPๆฏๅˆ†้˜็š„API่ซ‹ๆฑ‚้™ๅˆถ', - 'settings.desc.ENABLE_CACHE': 'ๅ•Ÿ็”จ้Ÿฟๆ‡‰็ทฉๅญ˜ไปฅๆ้ซ˜ๆ€ง่ƒฝ', - 'settings.desc.ENABLE_REQUEST_LOG': '่จ˜้Œ„ๆ‰€ๆœ‰API่ซ‹ๆฑ‚ๆ—ฅ่ชŒ๏ผŒ็”จๆ–ผ่ชฟ่ฉฆ', - 'settings.desc.ENABLE_AI_ANALYSIS': 'ๅ•Ÿ็”จAI้ฉ…ๅ‹•็š„ๅธ‚ๅ ดๅˆ†ๆžๅŠŸ่ƒฝ', - - // Portfolio - ่ณ‡็”ข็›ฃๆธฌ - 'portfolio.summary.totalValue': '็ธฝๅธ‚ๅ€ผ', - 'portfolio.summary.totalCost': '็ธฝๆˆๆœฌ', - 'portfolio.summary.totalPnl': '็ธฝ็›ˆ่™ง', - 'portfolio.summary.positionCount': 'ๆŒๅ€‰ๆ•ธ้‡', - 'portfolio.summary.profitLossRatio': '็›ˆๅˆฉ/่™งๆ', - 'portfolio.summary.today': 'ไปŠๆ—ฅ', - 'portfolio.summary.todayPnl': 'ไปŠๆ—ฅ็›ˆ่™ง', - 'portfolio.summary.bestPerformer': 'ๆœ€ไฝณ่กจ็พ', - 'portfolio.summary.worstPerformer': 'ๆœ€ๅทฎ่กจ็พ', - 'portfolio.summary.priceSync': 'ๅƒนๆ ผๅŒๆญฅ', - 'portfolio.summary.syncInterval': 'ๅˆทๆ–ฐ้–“้š”', - 'portfolio.summary.justNow': 'ๅ‰›ๅ‰›', - 'portfolio.summary.ago': 'ๅ‰', - 'portfolio.positions.title': 'ๆˆ‘็š„ๆŒๅ€‰', - 'portfolio.positions.add': 'ๆทปๅŠ ๆŒๅ€‰', - 'portfolio.positions.addFirst': 'ๆทปๅŠ ็ฌฌไธ€็ญ†ๆŒๅ€‰', - 'portfolio.positions.empty': 'ๆšซ็„กๆŒๅ€‰่จ˜้Œ„', - 'portfolio.positions.deleteConfirm': '็ขบๅฎšๅˆช้™ค้€™็ญ†ๆŒๅ€‰ๅ—Ž๏ผŸ', - 'portfolio.positions.currentPrice': '็พๅƒน', - 'portfolio.positions.entryPrice': '่ฒทๅ…ฅๅƒน', - 'portfolio.positions.quantity': 'ๆ•ธ้‡', - 'portfolio.positions.side': 'ๆ–นๅ‘', - 'portfolio.positions.long': 'ๅšๅคš', - 'portfolio.positions.short': 'ๅš็ฉบ', - 'portfolio.positions.marketValue': 'ๅธ‚ๅ€ผ', - 'portfolio.positions.pnl': '็›ˆ่™ง', - 'portfolio.positions.items': 'ๅ€‹ๆŒๅ€‰', - 'portfolio.monitors.title': 'AI ็›ฃๆŽง', - 'portfolio.monitors.add': 'ๆทปๅŠ ็›ฃๆŽง', - 'portfolio.monitors.addFirst': 'ๆทปๅŠ  AI ็›ฃๆŽง', - 'portfolio.monitors.empty': 'ๆšซ็„ก็›ฃๆŽงไปปๅ‹™', - 'portfolio.monitors.deleteConfirm': '็ขบๅฎšๅˆช้™ค้€™ๅ€‹็›ฃๆŽงไปปๅ‹™ๅ—Ž๏ผŸ', - 'portfolio.monitors.interval': 'ๅŸท่กŒ้–“้š”', - 'portfolio.monitors.lastRun': 'ไธŠๆฌกๅŸท่กŒ', - 'portfolio.monitors.nextRun': 'ไธ‹ๆฌกๅŸท่กŒ', - 'portfolio.monitors.channels': '้€š็Ÿฅๆธ ้“', - 'portfolio.monitors.runNow': '็ซ‹ๅณๅŸท่กŒ', - 'portfolio.monitors.analysisResult': 'AI ๅˆ†ๆž็ตๆžœ', - 'portfolio.monitors.runningTitle': 'AI ๅˆ†ๆžๅทฒๅ•Ÿๅ‹•', - 'portfolio.monitors.runningDesc': 'ๅˆ†ๆžๆญฃๅœจๅพŒ่‡บ้‹่กŒ๏ผŒๅฎŒๆˆๅพŒๆœƒ้€š้Ž้€š็ŸฅๆŽจ้€็ตๆžœใ€‚ๅˆ†ๆžๅคšๅ€‹ๆŒๅ€‰ๅฏ่ƒฝ้œ€่ฆๅนพๅˆ†้˜ๆ™‚้–“ใ€‚', - 'portfolio.monitors.timeoutTitle': '่ซ‹ๆฑ‚่ถ…ๆ™‚', - 'portfolio.monitors.timeoutDesc': 'ๅˆ†ๆžๅฏ่ƒฝๆญฃๅœจๅพŒ่‡บ้‹่กŒไธญ๏ผŒ่ซ‹็จๅพŒๆŸฅ็œ‹้€š็Ÿฅ็ฒๅ–็ตๆžœใ€‚ๅฆ‚ๆžœ้•ทๆ™‚้–“ๆฒ’ๆœ‰ๆ”ถๅˆฐ้€š็Ÿฅ๏ผŒ่ซ‹้‡่ฉฆใ€‚', - 'portfolio.modal.addPosition': 'ๆทปๅŠ ๆŒๅ€‰', - 'portfolio.modal.editPosition': '็ทจ่ผฏๆŒๅ€‰', - 'portfolio.modal.addMonitor': 'ๆทปๅŠ ็›ฃๆŽง', - 'portfolio.modal.editMonitor': '็ทจ่ผฏ็›ฃๆŽง', - 'portfolio.form.market': 'ๅธ‚ๅ ด', - 'portfolio.form.marketRequired': '่ซ‹้ธๆ“‡ๅธ‚ๅ ด', - 'portfolio.form.selectMarket': '้ธๆ“‡ๅธ‚ๅ ด', - 'portfolio.form.symbol': 'ๆจ™็š„ไปฃ็ขผ', - 'portfolio.form.symbolRequired': '่ซ‹่ผธๅ…ฅๆจ™็š„ไปฃ็ขผ', - 'portfolio.form.searchSymbol': 'ๆœ็ดขๆˆ–่ผธๅ…ฅๆจ™็š„ไปฃ็ขผ', - 'portfolio.form.useAsSymbol': 'ไฝฟ็”จ', - 'portfolio.form.asSymbolCode': 'ไฝœ็‚บๆจ™็š„ไปฃ็ขผ', - 'portfolio.form.symbolHint': 'ๅฏๆœ็ดขๆจ™็š„ๅบซ๏ผŒๆˆ–็›ดๆŽฅ่ผธๅ…ฅไปปๆ„ไปฃ็ขผ', - 'portfolio.form.side': 'ๆ–นๅ‘', - 'portfolio.form.quantity': 'ๆ•ธ้‡', - 'portfolio.form.quantityRequired': '่ซ‹่ผธๅ…ฅๆ•ธ้‡', - 'portfolio.form.enterQuantity': '่ผธๅ…ฅๆŒๅ€‰ๆ•ธ้‡', - 'portfolio.form.entryPrice': '่ฒทๅ…ฅๅƒน', - 'portfolio.form.entryPriceRequired': '่ซ‹่ผธๅ…ฅ่ฒทๅ…ฅๅƒน', - 'portfolio.form.enterEntryPrice': '่ผธๅ…ฅ่ฒทๅ…ฅๅƒนๆ ผ', - 'portfolio.form.notes': 'ๅ‚™ๆณจ', - 'portfolio.form.enterNotes': 'ๅฏ้ธ๏ผšๆทปๅŠ ๅ‚™ๆณจ', - 'portfolio.form.monitorName': '็›ฃๆŽงๅ็จฑ', - 'portfolio.form.monitorNameRequired': '่ซ‹่ผธๅ…ฅ็›ฃๆŽงๅ็จฑ', - 'portfolio.form.enterMonitorName': 'ไพ‹ๅฆ‚๏ผšๆฏๆ—ฅ็ต„ๅˆๅˆ†ๆž', - 'portfolio.form.interval': 'ๅŸท่กŒ้–“้š”', - 'portfolio.form.minutes': 'ๅˆ†้˜', - 'portfolio.form.hour': 'ๅฐๆ™‚', - 'portfolio.form.hours': 'ๅฐๆ™‚', - 'portfolio.form.notifyChannels': '้€š็Ÿฅๆธ ้“', - 'portfolio.form.browser': '็€่ฆฝๅ™จ้€š็Ÿฅ', - 'portfolio.form.email': '้ƒตไปถ', - 'portfolio.form.telegramChatId': 'Telegram Chat ID', - 'portfolio.form.enterTelegramChatId': '่ผธๅ…ฅ Telegram Chat ID', - 'portfolio.form.telegramRequired': '่ซ‹่ผธๅ…ฅ Telegram Chat ID', - 'portfolio.form.emailAddress': '้ƒต็ฎฑๅœฐๅ€', - 'portfolio.form.enterEmail': '่ผธๅ…ฅ้ƒต็ฎฑๅœฐๅ€', - 'portfolio.form.emailRequired': '่ซ‹่ผธๅ…ฅ้ƒต็ฎฑๅœฐๅ€', - 'portfolio.form.emailInvalid': '่ซ‹่ผธๅ…ฅๆœ‰ๆ•ˆ็š„้ƒต็ฎฑๅœฐๅ€', - 'portfolio.form.customPrompt': '่‡ชๅฎš็พฉๆ็คบ', - 'portfolio.form.customPromptPlaceholder': 'ๅฏ้ธ๏ผšๆทปๅŠ ็‰นๅˆฅ้—œๆณจ้ปž๏ผŒไพ‹ๅฆ‚"้‡้ปž้—œๆณจ็ง‘ๆŠ€่‚ก้ขจ้šช"', - 'portfolio.form.monitorScope': '็›ฃๆŽง็ฏ„ๅœ', - 'portfolio.form.allPositions': 'ๅ…จ้ƒจๆŒๅ€‰', - 'portfolio.form.selectedPositions': 'ๆŒ‡ๅฎšๆŒๅ€‰', - 'portfolio.form.selectPositions': '้ธๆ“‡ๆŒๅ€‰', - 'portfolio.form.selectAll': 'ๅ…จ้ธ', - 'portfolio.form.deselectAll': 'ๅ…จไธ้ธ', - 'portfolio.form.selectedCount': 'ๅทฒ้ธ {count}/{total}', - 'portfolio.form.pleaseSelectPositions': '่ซ‹่‡ณๅฐ‘้ธๆ“‡ไธ€ๅ€‹ๆŒๅ€‰้€ฒ่กŒ็›ฃๆŽง', - 'portfolio.message.loadFailed': 'ๅŠ ่ผ‰ๆ•ธๆ“šๅคฑๆ•—', - 'portfolio.message.saveSuccess': 'ไฟๅญ˜ๆˆๅŠŸ', - 'portfolio.message.saveFailed': 'ไฟๅญ˜ๅคฑๆ•—', - 'portfolio.message.deleteSuccess': 'ๅˆช้™คๆˆๅŠŸ', - 'portfolio.message.deleteFailed': 'ๅˆช้™คๅคฑๆ•—', - 'portfolio.message.updateFailed': 'ๆ›ดๆ–ฐๅคฑๆ•—', - 'portfolio.message.monitorEnabled': '็›ฃๆŽงๅทฒๅ•Ÿ็”จ', - 'portfolio.message.monitorDisabled': '็›ฃๆŽงๅทฒๆšซๅœ', - 'portfolio.message.monitorRunSuccess': 'ๅˆ†ๆžๅฎŒๆˆ', - 'portfolio.message.monitorRunFailed': 'ๅˆ†ๆžๅคฑๆ•—', - 'portfolio.message.monitorRunning': 'AI ๅˆ†ๆžๅทฒๅ•Ÿๅ‹•๏ผŒ่ซ‹็ญ‰ๅพ…้€š็Ÿฅ', - // Portfolio - ๅˆ†็ต„ - 'portfolio.groups.all': 'ๅ…จ้ƒจๆŒๅ€‰', - 'portfolio.groups.ungrouped': 'ๆœชๅˆ†็ต„', - 'portfolio.form.group': 'ๅˆ†็ต„', - 'portfolio.form.enterGroup': '่ผธๅ…ฅๆˆ–้ธๆ“‡ๅˆ†็ต„', - // Portfolio - ้ ่ญฆ - 'portfolio.alerts.title': 'ๅƒนๆ ผ/็›ˆ่™ง้ ่ญฆ', - 'portfolio.alerts.addAlert': 'ๆทปๅŠ ้ ่ญฆ', - 'portfolio.alerts.editAlert': '็ทจ่ผฏ้ ่ญฆ', - 'portfolio.alerts.alertType': '้ ่ญฆ้กžๅž‹', - 'portfolio.alerts.priceAbove': 'ๅƒนๆ ผ้ซ˜ๆ–ผ', - 'portfolio.alerts.priceBelow': 'ๅƒนๆ ผไฝŽๆ–ผ', - 'portfolio.alerts.pnlAbove': '็›ˆๅˆฉ้ซ˜ๆ–ผ (%)', - 'portfolio.alerts.pnlBelow': '่™งๆไฝŽๆ–ผ (%)', - 'portfolio.alerts.threshold': '้–พๅ€ผ', - 'portfolio.alerts.thresholdRequired': '่ซ‹่ผธๅ…ฅ้–พๅ€ผ', - 'portfolio.alerts.enterPrice': '่ผธๅ…ฅๅƒนๆ ผ', - 'portfolio.alerts.enterPercent': '่ผธๅ…ฅ็™พๅˆ†ๆฏ”', - 'portfolio.alerts.currentPrice': '็•ถๅ‰ๅƒนๆ ผ', - 'portfolio.alerts.currentPriceHint': '็•ถๅ‰ๅƒนๆ ผ', - 'portfolio.alerts.repeatInterval': '้‡่ค‡ๆ้†’', - 'portfolio.alerts.noRepeat': 'ไธ้‡่ค‡ (่งธ็™ผไธ€ๆฌก)', - 'portfolio.alerts.every5min': 'ๆฏ 5 ๅˆ†้˜', - 'portfolio.alerts.every15min': 'ๆฏ 15 ๅˆ†้˜', - 'portfolio.alerts.every30min': 'ๆฏ 30 ๅˆ†้˜', - 'portfolio.alerts.every1hour': 'ๆฏ 1 ๅฐๆ™‚', - 'portfolio.alerts.every4hours': 'ๆฏ 4 ๅฐๆ™‚', - 'portfolio.alerts.onceDaily': 'ๆฏๅคฉไธ€ๆฌก', - 'portfolio.alerts.enabled': 'ๅ•Ÿ็”จ้ ่ญฆ', - 'portfolio.alerts.enabledDesc': '้–‹ๅ•ŸๅพŒๅฐ‡่‡ชๅ‹•็›ฃๆธฌไธฆ่งธ็™ผ้€š็Ÿฅ', - 'portfolio.alerts.delete': 'ๅˆช้™ค', - 'portfolio.alerts.deleteConfirm': '็ขบๅฎš่ฆๅˆช้™คๆญค้ ่ญฆๅ—Ž๏ผŸ', - 'portfolio.modal.addAlert': 'ๆทปๅŠ ้ ่ญฆ', - 'portfolio.modal.editAlert': '็ทจ่ผฏ้ ่ญฆ', - - // User Management - 'menu.userManage': '็”จๆˆถ็ฎก็†', - 'menu.myProfile': 'ๅ€‹ไบบไธญๅฟƒ', - 'userManage.title': '็”จๆˆถ็ฎก็†', - 'userManage.searchPlaceholder': 'ๆœ็ดข็”จๆˆถๅ/้ƒต็ฎฑ/ๆšฑ็จฑ', - 'userManage.description': '็ฎก็†็ณป็ตฑ็”จๆˆถใ€่ง’่‰ฒๅ’ŒๆฌŠ้™', - 'userManage.createUser': 'ๅ‰ตๅปบ็”จๆˆถ', - 'userManage.editUser': '็ทจ่ผฏ็”จๆˆถ', - 'userManage.username': '็”จๆˆถๅ', - 'userManage.password': 'ๅฏ†็ขผ', - 'userManage.nickname': 'ๆšฑ็จฑ', - 'userManage.email': '้ƒต็ฎฑ', - 'userManage.role': '่ง’่‰ฒ', - 'userManage.status': '็‹€ๆ…‹', - 'userManage.lastLogin': 'ๆœ€ๅพŒ็™ป้Œ„', - 'userManage.active': 'ๅ•Ÿ็”จ', - 'userManage.disabled': '็ฆ็”จ', - 'userManage.neverLogin': 'ๅพžๆœช็™ป้Œ„', - 'userManage.usernameRequired': '่ซ‹่ผธๅ…ฅ็”จๆˆถๅ', - 'userManage.usernamePlaceholder': '่ผธๅ…ฅ็”จๆˆถๅ', - 'userManage.passwordRequired': '่ซ‹่ผธๅ…ฅๅฏ†็ขผ', - 'userManage.passwordPlaceholder': '่ผธๅ…ฅๅฏ†็ขผ๏ผˆ่‡ณๅฐ‘6ไฝ๏ผ‰', - 'userManage.passwordMin': 'ๅฏ†็ขผ่‡ณๅฐ‘6ๅ€‹ๅญ—็ฌฆ', - 'userManage.nicknamePlaceholder': '่ผธๅ…ฅๆšฑ็จฑ', - 'userManage.emailPlaceholder': '่ผธๅ…ฅ้ƒต็ฎฑ', - 'userManage.emailInvalid': '้ƒต็ฎฑๆ ผๅผไธๆญฃ็ขบ', - 'userManage.rolePlaceholder': '้ธๆ“‡่ง’่‰ฒ', - 'userManage.statusPlaceholder': '้ธๆ“‡็‹€ๆ…‹', - 'userManage.resetPassword': '้‡็ฝฎๅฏ†็ขผ', - 'userManage.resetPasswordWarning': 'ๆญคๆ“ไฝœๅฐ‡้‡็ฝฎ็”จๆˆถๅฏ†็ขผ', - 'userManage.newPassword': 'ๆ–ฐๅฏ†็ขผ', - 'userManage.newPasswordPlaceholder': '่ผธๅ…ฅๆ–ฐๅฏ†็ขผ', - 'userManage.confirmDelete': '็ขบๅฎš่ฆๅˆช้™คๆญค็”จๆˆถๅ—Ž๏ผŸ', - 'userManage.roleAdmin': '็ฎก็†ๅ“ก', - 'userManage.roleManager': '็ถ“็†', - 'userManage.roleUser': 'ๆ™ฎ้€š็”จๆˆถ', - 'userManage.roleViewer': '่จชๅฎข', - 'userManage.credits': '็ฉๅˆ†', - 'userManage.adjustCredits': '่ชฟๆ•ด็ฉๅˆ†', - 'userManage.setVip': '่จญ็ฝฎVIP', - 'userManage.currentCredits': '็•ถๅ‰็ฉๅˆ†', - 'userManage.newCredits': 'ๆ–ฐ็ฉๅˆ†', - 'userManage.enterCredits': '่ผธๅ…ฅๆ–ฐ็š„็ฉๅˆ†ๆ•ธ้‡', - 'userManage.creditsNonNegative': '็ฉๅˆ†ไธ่ƒฝ็‚บ่ฒ ๆ•ธ', - 'userManage.currentVip': '็•ถๅ‰VIP็‹€ๆ…‹', - 'userManage.vipActive': 'ๆœ‰ๆ•ˆ', - 'userManage.vipExpired': 'ๅทฒ้ŽๆœŸ', - 'userManage.vipDays': 'VIPๅคฉๆ•ธ', - 'userManage.vipExpiresAt': 'VIP้ŽๆœŸๆ™‚้–“', - 'userManage.cancelVip': 'ๅ–ๆถˆVIP', - 'userManage.days': 'ๅคฉ', - 'userManage.customDate': '่‡ชๅฎš็พฉๆ—ฅๆœŸ', - 'userManage.selectDate': '่ซ‹้ธๆ“‡ๆ—ฅๆœŸ', - 'userManage.remark': 'ๅ‚™ๆณจ', - 'userManage.remarkPlaceholder': 'ๅฏ้ธๅ‚™ๆณจ', - - // Profile - 'profile.title': 'ๅ€‹ไบบไธญๅฟƒ', - 'profile.description': '็ฎก็†ๆ‚จ็š„่ณฌๆˆถ่จญ็ฝฎๅ’Œๅๅฅฝ', - 'profile.basicInfo': 'ๅŸบๆœฌไฟกๆฏ', - 'profile.changePassword': 'ไฟฎๆ”นๅฏ†็ขผ', - 'profile.username': '็”จๆˆถๅ', - 'profile.nickname': 'ๆšฑ็จฑ', - 'profile.email': '้ƒต็ฎฑ', - 'profile.lastLogin': 'ๆœ€ๅพŒ็™ป้Œ„', - 'profile.nicknamePlaceholder': '่ผธๅ…ฅๆ‚จ็š„ๆšฑ็จฑ', - 'profile.emailPlaceholder': '่ผธๅ…ฅๆ‚จ็š„้ƒต็ฎฑ', - 'profile.emailInvalid': '้ƒต็ฎฑๆ ผๅผไธๆญฃ็ขบ', - 'profile.emailCannotChange': '่จปๅ†ŠๅพŒ้ƒต็ฎฑไธๅฏไฟฎๆ”น', - 'profile.passwordHint': 'ๅฏ†็ขผ่‡ณๅฐ‘้œ€่ฆ6ๅ€‹ๅญ—็ฌฆ', - 'profile.oldPassword': '็•ถๅ‰ๅฏ†็ขผ', - 'profile.newPassword': 'ๆ–ฐๅฏ†็ขผ', - 'profile.confirmPassword': '็ขบ่ชๅฏ†็ขผ', - 'profile.oldPasswordRequired': '่ซ‹่ผธๅ…ฅ็•ถๅ‰ๅฏ†็ขผ', - 'profile.oldPasswordPlaceholder': '่ผธๅ…ฅ็•ถๅ‰ๅฏ†็ขผ', - 'profile.newPasswordRequired': '่ซ‹่ผธๅ…ฅๆ–ฐๅฏ†็ขผ', - 'profile.newPasswordPlaceholder': '่ผธๅ…ฅๆ–ฐๅฏ†็ขผ', - 'profile.confirmPasswordRequired': '่ซ‹็ขบ่ชๆ–ฐๅฏ†็ขผ', - 'profile.confirmPasswordPlaceholder': 'ๅ†ๆฌก่ผธๅ…ฅๆ–ฐๅฏ†็ขผ', - 'profile.passwordMin': 'ๅฏ†็ขผ่‡ณๅฐ‘6ๅ€‹ๅญ—็ฌฆ', - 'profile.passwordMismatch': 'ๅ…ฉๆฌก่ผธๅ…ฅ็š„ๅฏ†็ขผไธไธ€่‡ด', - 'profile.credits.title': 'ๆˆ‘็š„็ฉๅˆ†', - 'profile.credits.unit': '็ฉๅˆ†', - 'profile.credits.recharge': '้–‹้€š/ๅ……ๅ€ผ', - 'profile.credits.vipExpires': 'VIPๆœ‰ๆ•ˆๆœŸ่‡ณ', - 'profile.credits.vipExpired': 'VIPๅทฒ้ŽๆœŸ', - 'profile.credits.noVip': '้žVIP็”จๆˆถ', - 'profile.credits.hint': 'ไฝฟ็”จAIๅˆ†ๆž็ญ‰ๅŠŸ่ƒฝๆœƒๆถˆ่€—็ฉๅˆ†๏ผŒVIP็”จๆˆถๅ…่ฒป', - 'profile.creditsLog': 'ๆถˆ่ฒป่จ˜้Œ„', - 'profile.creditsLog.time': 'ๆ™‚้–“', - 'profile.creditsLog.action': '้กžๅž‹', - 'profile.creditsLog.amount': '่ฎŠๅ‹•', - 'profile.creditsLog.balance': '้ค˜้ก', - 'profile.creditsLog.remark': 'ๅ‚™ๆณจ', - 'profile.creditsLog.actionConsume': 'ๆถˆ่ฒป', - 'profile.creditsLog.actionRecharge': 'ๅ……ๅ€ผ', - 'profile.creditsLog.actionAdjust': '่ชฟๆ•ด', - 'profile.creditsLog.actionRefund': '้€€ๆฌพ', - 'profile.creditsLog.actionVipGrant': 'VIPๆŽˆไบˆ', - 'profile.creditsLog.actionVipRevoke': 'VIPๅ–ๆถˆ', - 'profile.creditsLog.actionRegisterBonus': '่จปๅ†Š็Žๅ‹ต', - 'profile.creditsLog.actionReferralBonus': '้‚€่ซ‹็Žๅ‹ต', - 'profile.referral.title': '้‚€่ซ‹ๅฅฝๅ‹', - 'profile.referral.listTab': '้‚€่ซ‹ๅˆ—่กจ', - 'profile.referral.totalInvited': 'ๅทฒ้‚€่ซ‹', - 'profile.referral.bonusPerInvite': 'ๆฏ้‚€่ซ‹็ฒๅพ—', - 'profile.referral.yourLink': 'ๆ‚จ็š„้‚€่ซ‹้ˆๆŽฅ', - 'profile.referral.copyLink': '่ค‡่ฃฝ้ˆๆŽฅ', - 'profile.referral.linkCopied': '้‚€่ซ‹้ˆๆŽฅๅทฒ่ค‡่ฃฝ', - 'profile.referral.newUserBonus': 'ๆ–ฐ็”จๆˆถ่จปๅ†Š็ฒๅพ—', - 'profile.referral.user': '็”จๆˆถ', - 'profile.referral.registerTime': '่จปๅ†Šๆ™‚้–“', - 'profile.referral.noReferrals': 'ๆšซ็„ก้‚€่ซ‹่จ˜้Œ„', - 'profile.referral.shareNow': '็ซ‹ๅณๅˆ†ไบซ้‚€่ซ‹', - - // Profile - Notification Settings (้€š็Ÿฅ่จญๅฎš) - 'profile.notifications.title': '้€š็Ÿฅ่จญๅฎš', - 'profile.notifications.hint': '้…็ฝฎๆ‚จ็š„้ ่จญ้€š็Ÿฅๆ–นๅผ๏ผŒๅœจๅปบ็ซ‹่ณ‡็”ข็›ฃๆŽงๅ’Œ้ ่ญฆๆ™‚ๅฐ‡่‡ชๅ‹•ไฝฟ็”จ้€™ไบ›่จญๅฎš', - 'profile.notifications.defaultChannels': '้ ่จญ้€š็Ÿฅ็ฎก้“', - 'profile.notifications.browser': '็ซ™ๅ…ง้€š็Ÿฅ', - 'profile.notifications.email': '้ƒตไปถ', - 'profile.notifications.phone': '็ฐก่จŠ', - 'profile.notifications.telegramBotToken': 'Telegram Bot Token', - 'profile.notifications.telegramBotTokenPlaceholder': '่ซ‹่ผธๅ…ฅๆ‚จ็š„ Telegram Bot Token', - 'profile.notifications.telegramBotTokenHint': '้€้Ž @BotFather ๅปบ็ซ‹ๆฉŸๅ™จไบบๅ–ๅพ— Token', - 'profile.notifications.telegramChatId': 'Telegram Chat ID', - 'profile.notifications.telegramPlaceholder': '่ซ‹่ผธๅ…ฅๆ‚จ็š„ Telegram Chat ID๏ผˆๅฆ‚ 123456789๏ผ‰', - 'profile.notifications.telegramHint': '็™ผ้€ /start ็ตฆ @userinfobot ๅฏๅ–ๅพ—ๆ‚จ็š„ Chat ID', - 'profile.notifications.notifyEmail': '้€š็Ÿฅไฟก็ฎฑ', - 'profile.notifications.emailPlaceholder': 'ๆŽฅๆ”ถ้€š็Ÿฅ็š„ไฟก็ฎฑๅœฐๅ€', - 'profile.notifications.emailHint': '้ ่จญไฝฟ็”จๅธณๆˆถไฟก็ฎฑ๏ผŒๅฏ่จญๅฎšๅ…ถไป–ไฟก็ฎฑๆŽฅๆ”ถ้€š็Ÿฅ', - 'profile.notifications.phonePlaceholder': '่ซ‹่ผธๅ…ฅๆ‰‹ๆฉŸ่™Ÿ๏ผˆๅฆ‚ +886912345678๏ผ‰', - 'profile.notifications.phoneHint': '้œ€่ฆ็ฎก็†ๅ“ก้…็ฝฎ Twilio ๆœๅ‹™ๅพŒๆ‰่ƒฝไฝฟ็”จ็ฐก่จŠ้€š็Ÿฅ', - 'profile.notifications.discordWebhook': 'Discord Webhook', - 'profile.notifications.discordPlaceholder': 'https://discord.com/api/webhooks/...', - 'profile.notifications.discordHint': 'ๅœจ Discord ไผบๆœๅ™จ่จญๅฎšไธญๅปบ็ซ‹ Webhook', - 'profile.notifications.webhookUrl': 'Webhook URL', - 'profile.notifications.webhookPlaceholder': 'https://your-server.com/webhook', - 'profile.notifications.webhookHint': '่‡ช่จ‚ Webhook ๅœฐๅ€๏ผŒๅฐ‡ไปฅ POST JSON ๆ–นๅผๆŽจ้€้€š็Ÿฅ', - 'profile.notifications.webhookToken': 'Webhook Token๏ผˆๅฏ้ธ๏ผ‰', - 'profile.notifications.webhookTokenPlaceholder': '็”จๆ–ผ้ฉ—่ญ‰่ซ‹ๆฑ‚็š„ Bearer Token', - 'profile.notifications.webhookTokenHint': 'ๅฐ‡ไฝœ็‚บ Authorization: Bearer Token ๅ‚ณ้€ๅˆฐ Webhook', - 'profile.notifications.testBtn': '็™ผ้€ๆธฌ่ฉฆ้€š็Ÿฅ', - 'profile.notifications.saveSuccess': '้€š็Ÿฅ่จญๅฎšๅ„ฒๅญ˜ๆˆๅŠŸ', - 'profile.notifications.selectChannel': '่ซ‹่‡ณๅฐ‘้ธๆ“‡ไธ€ๅ€‹้€š็Ÿฅ็ฎก้“', - 'profile.notifications.fillTelegramToken': '่ซ‹ๅกซๅฏซ Telegram Bot Token', - 'profile.notifications.fillTelegram': '่ซ‹ๅกซๅฏซ Telegram Chat ID', - 'profile.notifications.fillEmail': '่ซ‹ๅกซๅฏซ้€š็Ÿฅไฟก็ฎฑ', - 'profile.notifications.testSent': 'ๆธฌ่ฉฆ้€š็Ÿฅๅทฒ็™ผ้€๏ผŒ่ซ‹ๆชขๆŸฅๆ‚จ็š„้€š็Ÿฅ็ฎก้“', - - // Settings - Billing - 'settings.group.billing': '่จˆ่ฒป้…็ฝฎ', - 'settings.field.BILLING_ENABLED': 'ๅ•Ÿ็”จ่จˆ่ฒป', - 'settings.field.BILLING_VIP_BYPASS': 'VIPๅ…่ฒป', - 'settings.field.BILLING_COST_AI_ANALYSIS': 'AIๅˆ†ๆžๆถˆ่€—', - 'settings.field.BILLING_COST_STRATEGY_RUN': '็ญ–็•ฅ้‹่กŒๆถˆ่€—', - 'settings.field.BILLING_COST_BACKTEST': 'ๅ›žๆธฌๆถˆ่€—', - 'settings.field.BILLING_COST_PORTFOLIO_MONITOR': 'Portfolio็›ฃๆŽงๆถˆ่€—', - 'settings.field.CREDITS_REGISTER_BONUS': '่จปๅ†Š็Žๅ‹ต', - 'settings.field.CREDITS_REFERRAL_BONUS': '้‚€่ซ‹็Žๅ‹ต', - 'settings.field.RECHARGE_TELEGRAM_URL': 'ๅ……ๅ€ผTelegram้ˆๆŽฅ', - 'settings.desc.BILLING_ENABLED': 'ๅ•Ÿ็”จ่จˆ่ฒป็ณป็ตฑใ€‚ๅ•Ÿ็”จๅพŒ๏ผŒ็”จๆˆถไฝฟ็”จๆŸไบ›ๅŠŸ่ƒฝ้œ€่ฆๆถˆ่€—็ฉๅˆ†', - 'settings.desc.BILLING_VIP_BYPASS': 'VIP็”จๆˆถๅœจๆœ‰ๆ•ˆๆœŸๅ…งๅฏๅ…่ฒปไฝฟ็”จๆ‰€ๆœ‰ไป˜่ฒปๅŠŸ่ƒฝ', - 'settings.desc.BILLING_COST_AI_ANALYSIS': 'ๆฏๆฌกAIๅˆ†ๆžๆถˆ่€—็š„็ฉๅˆ†ๆ•ธ', - 'settings.desc.BILLING_COST_STRATEGY_RUN': 'ๅ•Ÿๅ‹•็ญ–็•ฅๆ™‚ๆถˆ่€—็š„็ฉๅˆ†ๆ•ธ', - 'settings.desc.BILLING_COST_BACKTEST': 'ๆฏๆฌกๅ›žๆธฌๆถˆ่€—็š„็ฉๅˆ†ๆ•ธ', - 'settings.desc.BILLING_COST_PORTFOLIO_MONITOR': 'ๆฏๆฌกPortfolio AI็›ฃๆŽงๆถˆ่€—็š„็ฉๅˆ†ๆ•ธ', - 'settings.desc.CREDITS_REGISTER_BONUS': 'ๆ–ฐ็”จๆˆถ่จปๅ†Šๆ™‚็ฒๅพ—็š„็ฉๅˆ†็Žๅ‹ต', - 'settings.desc.CREDITS_REFERRAL_BONUS': '็”จๆˆถ้€š้Ž้‚€่ซ‹้ˆๆŽฅๆˆๅŠŸ้‚€่ซ‹ๆ–ฐ็”จๆˆถๆ™‚๏ผŒ้‚€่ซ‹ไบบ็ฒๅพ—็š„็ฉๅˆ†็Žๅ‹ต', - 'settings.desc.VERIFICATION_CODE_MAX_ATTEMPTS': '้ฉ—่ญ‰็ขผ้ฉ—่ญ‰ๅคฑๆ•—็š„ๆœ€ๅคงๅ˜—่ฉฆๆฌกๆ•ธ๏ผŒ่ถ…้ŽๅพŒๅฐ‡้Ž–ๅฎš', - 'settings.desc.VERIFICATION_CODE_LOCK_MINUTES': '้ฉ—่ญ‰็ขผ้ฉ—่ญ‰ๅคฑๆ•—ๆฌกๆ•ธ่ถ…้Ž้™ๅˆถๅพŒ็š„้Ž–ๅฎšๆ™‚้•ท๏ผˆๅˆ†้˜๏ผ‰', - 'settings.desc.RECHARGE_TELEGRAM_URL': '็”จๆˆถ้ปžๆ“Šๅ……ๅ€ผๆ™‚่ทณ่ฝ‰็š„Telegramๅฎขๆœ้ˆๆŽฅ' - } - -export default { - ...components, - ...locale -} diff --git a/quantdinger_vue/src/main.js b/quantdinger_vue/src/main.js deleted file mode 100644 index 608dc04..0000000 --- a/quantdinger_vue/src/main.js +++ /dev/null @@ -1,56 +0,0 @@ -// with polyfills -import 'core-js/stable' -import 'regenerator-runtime/runtime' - -import Vue from 'vue' -import App from './App.vue' -import router from './router' -import store from './store/' -import i18n from './locales' -import { VueAxios } from './utils/request' -import ProLayout, { PageHeaderWrapper } from '@ant-design-vue/pro-layout' -import themePluginConfig from '../config/themePluginConfig' - -// mock -// WARNING: `mockjs` NOT SUPPORT `IE` PLEASE DO NOT USE IN `production` ENV. -import './mock' - -import bootstrap from './core/bootstrap' -import './core/lazy_use' // use lazy load components -import './permission' // permission control -import './utils/filter' // global filter -import './global.less' // global style - -Vue.config.productionTip = false - -// Suppress noisy ResizeObserver loop errors (harmless in most cases on responsive layouts) -if (typeof window !== 'undefined') { - const ignoreResizeObserverError = (e) => { - const msg = (e && (e.reason && e.reason.message || e.message)) || '' - if (msg.includes('ResizeObserver loop') || msg.includes('ResizeObserver loop limit exceeded')) { - e.preventDefault && e.preventDefault() - e.stopImmediatePropagation && e.stopImmediatePropagation() - return false - } - } - window.addEventListener('error', ignoreResizeObserverError) - window.addEventListener('unhandledrejection', ignoreResizeObserverError) -} - -// mount axios to `Vue.$http` and `this.$http` -Vue.use(VueAxios) -// use pro-layout components -Vue.component('pro-layout', ProLayout) -Vue.component('page-container', PageHeaderWrapper) -Vue.component('page-header-wrapper', PageHeaderWrapper) - -window.umi_plugin_ant_themeVar = themePluginConfig.theme - -new Vue({ - router, - store, - i18n, - // init localstorage, vuex, Logo message - created: bootstrap, - render: h => h(App) -}).$mount('#app') diff --git a/quantdinger_vue/src/mock/index.js b/quantdinger_vue/src/mock/index.js deleted file mode 100644 index 70cfb24..0000000 --- a/quantdinger_vue/src/mock/index.js +++ /dev/null @@ -1,24 +0,0 @@ -import { isIE } from '@/utils/util' - -// ๆœฌๅœฐๅผ€ๅ‘ๅทฒๆœ‰ๅฎŒๆ•ดๅŽ็ซฏ API๏ผŒ็ฆ็”จ mock ไปฅ้ฟๅ…่ฏทๆฑ‚่ขซๆ‹ฆๆˆช -// ๅฆ‚้œ€ๅฏ็”จ mock๏ผŒๅฐ†ไธ‹้ข็š„ false ๆ”นไธบ true -const ENABLE_MOCK = false - -// ๅˆคๆ–ญ็Žฏๅขƒไธๆ˜ฏ prod ๆˆ–่€… preview ๆ˜ฏ true ๆ—ถ๏ผŒๅŠ ่ฝฝ mock ๆœๅŠก -if (ENABLE_MOCK && (process.env.NODE_ENV !== 'production' || process.env.VUE_APP_PREVIEW === 'true')) { - if (isIE()) { - } - // ไฝฟ็”จๅŒๆญฅๅŠ ่ฝฝไพ่ต– - // ้˜ฒๆญข vuex ไธญ็š„ GetInfo ๆ—ฉไบŽ mock ่ฟ่กŒ๏ผŒๅฏผ่‡ดๆ— ๆณ• mock ่ฏทๆฑ‚่ฟ”ๅ›ž็ป“ๆžœ - const Mock = require('mockjs2') - require('./services/auth') - require('./services/user') - require('./services/manage') - require('./services/other') - require('./services/tagCloud') - require('./services/article') - - Mock.setup({ - timeout: 800 // setter delay time - }) -} diff --git a/quantdinger_vue/src/mock/services/article.js b/quantdinger_vue/src/mock/services/article.js deleted file mode 100644 index 88e1fa1..0000000 --- a/quantdinger_vue/src/mock/services/article.js +++ /dev/null @@ -1,88 +0,0 @@ -import Mock from 'mockjs2' -import { builder, getQueryParameters } from '../util' - -const titles = [ - 'Alipay', - 'Angular', - 'Ant Design', - 'Ant Design Pro', - 'Bootstrap', - 'React', - 'Vue', - 'Webpack' -] - -const avatar = ['https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', - 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', - 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', - 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', - 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png' -] - -const covers = [ - 'https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png', - 'https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png', - 'https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png', - 'https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png' -] - -const owner = [ - 'ไป˜ๅฐๅฐ', - 'ๅดๅŠ ๅฅฝ', - 'ๅ‘จๆ˜Ÿๆ˜Ÿ', - 'ๆž—ไธœไธœ', - 'ๆ›ฒไธฝไธฝ' -] - -const content = 'ๆฎต่ฝ็คบๆ„๏ผš่š‚่š้‡‘ๆœ่ฎพ่ฎกๅนณๅฐ ant.design๏ผŒ็”จๆœ€ๅฐ็š„ๅทฅไฝœ้‡๏ผŒๆ— ็ผๆŽฅๅ…ฅ่š‚่š้‡‘ๆœ็”Ÿๆ€๏ผŒๆไพ›่ทจ่ถŠ่ฎพ่ฎกไธŽๅผ€ๅ‘็š„ไฝ“้ชŒ่งฃๅ†ณๆ–นๆกˆใ€‚่š‚่š้‡‘ๆœ่ฎพ่ฎกๅนณๅฐ ant.design๏ผŒ็”จๆœ€ๅฐ็š„ๅทฅไฝœ้‡๏ผŒๆ— ็ผๆŽฅๅ…ฅ่š‚่š้‡‘ๆœ็”Ÿๆ€๏ผŒๆไพ›่ทจ่ถŠ่ฎพ่ฎกไธŽๅผ€ๅ‘็š„ไฝ“้ชŒ่งฃๅ†ณๆ–นๆกˆใ€‚' -const description = 'ๅœจไธญๅฐไบงๅ“็š„็ ”ๅ‘่ฟ‡็จ‹ไธญ๏ผŒไผšๅ‡บ็ŽฐไธๅŒ็š„่ฎพ่ฎก่ง„่Œƒๅ’Œๅฎž็Žฐๆ–นๅผ๏ผŒไฝ†ๅ…ถไธญๅพ€ๅพ€ๅญ˜ๅœจๅพˆๅคš็ฑปไผผ็š„้กต้ขๅ’Œ็ป„ไปถ๏ผŒ่ฟ™ไบ›็ฑปไผผ็š„็ป„ไปถไผš่ขซๆŠฝ็ฆปๆˆไธ€ๅฅ—ๆ ‡ๅ‡†่ง„่Œƒใ€‚' -const href = 'https://ant.design' - -const article = (options) => { - const queryParameters = getQueryParameters(options) - if (queryParameters && !queryParameters.count) { - queryParameters.count = 5 - } - const data = [] - for (let i = 0; i < queryParameters.count; i++) { - const tmpKey = i + 1 - const num = parseInt(Math.random() * (4 + 1), 10) - data.push({ - id: tmpKey, - avatar: avatar[num], - owner: owner[num], - content: content, - star: Mock.mock('@integer(1, 999)'), - percent: Mock.mock('@integer(1, 999)'), - like: Mock.mock('@integer(1, 999)'), - message: Mock.mock('@integer(1, 999)'), - description: description, - href: href, - title: titles[ i % 8 ], - updatedAt: Mock.mock('@datetime'), - members: [ - { - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ZiESqWwCXBRQoaPONSJe.png', - name: 'ๆ›ฒไธฝไธฝ', - id: 'member1' - }, - { - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/tBOxZPlITHqwlGjsJWaF.png', - name: '็Ž‹ๆ˜ญๅ›', - id: 'member2' - }, - { - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/sBxjgqiuHMGRkIjqlQCd.png', - name: '่‘ฃๅจœๅจœ', - id: 'member3' - } - ], - activeUser: Math.ceil(Math.random() * 100000) + 100000, - newUser: Math.ceil(Math.random() * 1000) + 1000, - cover: parseInt(i / 4, 10) % 2 === 0 ? covers[i % 4] : covers[3 - (i % 4)] - }) - } - return builder(data) -} - -Mock.mock(/\/list\/article/, 'get', article) diff --git a/quantdinger_vue/src/mock/services/auth.js b/quantdinger_vue/src/mock/services/auth.js deleted file mode 100644 index 79fc155..0000000 --- a/quantdinger_vue/src/mock/services/auth.js +++ /dev/null @@ -1,49 +0,0 @@ -import Mock from 'mockjs2' -import { builder, getBody } from '../util' - -const username = ['admin', 'super'] -// ๅผบ็กฌ่ฆๆฑ‚ ant.design ็›ธๅŒๅฏ†็  -// '21232f297a57a5a743894a0e4a801fc3', -const password = ['8914de686ab28dc22f30d3d8e107ff6c', '21232f297a57a5a743894a0e4a801fc3'] // admin, ant.design - -const login = (options) => { - const body = getBody(options) - if (!username.includes(body.username) || !password.includes(body.password)) { - return builder({ isLogin: true }, '่ดฆๆˆทๆˆ–ๅฏ†็ ้”™่ฏฏ', 401) - } - - return builder({ - 'id': Mock.mock('@guid'), - 'name': Mock.mock('@name'), - 'username': 'admin', - 'password': '', - 'avatar': 'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png', - 'status': 1, - 'telephone': '', - 'lastLoginIp': '27.154.74.117', - 'lastLoginTime': 1534837621348, - 'creatorId': 'admin', - 'createTime': 1497160610259, - 'deleted': 0, - 'roleId': 'admin', - 'lang': 'zh-CN', - 'token': '4291d7da9005377ec9aec4a71ea837f' - }, '', 200, { 'Custom-Header': Mock.mock('@guid') }) -} - -const logout = () => { - return builder({}, '[ๆต‹่ฏ•ๆŽฅๅฃ] ๆณจ้”€ๆˆๅŠŸ') -} - -const smsCaptcha = () => { - return builder({ captcha: Mock.mock('@integer(10000, 99999)') }) -} - -const twofactor = () => { - return builder({ stepCode: Mock.mock('@integer(0, 1)') }) -} - -Mock.mock(/\/auth\/login/, 'post', login) -Mock.mock(/\/auth\/logout/, 'post', logout) -Mock.mock(/\/account\/sms/, 'post', smsCaptcha) -Mock.mock(/\/auth\/2step-code/, 'post', twofactor) diff --git a/quantdinger_vue/src/mock/services/manage.js b/quantdinger_vue/src/mock/services/manage.js deleted file mode 100644 index 10181ec..0000000 --- a/quantdinger_vue/src/mock/services/manage.js +++ /dev/null @@ -1,252 +0,0 @@ -import Mock from 'mockjs2' -import { builder, getQueryParameters } from '../util' - -const totalCount = 5701 - -const serverList = (options) => { - const parameters = getQueryParameters(options) - - const result = [] - const pageNo = parseInt(parameters.pageNo) - const pageSize = parseInt(parameters.pageSize) - const totalPage = Math.ceil(totalCount / pageSize) - const key = (pageNo - 1) * pageSize - const next = (pageNo >= totalPage ? (totalCount % pageSize) : pageSize) + 1 - - for (let i = 1; i < next; i++) { - const tmpKey = key + i - result.push({ - key: tmpKey, - id: tmpKey, - no: 'No ' + tmpKey, - description: '่ฟ™ๆ˜ฏไธ€ๆฎตๆ่ฟฐ', - callNo: Mock.mock('@integer(1, 999)'), - status: Mock.mock('@integer(0, 3)'), - updatedAt: Mock.mock('@datetime'), - editable: false - }) - } - - return builder({ - pageSize: pageSize, - pageNo: pageNo, - totalCount: totalCount, - totalPage: totalPage, - data: result - }) -} - -const projects = () => { - return builder({ - 'data': [{ - id: 1, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/WdGqmHpayyMjiEhcKoVE.png', - title: 'Alipay', - description: '้‚ฃๆ˜ฏไธ€็งๅ†…ๅœจ็š„ไธœ่ฅฟ๏ผŒ ไป–ไปฌๅˆฐ่พพไธไบ†๏ผŒไนŸๆ— ๆณ•่งฆๅŠ็š„', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 2, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/zOsKZmFRdUtvpqCImOVY.png', - title: 'Angular', - description: 'ๅธŒๆœ›ๆ˜ฏไธ€ไธชๅฅฝไธœ่ฅฟ๏ผŒไนŸ่ฎธๆ˜ฏๆœ€ๅฅฝ็š„๏ผŒๅฅฝไธœ่ฅฟๆ˜ฏไธไผšๆถˆไบก็š„', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 3, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/dURIMkkrRFpPgTuzkwnB.png', - title: 'Ant Design', - description: 'ๅŸŽ้•‡ไธญๆœ‰้‚ฃไนˆๅคš็š„้…’้ฆ†๏ผŒๅฅนๅดๅๅ่ตฐ่ฟ›ไบ†ๆˆ‘็š„้…’้ฆ†', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 4, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/sfjbOqnsXXJgNCjCzDBL.png', - title: 'Ant Design Pro', - description: '้‚ฃๆ—ถๅ€™ๆˆ‘ๅชไผšๆƒณ่‡ชๅทฑๆƒณ่ฆไป€ไนˆ๏ผŒไปŽไธๆƒณ่‡ชๅทฑๆ‹ฅๆœ‰ไป€ไนˆ', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 5, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/siCrBXXhmvTQGWPNLBow.png', - title: 'Bootstrap', - description: 'ๅ‡›ๅ†ฌๅฐ†่‡ณ', - status: 1, - updatedAt: '2018-07-26 00:00:00' - }, - { - id: 6, - cover: 'https://gw.alipayobjects.com/zos/rmsportal/ComBAopevLwENQdKWiIn.png', - title: 'Vue', - description: '็”Ÿๅ‘ฝๅฐฑๅƒไธ€็›’ๅทงๅ…‹ๅŠ›๏ผŒ็ป“ๆžœๅพ€ๅพ€ๅ‡บไบบๆ„ๆ–™', - status: 1, - updatedAt: '2018-07-26 00:00:00' - } - ], - 'pageSize': 10, - 'pageNo': 0, - 'totalPage': 6, - 'totalCount': 57 - }) -} - -const activity = () => { - return builder([{ - id: 1, - user: { - nickname: '@name', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' - }, - project: { - name: '็™ฝ้นญ้…ฑๆฒนๅผ€ๅ‘็ป„', - action: 'ๆ›ดๆ–ฐ', - event: '็•ช็ป„่ฎกๅˆ’' - }, - time: '2018-08-23 14:47:00' - }, - { - id: 1, - user: { - nickname: '่“่Ž“้…ฑ', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/jZUIxmJycoymBprLOUbT.png' - }, - project: { - name: '็™ฝ้นญ้…ฑๆฒนๅผ€ๅ‘็ป„', - action: 'ๆ›ดๆ–ฐ', - event: '็•ช็ป„่ฎกๅˆ’' - }, - time: '2018-08-23 09:35:37' - }, - { - id: 1, - user: { - nickname: '@name', - avatar: '@image(64x64)' - }, - project: { - name: '็™ฝ้นญ้…ฑๆฒนๅผ€ๅ‘็ป„', - action: 'ๅˆ›ๅปบ', - event: '็•ช็ป„่ฎกๅˆ’' - }, - time: '2017-05-27 00:00:00' - }, - { - id: 1, - user: { - nickname: 'ๆ›ฒไธฝไธฝ', - avatar: '@image(64x64)' - }, - project: { - name: '้ซ˜้€ผๆ ผ่ฎพ่ฎกๅคฉๅ›ข', - action: 'ๆ›ดๆ–ฐ', - event: 'ๅ…ญๆœˆ่ฟญไปฃ' - }, - time: '2018-08-23 14:47:00' - }, - { - id: 1, - user: { - nickname: '@name', - avatar: '@image(64x64)' - }, - project: { - name: '้ซ˜้€ผๆ ผ่ฎพ่ฎกๅคฉๅ›ข', - action: 'created', - event: 'ๅ…ญๆœˆ่ฟญไปฃ' - }, - time: '2018-08-23 14:47:00' - }, - { - id: 1, - user: { - nickname: 'ๆ›ฒไธฝไธฝ', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' - }, - project: { - name: '้ซ˜้€ผๆ ผ่ฎพ่ฎกๅคฉๅ›ข', - action: 'created', - event: 'ๅ…ญๆœˆ่ฟญไปฃ' - }, - time: '2018-08-23 14:47:00' - } - ]) -} - -const teams = () => { - return builder([{ - id: 1, - name: '็ง‘ๅญฆๆฌ็ –็ป„', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png' - }, - { - id: 2, - name: '็จ‹ๅบๅ‘˜ๆ—ฅๅธธ', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/cnrhVkzwxjPwAaCfPbdc.png' - }, - { - id: 1, - name: '่ฎพ่ฎกๅคฉๅ›ข', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/gaOngJwsRYRaVAuXXcmB.png' - }, - { - id: 1, - name: 'ไธญไบŒๅฐ‘ๅฅณๅ›ข', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png' - }, - { - id: 1, - name: '้ช—ไฝ ๅญฆ่ฎก็ฎ—ๆœบ', - avatar: 'https://gw.alipayobjects.com/zos/rmsportal/WhxKECPNujWoWEFNdnJE.png' - } - ]) -} - -const radar = () => { - return builder([{ - item: 'ๅผ•็”จ', - 'ไธชไบบ': 70, - 'ๅ›ข้˜Ÿ': 30, - '้ƒจ้—จ': 40 - }, - { - item: 'ๅฃ็ข‘', - 'ไธชไบบ': 60, - 'ๅ›ข้˜Ÿ': 70, - '้ƒจ้—จ': 40 - }, - { - item: 'ไบง้‡', - 'ไธชไบบ': 50, - 'ๅ›ข้˜Ÿ': 60, - '้ƒจ้—จ': 40 - }, - { - item: '่ดก็Œฎ', - 'ไธชไบบ': 40, - 'ๅ›ข้˜Ÿ': 50, - '้ƒจ้—จ': 40 - }, - { - item: '็ƒญๅบฆ', - 'ไธชไบบ': 60, - 'ๅ›ข้˜Ÿ': 70, - '้ƒจ้—จ': 40 - }, - { - item: 'ๅผ•็”จ', - 'ไธชไบบ': 70, - 'ๅ›ข้˜Ÿ': 50, - '้ƒจ้—จ': 40 - } - ]) -} - -Mock.mock(/\/service/, 'get', serverList) -Mock.mock(/\/list\/search\/projects/, 'get', projects) -Mock.mock(/\/workplace\/activity/, 'get', activity) -Mock.mock(/\/workplace\/teams/, 'get', teams) -Mock.mock(/\/workplace\/radar/, 'get', radar) diff --git a/quantdinger_vue/src/mock/services/other.js b/quantdinger_vue/src/mock/services/other.js deleted file mode 100644 index 56e2dd9..0000000 --- a/quantdinger_vue/src/mock/services/other.js +++ /dev/null @@ -1,973 +0,0 @@ -import Mock from 'mockjs2' -import { builder } from '../util' - -const orgTree = () => { - return builder([{ - 'key': 'key-01', - 'title': '็ ”ๅ‘ไธญๅฟƒ', - 'icon': 'mail', - 'children': [{ - 'key': 'key-01-01', - 'title': 'ๅŽ็ซฏ็ป„', - 'icon': null, - 'group': true, - children: [{ - 'key': 'key-01-01-01', - 'title': 'JAVA', - 'icon': null - }, - { - 'key': 'key-01-01-02', - 'title': 'PHP', - 'icon': null - }, - { - 'key': 'key-01-01-03', - 'title': 'Golang', - 'icon': null - } - ] - }, { - 'key': 'key-01-02', - 'title': 'ๅ‰็ซฏ็ป„', - 'icon': null, - 'group': true, - children: [{ - 'key': 'key-01-02-01', - 'title': 'React', - 'icon': null - }, - { - 'key': 'key-01-02-02', - 'title': 'Vue', - 'icon': null - }, - { - 'key': 'key-01-02-03', - 'title': 'Angular', - 'icon': null - } - ] - }] - }, { - 'key': 'key-02', - 'title': '่ดขๅŠก้ƒจ', - 'icon': 'dollar', - 'children': [{ - 'key': 'key-02-01', - 'title': 'ไผš่ฎกๆ ธ็ฎ—', - 'icon': null - }, { - 'key': 'key-02-02', - 'title': 'ๆˆๆœฌๆŽงๅˆถ', - 'icon': null - }, { - 'key': 'key-02-03', - 'title': 'ๅ†…้ƒจๆŽงๅˆถ', - 'icon': null, - 'children': [{ - 'key': 'key-02-03-01', - 'title': '่ดขๅŠกๅˆถๅบฆๅปบ่ฎพ', - 'icon': null - }, - { - 'key': 'key-02-03-02', - 'title': 'ไผš่ฎกๆ ธ็ฎ—', - 'icon': null - } - ] - }] - }]) -} - -const role = () => { - return builder({ - 'data': [{ - 'id': 'admin', - 'name': '็ฎก็†ๅ‘˜', - 'describe': 'ๆ‹ฅๆœ‰ๆ‰€ๆœ‰ๆƒ้™', - 'status': 1, - 'creatorId': 'system', - 'createTime': 1497160610259, - 'deleted': 0, - 'permissions': [{ - 'roleId': 'admin', - 'permissionId': 'comment', - 'permissionName': '่ฏ„่ฎบ็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': 'ๅˆ ้™ค', - 'defaultCheck': false - }], - 'actionList': ['delete', 'edit'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'member', - 'permissionName': 'ไผšๅ‘˜็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': 'ๅˆ ้™ค', - 'defaultCheck': false - } - ], - 'actionList': ['query', 'get', 'edit', 'delete'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'menu', - 'permissionName': '่œๅ•็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'import', - 'describe': 'ๅฏผๅ…ฅ', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'import'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'order', - 'permissionName': '่ฎขๅ•็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': 'ๅˆ ้™ค', - 'defaultCheck': false - } - ], - 'actionList': ['query', 'add', 'get'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'permission', - 'permissionName': 'ๆƒ้™็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': 'ๅˆ ้™ค', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get', 'edit', 'delete'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'role', - 'permissionName': '่ง’่‰ฒ็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': 'ๅˆ ้™ค', - 'defaultCheck': false - } - ], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'test', - 'permissionName': 'ๆต‹่ฏ•ๆƒ้™', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'user', - 'permissionName': '็”จๆˆท็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"},{"action":"export","defaultCheck":false,"describe":"ๅฏผๅ‡บ"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'import', - 'describe': 'ๅฏผๅ…ฅ', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': 'ๅˆ ้™ค', - 'defaultCheck': false - }, - { - 'action': 'export', - 'describe': 'ๅฏผๅ‡บ', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get'], - 'dataAccess': null - } - ] - }, - { - 'id': 'svip', - 'name': 'SVIP', - 'describe': '่ถ…็บงไผšๅ‘˜', - 'status': 1, - 'creatorId': 'system', - 'createTime': 1532417744846, - 'deleted': 0, - 'permissions': [{ - 'roleId': 'admin', - 'permissionId': 'comment', - 'permissionName': '่ฏ„่ฎบ็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': 'ๅˆ ้™ค', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get', 'delete'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'member', - 'permissionName': 'ไผšๅ‘˜็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'query', 'get'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'menu', - 'permissionName': '่œๅ•็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'import', - 'describe': 'ๅฏผๅ…ฅ', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'order', - 'permissionName': '่ฎขๅ•็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'query'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'permission', - 'permissionName': 'ๆƒ้™็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - } - ], - 'actionList': ['add', 'get', 'edit'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'role', - 'permissionName': '่ง’่‰ฒ็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - }, - { - 'action': 'delete', - 'describe': 'ๅˆ ้™ค', - 'defaultCheck': false - } - ], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'test', - 'permissionName': 'ๆต‹่ฏ•ๆƒ้™', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': ['add', 'edit'], - 'dataAccess': null - }, - { - 'roleId': 'admin', - 'permissionId': 'user', - 'permissionName': '็”จๆˆท็ฎก็†', - 'actions': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"},{"action":"export","defaultCheck":false,"describe":"ๅฏผๅ‡บ"}]', - 'actionEntitySet': [{ - 'action': 'add', - 'describe': 'ๆ–ฐๅขž', - 'defaultCheck': false - }, - { - 'action': 'import', - 'describe': 'ๅฏผๅ…ฅ', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - }, - { - 'action': 'edit', - 'describe': 'ไฟฎๆ”น', - 'defaultCheck': false - } - ], - 'actionList': ['add'], - 'dataAccess': null - } - ] - }, - { - 'id': 'user', - 'name': 'ๆ™ฎ้€šไผšๅ‘˜', - 'describe': 'ๆ™ฎ้€š็”จๆˆท๏ผŒๅช่ƒฝๆŸฅ่ฏข', - 'status': 1, - 'creatorId': 'system', - 'createTime': 1497160610259, - 'deleted': 0, - 'permissions': [{ - 'roleId': 'user', - 'permissionId': 'comment', - 'permissionName': '่ฏ„่ฎบ็ฎก็†', - 'actions': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"}]', - 'actionEntitySet': [{ - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - } - ], - 'actionList': ['query'], - 'dataAccess': null - }, - - { - 'roleId': 'user', - 'permissionId': 'marketing', - 'permissionName': '่ฅ้”€็ฎก็†', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'member', - 'permissionName': 'ไผšๅ‘˜็ฎก็†', - 'actions': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"}]', - 'actionEntitySet': [{ - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - } - ], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'menu', - 'permissionName': '่œๅ•็ฎก็†', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - - { - 'roleId': 'user', - 'permissionId': 'order', - 'permissionName': '่ฎขๅ•็ฎก็†', - 'actions': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"}]', - 'actionEntitySet': [{ - 'action': 'query', - 'describe': 'ๆŸฅ่ฏข', - 'defaultCheck': false - }, - { - 'action': 'get', - 'describe': '่ฏฆๆƒ…', - 'defaultCheck': false - } - ], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'permission', - 'permissionName': 'ๆƒ้™็ฎก็†', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'role', - 'permissionName': '่ง’่‰ฒ็ฎก็†', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - - { - 'roleId': 'user', - 'permissionId': 'test', - 'permissionName': 'ๆต‹่ฏ•ๆƒ้™', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - }, - { - 'roleId': 'user', - 'permissionId': 'user', - 'permissionName': '็”จๆˆท็ฎก็†', - 'actions': '[]', - 'actionEntitySet': [], - 'actionList': null, - 'dataAccess': null - } - ] - } - ], - 'pageSize': 10, - 'pageNo': 0, - 'totalPage': 1, - 'totalCount': 5 - }) -} - -const permissionNoPager = () => { - return builder([{ - 'id': 'marketing', - 'name': '่ฅ้”€็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': null, - 'parents': null, - 'type': null, - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'member', - 'name': 'ไผšๅ‘˜็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'menu', - 'name': '่œๅ•็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'import', - 'get', - 'edit' - ] - }, - { - 'id': 'order', - 'name': '่ฎขๅ•็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'permission', - 'name': 'ๆƒ้™็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'role', - 'name': '่ง’่‰ฒ็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'test', - 'name': 'ๆต‹่ฏ•ๆƒ้™', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get' - ] - }, - { - 'id': 'user', - 'name': '็”จๆˆท็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"export","defaultCheck":false,"describe":"ๅฏผๅ‡บ"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get' - ] - } - ]) -} - -const permissions = () => { - return builder({ - 'data': [{ - 'id': 'marketing', - 'name': '่ฅ้”€็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': null, - 'parents': null, - 'type': null, - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'member', - 'name': 'ไผšๅ‘˜็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'menu', - 'name': '่œๅ•็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'import', - 'get', - 'edit' - ] - }, - { - 'id': 'order', - 'name': '่ฎขๅ•็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'query', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'permission', - 'name': 'ๆƒ้™็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'role', - 'name': '่ง’่‰ฒ็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"edit","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get', - 'edit', - 'delete' - ] - }, - { - 'id': 'test', - 'name': 'ๆต‹่ฏ•ๆƒ้™', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get' - ] - }, - { - 'id': 'user', - 'name': '็”จๆˆท็ฎก็†', - 'describe': null, - 'status': 1, - 'actionData': '[{"action":"add","describe":"ๆ–ฐๅขž","defaultCheck":false},{"action":"get","describe":"ๆŸฅ่ฏข","defaultCheck":false}]', - 'sptDaTypes': null, - 'optionalFields': '[]', - 'parents': null, - 'type': 'default', - 'deleted': 0, - 'actions': [ - 'add', - 'get' - ] - } - ], - 'pageSize': 10, - 'pageNo': 0, - 'totalPage': 1, - 'totalCount': 5 - }) -} - -Mock.mock(/\/org\/tree/, 'get', orgTree) -Mock.mock(/\/role/, 'get', role) -Mock.mock(/\/permission\/no-pager/, 'get', permissionNoPager) -Mock.mock(/\/permission/, 'get', permissions) diff --git a/quantdinger_vue/src/mock/services/tagCloud.js b/quantdinger_vue/src/mock/services/tagCloud.js deleted file mode 100644 index 63a2e06..0000000 --- a/quantdinger_vue/src/mock/services/tagCloud.js +++ /dev/null @@ -1,9 +0,0 @@ -import Mock from 'mockjs2' -import { builder } from '../util' - -// -const tagCloudData = () => { - return builder([{ 'value': 9, 'name': 'AntV' }, { 'value': 8, 'name': 'F2' }, { 'value': 8, 'name': 'G2' }, { 'value': 8, 'name': 'G6' }, { 'value': 8, 'name': 'DataSet' }, { 'value': 8, 'name': 'ๅขจ่€…ๅญฆ้™ข' }, { 'value': 6, 'name': 'Analysis' }, { 'value': 6, 'name': 'Data Mining' }, { 'value': 6, 'name': 'Data Vis' }, { 'value': 6, 'name': 'Design' }, { 'value': 6, 'name': 'Grammar' }, { 'value': 6, 'name': 'Graphics' }, { 'value': 6, 'name': 'Graph' }, { 'value': 6, 'name': 'Hierarchy' }, { 'value': 6, 'name': 'Labeling' }, { 'value': 6, 'name': 'Layout' }, { 'value': 6, 'name': 'Quantitative' }, { 'value': 6, 'name': 'Relation' }, { 'value': 6, 'name': 'Statistics' }, { 'value': 6, 'name': 'ๅฏ่ง†ๅŒ–' }, { 'value': 6, 'name': 'ๆ•ฐๆฎ' }, { 'value': 6, 'name': 'ๆ•ฐๆฎๅฏ่ง†ๅŒ–' }, { 'value': 4, 'name': 'Arc Diagram' }, { 'value': 4, 'name': 'Bar Chart' }, { 'value': 4, 'name': 'Canvas' }, { 'value': 4, 'name': 'Chart' }, { 'value': 4, 'name': 'DAG' }, { 'value': 4, 'name': 'DG' }, { 'value': 4, 'name': 'Facet' }, { 'value': 4, 'name': 'Geo' }, { 'value': 4, 'name': 'Line' }, { 'value': 4, 'name': 'MindMap' }, { 'value': 4, 'name': 'Pie' }, { 'value': 4, 'name': 'Pizza Chart' }, { 'value': 4, 'name': 'Punch Card' }, { 'value': 4, 'name': 'SVG' }, { 'value': 4, 'name': 'Sunburst' }, { 'value': 4, 'name': 'Tree' }, { 'value': 4, 'name': 'UML' }, { 'value': 3, 'name': 'Chart' }, { 'value': 3, 'name': 'View' }, { 'value': 3, 'name': 'Geom' }, { 'value': 3, 'name': 'Shape' }, { 'value': 3, 'name': 'Scale' }, { 'value': 3, 'name': 'Animate' }, { 'value': 3, 'name': 'Global' }, { 'value': 3, 'name': 'Slider' }, { 'value': 3, 'name': 'Connector' }, { 'value': 3, 'name': 'Transform' }, { 'value': 3, 'name': 'Util' }, { 'value': 3, 'name': 'DomUtil' }, { 'value': 3, 'name': 'MatrixUtil' }, { 'value': 3, 'name': 'PathUtil' }, { 'value': 3, 'name': 'G' }, { 'value': 3, 'name': '2D' }, { 'value': 3, 'name': '3D' }, { 'value': 3, 'name': 'Line' }, { 'value': 3, 'name': 'Area' }, { 'value': 3, 'name': 'Interval' }, { 'value': 3, 'name': 'Schema' }, { 'value': 3, 'name': 'Edge' }, { 'value': 3, 'name': 'Polygon' }, { 'value': 3, 'name': 'Heatmap' }, { 'value': 3, 'name': 'Render' }, { 'value': 3, 'name': 'Tooltip' }, { 'value': 3, 'name': 'Axis' }, { 'value': 3, 'name': 'Guide' }, { 'value': 3, 'name': 'Coord' }, { 'value': 3, 'name': 'Legend' }, { 'value': 3, 'name': 'Path' }, { 'value': 3, 'name': 'Helix' }, { 'value': 3, 'name': 'Theta' }, { 'value': 3, 'name': 'Rect' }, { 'value': 3, 'name': 'Polar' }, { 'value': 3, 'name': 'Dsv' }, { 'value': 3, 'name': 'Csv' }, { 'value': 3, 'name': 'Tsv' }, { 'value': 3, 'name': 'GeoJSON' }, { 'value': 3, 'name': 'TopoJSON' }, { 'value': 3, 'name': 'Filter' }, { 'value': 3, 'name': 'Map' }, { 'value': 3, 'name': 'Pick' }, { 'value': 3, 'name': 'Rename' }, { 'value': 3, 'name': 'Filter' }, { 'value': 3, 'name': 'Map' }, { 'value': 3, 'name': 'Pick' }, { 'value': 3, 'name': 'Rename' }, { 'value': 3, 'name': 'Reverse' }, { 'value': 3, 'name': 'sort' }, { 'value': 3, 'name': 'Subset' }, { 'value': 3, 'name': 'Partition' }, { 'value': 3, 'name': 'Imputation' }, { 'value': 3, 'name': 'Fold' }, { 'value': 3, 'name': 'Aggregate' }, { 'value': 3, 'name': 'Proportion' }, { 'value': 3, 'name': 'Histogram' }, { 'value': 3, 'name': 'Quantile' }, { 'value': 3, 'name': 'Treemap' }, { 'value': 3, 'name': 'Hexagon' }, { 'value': 3, 'name': 'Binning' }, { 'value': 3, 'name': 'kernel' }, { 'value': 3, 'name': 'Regression' }, { 'value': 3, 'name': 'Density' }, { 'value': 3, 'name': 'Sankey' }, { 'value': 3, 'name': 'Voronoi' }, { 'value': 3, 'name': 'Projection' }, { 'value': 3, 'name': 'Centroid' }, { 'value': 3, 'name': 'H5' }, { 'value': 3, 'name': 'Mobile' }, { 'value': 3, 'name': 'K็บฟๅ›พ' }, { 'value': 3, 'name': 'ๅ…ณ็ณปๅ›พ' }, { 'value': 3, 'name': '็ƒ›ๅฝขๅ›พ' }, { 'value': 3, 'name': '่‚ก็ฅจๅ›พ' }, { 'value': 3, 'name': '็›ดๆ–นๅ›พ' }, { 'value': 3, 'name': '้‡‘ๅญ—ๅก”ๅ›พ' }, { 'value': 3, 'name': 'ๅˆ†้ข' }, { 'value': 3, 'name': 'ๅ—ไธๆ ผๅฐ”็Žซ็‘ฐๅ›พ' }, { 'value': 3, 'name': '้ฅผๅ›พ' }, { 'value': 3, 'name': '็บฟๅ›พ' }, { 'value': 3, 'name': '็‚นๅ›พ' }, { 'value': 3, 'name': 'ๆ•ฃ็‚นๅ›พ' }, { 'value': 3, 'name': 'ๅญๅผนๅ›พ' }, { 'value': 3, 'name': 'ๆŸฑ็Šถๅ›พ' }, { 'value': 3, 'name': 'ไปช่กจ็›˜' }, { 'value': 3, 'name': 'ๆฐ”ๆณกๅ›พ' }, { 'value': 3, 'name': 'ๆผๆ–—ๅ›พ' }, { 'value': 3, 'name': '็ƒญๅŠ›ๅ›พ' }, { 'value': 3, 'name': '็މ็Žฆๅ›พ' }, { 'value': 3, 'name': '็›ดๆ–นๅ›พ' }, { 'value': 3, 'name': '็Ÿฉๅฝขๆ ‘ๅ›พ' }, { 'value': 3, 'name': '็ฎฑๅฝขๅ›พ' }, { 'value': 3, 'name': '่‰ฒๅ—ๅ›พ' }, { 'value': 3, 'name': '่žบๆ—‹ๅ›พ' }, { 'value': 3, 'name': '่ฏไบ‘' }, { 'value': 3, 'name': '่ฏไบ‘ๅ›พ' }, { 'value': 3, 'name': '้›ท่พพๅ›พ' }, { 'value': 3, 'name': '้ข็งฏๅ›พ' }, { 'value': 3, 'name': '้ฉฌ่ต›ๅ…‹ๅ›พ' }, { 'value': 3, 'name': '็›’้กปๅ›พ' }, { 'value': 3, 'name': 'ๅๆ ‡่ฝด' }, { 'value': 3, 'name': '' }, { 'value': 3, 'name': 'Jacques Bertin' }, { 'value': 3, 'name': 'Leland Wilkinson' }, { 'value': 3, 'name': 'William Playfair' }, { 'value': 3, 'name': 'ๅ…ณ่”' }, { 'value': 3, 'name': 'ๅˆ†ๅธƒ' }, { 'value': 3, 'name': 'ๅŒบ้—ด' }, { 'value': 3, 'name': 'ๅ ๆฏ”' }, { 'value': 3, 'name': 'ๅœฐๅ›พ' }, { 'value': 3, 'name': 'ๆ—ถ้—ด' }, { 'value': 3, 'name': 'ๆฏ”่พƒ' }, { 'value': 3, 'name': 'ๆต็จ‹' }, { 'value': 3, 'name': '่ถ‹ๅŠฟ' }, { 'value': 2, 'name': 'ไบฆๅถ' }, { 'value': 2, 'name': 'ๅ†้ฃž' }, { 'value': 2, 'name': 'ๅฎŒ็™ฝ' }, { 'value': 2, 'name': 'ๅทดๆ€' }, { 'value': 2, 'name': 'ๅผ ๅˆๅฐ˜' }, { 'value': 2, 'name': 'ๅพกๆœฏ' }, { 'value': 2, 'name': 'ๆœ‰็”ฐ' }, { 'value': 2, 'name': 'ๆฒ‰้ฑผ' }, { 'value': 2, 'name': '็މไผฏ' }, { 'value': 2, 'name': '็”ปๅบท' }, { 'value': 2, 'name': '็ฅฏ้€ธ' }, { 'value': 2, 'name': '็ปไบ‘' }, { 'value': 2, 'name': '็ฝ—ๅฎช' }, { 'value': 2, 'name': '่งๅบ†' }, { 'value': 2, 'name': '่‘ฃ็Š็Š' }, { 'value': 2, 'name': '้™†ๆฒ‰' }, { 'value': 2, 'name': '้กพๅ€พ' }, { 'value': 2, 'name': 'Domo' }, { 'value': 2, 'name': 'GPL' }, { 'value': 2, 'name': 'PAI' }, { 'value': 2, 'name': 'SPSS' }, { 'value': 2, 'name': 'SYSTAT' }, { 'value': 2, 'name': 'Tableau' }, { 'value': 2, 'name': 'D3' }, { 'value': 2, 'name': 'Vega' }, { 'value': 2, 'name': '็ปŸ่ฎกๅ›พ่กจ' }]) -} - -Mock.mock(/\/data\/antv\/tag-cloud/, 'get', tagCloudData) diff --git a/quantdinger_vue/src/mock/services/user.js b/quantdinger_vue/src/mock/services/user.js deleted file mode 100644 index a104a31..0000000 --- a/quantdinger_vue/src/mock/services/user.js +++ /dev/null @@ -1,577 +0,0 @@ -import Mock from 'mockjs2' -import { builder } from '../util' - -const info = options => { - const userInfo = { - id: '4291d7da9005377ec9aec4a71ea837f', - name: 'ๅคฉ้‡Ž่ฟœๅญ', - username: 'admin', - password: '', - avatar: '/avatar2.jpg', - status: 1, - telephone: '', - lastLoginIp: '27.154.74.117', - lastLoginTime: 1534837621348, - creatorId: 'admin', - createTime: 1497160610259, - merchantCode: 'TLif2btpzg079h15bk', - deleted: 0, - roleId: 'admin', - role: {} - } - // role - const roleObj = { - id: 'admin', - name: '็ฎก็†ๅ‘˜', - describe: 'ๆ‹ฅๆœ‰ๆ‰€ๆœ‰ๆƒ้™', - status: 1, - creatorId: 'system', - createTime: 1497160610259, - deleted: 0, - permissions: [ - { - roleId: 'admin', - permissionId: 'dashboard', - permissionName: 'ไปช่กจ็›˜', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'query', - describe: 'ๆŸฅ่ฏข', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'exception', - permissionName: 'ๅผ‚ๅธธ้กต้ขๆƒ้™', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'query', - describe: 'ๆŸฅ่ฏข', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'result', - permissionName: '็ป“ๆžœๆƒ้™', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'query', - describe: 'ๆŸฅ่ฏข', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'profile', - permissionName: '่ฏฆ็ป†้กตๆƒ้™', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'query', - describe: 'ๆŸฅ่ฏข', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'table', - permissionName: '่กจๆ ผๆƒ้™', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'import', - describe: 'ๅฏผๅ…ฅ', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'form', - permissionName: '่กจๅ•ๆƒ้™', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'query', - describe: 'ๆŸฅ่ฏข', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'order', - permissionName: '่ฎขๅ•็ฎก็†', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'query', - describe: 'ๆŸฅ่ฏข', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'permission', - permissionName: 'ๆƒ้™็ฎก็†', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'role', - permissionName: '่ง’่‰ฒ็ฎก็†', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'table', - permissionName: 'ๆกŒๅญ็ฎก็†', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"query","defaultCheck":false,"describe":"ๆŸฅ่ฏข"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'query', - describe: 'ๆŸฅ่ฏข', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }, - { - roleId: 'admin', - permissionId: 'user', - permissionName: '็”จๆˆท็ฎก็†', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"},{"action":"export","defaultCheck":false,"describe":"ๅฏผๅ‡บ"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'import', - describe: 'ๅฏผๅ…ฅ', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - }, - { - action: 'export', - describe: 'ๅฏผๅ‡บ', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - } - ] - } - - roleObj.permissions.push({ - roleId: 'admin', - permissionId: 'support', - permissionName: '่ถ…็บงๆจกๅ—', - actions: - '[{"action":"add","defaultCheck":false,"describe":"ๆ–ฐๅขž"},{"action":"import","defaultCheck":false,"describe":"ๅฏผๅ…ฅ"},{"action":"get","defaultCheck":false,"describe":"่ฏฆๆƒ…"},{"action":"update","defaultCheck":false,"describe":"ไฟฎๆ”น"},{"action":"delete","defaultCheck":false,"describe":"ๅˆ ้™ค"},{"action":"export","defaultCheck":false,"describe":"ๅฏผๅ‡บ"}]', - actionEntitySet: [ - { - action: 'add', - describe: 'ๆ–ฐๅขž', - defaultCheck: false - }, - { - action: 'import', - describe: 'ๅฏผๅ…ฅ', - defaultCheck: false - }, - { - action: 'get', - describe: '่ฏฆๆƒ…', - defaultCheck: false - }, - { - action: 'update', - describe: 'ไฟฎๆ”น', - defaultCheck: false - }, - { - action: 'delete', - describe: 'ๅˆ ้™ค', - defaultCheck: false - }, - { - action: 'export', - describe: 'ๅฏผๅ‡บ', - defaultCheck: false - } - ], - actionList: null, - dataAccess: null - }) - - userInfo.role = roleObj - return builder(userInfo) -} - -/** - * ไฝฟ็”จ ็”จๆˆท็™ปๅฝ•็š„ token ่Žทๅ–็”จๆˆทๆœ‰ๆƒ้™็š„่œๅ• - * ่ฟ”ๅ›ž็ป“ๆž„ๅฟ…้กปๆŒ‰็…ง่ฟ™ไธช็ป“ๆž„ไฝ“ๅฝขๅผๅค„็†๏ผŒๆˆ–ๆ นๆฎ - * /src/router/generator-routers.js ๆ–‡ไปถ็š„่œๅ•็ป“ๆž„ๅค„็†ๅ‡ฝๆ•ฐๅฏนๅบ”ๅณๅฏ - * @param {*} options - * @returns - */ -const userNav = options => { - const nav = [ - // AI ๅˆ†ๆž - { - name: 'Analysis', - parentId: 0, - id: 1, - meta: { - title: 'menu.dashboard.analysis', - icon: 'thunderbolt', - show: true - }, - component: 'Analysis', - path: '/ai-analysis' - }, - // ๆŒ‡ๆ ‡ๅˆ†ๆž - { - name: 'Indicator', - parentId: 0, - id: 2, - meta: { - title: 'menu.dashboard.indicator', - icon: 'line-chart', - show: true - }, - component: 'Indicator', - path: '/indicator-analysis' - }, - // ็‰นๆฎŠไธ‰็บง่œๅ• - { - name: 'settings', - parentId: 10028, - id: 10030, - meta: { - title: 'menu.account.settings', - hideHeader: true, - hideChildren: true, - show: true - }, - redirect: '/account/settings/basic', - component: 'AccountSettings' - }, - { - name: 'BasicSettings', - path: '/account/settings/basic', - parentId: 10030, - id: 10031, - meta: { - title: 'account.settings.menuMap.basic', - show: false - }, - component: 'BasicSetting' - }, - { - name: 'SecuritySettings', - path: '/account/settings/security', - parentId: 10030, - id: 10032, - meta: { - title: 'account.settings.menuMap.security', - show: false - }, - component: 'SecuritySettings' - }, - { - name: 'CustomSettings', - path: '/account/settings/custom', - parentId: 10030, - id: 10033, - meta: { - title: 'account.settings.menuMap.custom', - show: false - }, - component: 'CustomSettings' - }, - { - name: 'BindingSettings', - path: '/account/settings/binding', - parentId: 10030, - id: 10034, - meta: { - title: 'account.settings.menuMap.binding', - show: false - }, - component: 'BindingSettings' - }, - { - name: 'NotificationSettings', - path: '/account/settings/notification', - parentId: 10030, - id: 10034, - meta: { - title: 'account.settings.menuMap.notification', - show: false - }, - component: 'NotificationSettings' - } - ] - const json = builder(nav) - return json -} - -Mock.mock(/\/api\/user\/info/, 'get', info) -Mock.mock(/\/api\/user\/nav/, 'get', userNav) diff --git a/quantdinger_vue/src/mock/util.js b/quantdinger_vue/src/mock/util.js deleted file mode 100644 index a4be036..0000000 --- a/quantdinger_vue/src/mock/util.js +++ /dev/null @@ -1,38 +0,0 @@ -const responseBody = { - message: '', - timestamp: 0, - result: null, - code: 0 -} - -export const builder = (data, message, code = 0, headers = {}) => { - responseBody.result = data - if (message !== undefined && message !== null) { - responseBody.message = message - } - if (code !== undefined && code !== 0) { - responseBody.code = code - responseBody._status = code - } - if (headers !== null && typeof headers === 'object' && Object.keys(headers).length > 0) { - responseBody._headers = headers - } - responseBody.timestamp = new Date().getTime() - return responseBody -} - -export const getQueryParameters = (options) => { - const url = options.url - const search = url.split('?')[1] - if (!search) { - return {} - } - return JSON.parse('{"' + decodeURIComponent(search) - .replace(/"/g, '\\"') - .replace(/&/g, '","') - .replace(/=/g, '":"') + '"}') -} - -export const getBody = (options) => { - return options.body && JSON.parse(options.body) -} diff --git a/quantdinger_vue/src/permission.js b/quantdinger_vue/src/permission.js deleted file mode 100644 index 32a64c3..0000000 --- a/quantdinger_vue/src/permission.js +++ /dev/null @@ -1,128 +0,0 @@ -import router, { - resetRouter -} from './router' -import store from './store' -import storage from 'store' -import NProgress from 'nprogress' // progress bar -import '@/components/NProgress/nprogress.less' // progress bar custom style -import { - setDocumentTitle, - domTitle -} from '@/utils/domUtil' -import { - ACCESS_TOKEN -} from '@/store/mutation-types' -import { - i18nRender -} from '@/locales' - -NProgress.configure({ - showSpinner: false -}) // NProgress Configuration - -const allowList = ['login'] // no redirect allowList -const loginRoutePath = '/user/login' -const defaultRoutePath = '/dashboard' - -router.beforeEach((to, from, next) => { - NProgress.start() // start progress bar - to.meta && typeof to.meta.title !== 'undefined' && setDocumentTitle(`${i18nRender(to.meta.title)} - ${domTitle}`) - - // Check whether we have a token (local-only auth). - // ๅค„็† token ๅฏ่ƒฝๆ˜ฏๅญ—็ฌฆไธฒๆˆ–ๅฏน่ฑก็š„ๆƒ…ๅ†ต - let token = storage.get(ACCESS_TOKEN) - if (token && typeof token !== 'string') { - token = token.token || token.value || (typeof token === 'object' ? null : token) - } - token = typeof token === 'string' ? token : null - - if (token) { - // ๆœ‰ token๏ผŒๅ…่ฎธ่ฎฟ้—ฎๆ‰€ๆœ‰้กต้ข - // ๅฆ‚ๆžœ่ฎฟ้—ฎ็™ปๅฝ•้กต๏ผŒ่ทณ่ฝฌๅˆฐ้ป˜่ฎค้กต้ข - if (to.path === loginRoutePath) { - next({ path: defaultRoutePath }) - NProgress.done() - } else { - // ๆฃ€ๆŸฅ็”จๆˆทไฟกๆฏๆ˜ฏๅฆๅทฒๅŠ ่ฝฝ - if (store.getters.roles.length === 0) { - store.dispatch('GetInfo') - .then(res => { - // ๆ‹‰ๅ–็”จๆˆทไฟกๆฏๆˆๅŠŸ - // const roles = res && res.role - // ็”Ÿๆˆ่ทฏ็”ฑ - store.dispatch('GenerateRoutes', { token }).then(() => { - // ๅŠจๆ€ๆทปๅŠ ๅฏ่ฎฟ้—ฎ่ทฏ็”ฑ่กจ - resetRouter() // ้‡็ฝฎ่ทฏ็”ฑ - store.getters.addRouters.forEach(r => { - router.addRoute(r) - }) - // ่ฏทๆฑ‚ๅธฆๆœ‰ redirect ้‡ๅฎšๅ‘ๆ—ถ๏ผŒ็™ปๅฝ•่‡ชๅŠจ้‡ๅฎšๅ‘ๅˆฐ่ฏฅๅœฐๅ€ - const redirect = decodeURIComponent(from.query.redirect || to.path) - if (to.path === redirect) { - // hackๆ–นๆณ• ็กฎไฟaddRoutesๅทฒๅฎŒๆˆ ,set the replace: true so the navigation will not leave a history record - next({ ...to, replace: true }) - } else { - // ่ทณ่ฝฌๅˆฐ็›ฎ็š„่ทฏ็”ฑ - next({ path: redirect }) - } - }) - }) - .catch((err) => { - // If token is invalid/expired, clear local auth and redirect to login. - const status = err && err.response && err.response.status - if (status === 401) { - store.dispatch('Logout').finally(() => { - next({ path: loginRoutePath, query: { redirect: to.fullPath } }) - NProgress.done() - }) - return - } - - // Do NOT hard-logout on transient failures (backend down, proxy issue, etc). - // Instead, degrade gracefully with a default role and continue. - store.commit('SET_ROLES', [{ id: 'default', permissionList: [] }]) - store.dispatch('GenerateRoutes', { token }).then(() => { - resetRouter() - store.getters.addRouters.forEach(r => router.addRoute(r)) - next({ ...to, replace: true }) - }).catch(() => { - next() - }) - }) - } else { - // ๆฃ€ๆŸฅ่ทฏ็”ฑๆ˜ฏๅฆๅทฒๅˆๅง‹ๅŒ– - const addRouters = store.getters.addRouters - // ๅฆ‚ๆžœ่ทฏ็”ฑๆœชๅˆๅง‹ๅŒ–๏ผŒๅ…ˆๅˆๅง‹ๅŒ–่ทฏ็”ฑ - if (!addRouters || addRouters.length === 0) { - store.dispatch('GenerateRoutes', { token }).then(() => { - // ๅŠจๆ€ๆทปๅŠ ๅฏ่ฎฟ้—ฎ่ทฏ็”ฑ่กจ - resetRouter() // ้‡็ฝฎ่ทฏ็”ฑ ้˜ฒๆญข้€€ๅ‡บ้‡ๆ–ฐ็™ปๅฝ•ๆˆ–่€… token ่ฟ‡ๆœŸๅŽ้กต้ขๆœชๅˆทๆ–ฐ๏ผŒๅฏผ่‡ด็š„่ทฏ็”ฑ้‡ๅคๆทปๅŠ  - store.getters.addRouters.forEach(r => { - router.addRoute(r) - }) - // ้‡ๆ–ฐ่ฟ›ๅ…ฅๅฝ“ๅ‰่ทฏ็”ฑ๏ผŒ้ฟๅ…้ฆ–ๆฌกๅˆทๆ–ฐ็ฉบ็™ฝ - next({ ...to, replace: true }) - }).catch(() => { - next() - }) - } else { - next() - } - } - } - } else { - // ๆฒกๆœ‰ token - if (allowList.includes(to.name)) { - // ๅœจๅ…็™ปๅฝ•ๅๅ•๏ผŒ็›ดๆŽฅ่ฟ›ๅ…ฅ - next() - } else { - // ่ทณ่ฝฌๅˆฐ็™ปๅฝ•้กต - next({ path: loginRoutePath, query: { redirect: to.fullPath } }) - NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it - } - } -}) - -router.afterEach(() => { - NProgress.done() // finish progress bar -}) diff --git a/quantdinger_vue/src/router/README.md b/quantdinger_vue/src/router/README.md deleted file mode 100644 index b736444..0000000 --- a/quantdinger_vue/src/router/README.md +++ /dev/null @@ -1,134 +0,0 @@ -่ทฏ็”ฑ/่œๅ•่ฏดๆ˜Ž -==== - - -ๆ ผๅผๅ’Œ่ฏดๆ˜Ž ----- - -```ecmascript 6 -const routerObject = { - redirect: noredirect, - name: 'router-name', - hidden: true, - meta: { - title: 'title', - icon: 'a-icon', - target: '_blank|_self|_top|_parent', - keepAlive: true, - hiddenHeaderContent: true, - } -} -``` - - - -`{ Route }` ๅฏน่ฑก - -| ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | -| -------- | ----------------------------------------- | ------- | ------ | -| hidden | ๆŽงๅˆถ่ทฏ็”ฑๆ˜ฏๅฆๆ˜พ็คบๅœจ sidebar | boolean | false | -| redirect | ้‡ๅฎšๅ‘ๅœฐๅ€, ่ฎฟ้—ฎ่ฟ™ไธช่ทฏ็”ฑๆ—ถ,่‡ชๅฎš่ฟ›่กŒ้‡ๅฎšๅ‘ | string | - | -| name | ่ทฏ็”ฑๅ็งฐ, ๅฟ…้กป่ฎพ็ฝฎ,ไธ”ไธ่ƒฝ้‡ๅ | string | - | -| meta | ่ทฏ็”ฑๅ…ƒไฟกๆฏ๏ผˆ่ทฏ็”ฑ้™„ๅธฆๆ‰ฉๅฑ•ไฟกๆฏ๏ผ‰ | object | {} | -| hideChildrenInMenu | ๅผบๅˆถ่œๅ•ๆ˜พ็คบไธบItem่€Œไธๆ˜ฏSubItem(้…ๅˆ meta.hidden) | boolean | - | - - -`{ Meta }` ่ทฏ็”ฑๅ…ƒไฟกๆฏๅฏน่ฑก - -| ๅ‚ๆ•ฐ | ่ฏดๆ˜Ž | ็ฑปๅž‹ | ้ป˜่ฎคๅ€ผ | -| ------------------- | ------------------------------------------------------------ | ------- | ------ | -| title | ่ทฏ็”ฑๆ ‡้ข˜, ็”จไบŽๆ˜พ็คบ้ขๅŒ…ๅฑ‘, ้กต้ขๆ ‡้ข˜ *ๆŽจ่่ฎพ็ฝฎ | string | - | -| icon | ่ทฏ็”ฑๅœจ menu ไธŠๆ˜พ็คบ็š„ๅ›พๆ ‡ | [string,svg] | - | -| keepAlive | ็ผ“ๅญ˜่ฏฅ่ทฏ็”ฑ | boolean | false | -| target | ่œๅ•้“พๆŽฅ่ทณ่ฝฌ็›ฎๆ ‡๏ผˆๅ‚่€ƒ html a ๆ ‡่ฎฐ๏ผ‰ | string | - | -| hidden | ้…ๅˆ`hideChildrenInMenu`ไฝฟ็”จ๏ผŒ็”จไบŽ้š่—่œๅ•ๆ—ถ๏ผŒๆไพ›้€’ๅฝ’ๅˆฐ็ˆถ่œๅ•ๆ˜พ็คบ ้€‰ไธญ่œๅ•้กน_๏ผˆๅฏๅ‚่€ƒ ไธชไบบ้กต ้…็ฝฎๆ–นๅผ๏ผ‰_ | boolean | false | -| hiddenHeaderContent | *็‰นๆฎŠ ้š่— [PageHeader](https://github.com/vueComponent/ant-design-vue-pro/blob/master/src/components/PageHeader/PageHeader.vue#L6) ็ป„ไปถไธญ็š„้กต้ขๅธฆ็š„ ้ขๅŒ…ๅฑ‘ๅ’Œ้กต้ขๆ ‡้ข˜ๆ  | boolean | false | -| permission | ไธŽ้กน็›ฎๆไพ›็š„ๆƒ้™ๆ‹ฆๆˆชๅŒน้…็š„ๆƒ้™๏ผŒๅฆ‚ๆžœไธๅŒน้…๏ผŒๅˆ™ไผš่ขซ็ฆๆญข่ฎฟ้—ฎ่ฏฅ่ทฏ็”ฑ้กต้ข | array | [] | - -> ่ทฏ็”ฑ่‡ชๅฎšไน‰ `Icon` ่ฏทๅผ•ๅ…ฅ่‡ชๅฎšไน‰ `svg` Icon ๆ–‡ไปถ๏ผŒ็„ถๅŽไผ ้€’็ป™่ทฏ็”ฑ็š„ `meta.icon` ๅ‚ๆ•ฐๅณๅฏ - -่ทฏ็”ฑๆž„ๅปบไพ‹ๅญๆ–นๆกˆ1 - -่ทฏ็”ฑไพ‹ๅญ ----- - -```ecmascript 6 -const asyncRouterMap = [ - { - path: '/', - name: 'index', - component: BasicLayout, - meta: { title: '้ฆ–้กต' }, - redirect: '/ai-analysis', - children: [ - { - path: '/dashboard', - component: RouteView, - name: 'dashboard', - redirect: '/dashboard/workplace', - meta: {title: 'ไปช่กจ็›˜', icon: 'dashboard', permission: ['dashboard']}, - children: [ - { - path: '/ai-analysis', - name: 'Analysis', - component: () => import('@/views/dashboard/Analysis'), - meta: {title: 'ๅˆ†ๆž้กต', permission: ['dashboard']} - }, - { - path: '/dashboard/monitor', - name: 'Monitor', - hidden: true, - component: () => import('@/views/dashboard/Monitor'), - meta: {title: '็›‘ๆŽง้กต', permission: ['dashboard']} - }, - { - path: '/dashboard/workplace', - name: 'Workplace', - component: () => import('@/views/dashboard/Workplace'), - meta: {title: 'ๅทฅไฝœๅฐ', permission: ['dashboard']} - } - ] - }, - - // result - { - path: '/result', - name: 'result', - component: PageView, - redirect: '/result/success', - meta: { title: '็ป“ๆžœ้กต', icon: 'check-circle-o', permission: [ 'result' ] }, - children: [ - { - path: '/result/success', - name: 'ResultSuccess', - component: () => import(/* webpackChunkName: "result" */ '@/views/result/Success'), - // ่ฏฅ้กต้ข้š่—้ขๅŒ…ๅฑ‘ๅ’Œ้กต้ขๆ ‡้ข˜ๆ  - meta: { title: 'ๆˆๅŠŸ', hiddenHeaderContent: true, permission: [ 'result' ] } - }, - { - path: '/result/fail', - name: 'ResultFail', - component: () => import(/* webpackChunkName: "result" */ '@/views/result/Error'), - // ่ฏฅ้กต้ข้š่—้ขๅŒ…ๅฑ‘ๅ’Œ้กต้ขๆ ‡้ข˜ๆ  - meta: { title: 'ๅคฑ่ดฅ', hiddenHeaderContent: true, permission: [ 'result' ] } - } - ] - }, - ... - ] - }, -] -``` - -> 1. ่ฏทๆณจๆ„ `component: () => import('..') ` ๆ–นๅผๅผ•ๅ…ฅ่ทฏ็”ฑ็š„้กต้ข็ป„ไปถไธบ ๆ‡’ๅŠ ่ฝฝๆจกๅผใ€‚ๅ…ทไฝ“ๅฏไปฅ็œ‹ [Vue ๅฎ˜ๆ–นๆ–‡ๆกฃ](https://router.vuejs.org/zh/guide/advanced/lazy-loading.html) -> 2. ๅขžๅŠ ๆ–ฐ็š„่ทฏ็”ฑๅบ”่ฏฅๅขžๅŠ ๅœจ '/' (index) ่ทฏ็”ฑ็š„ `children` ๅ†… -> 3. ๅญ่ทฏ็”ฑ็š„็ˆถ็บง่ทฏ็”ฑๅฟ…้กปๆœ‰ `router-view` ๆ‰่ƒฝ่ฎฉๅญ่ทฏ็”ฑๆธฒๆŸ“ๅ‡บๆฅ๏ผŒ่ฏทไป”็ป†ๆŸฅ้˜… vue-router ๆ–‡ๆกฃ -> 4. `permission` ๅฏไปฅ่ฟ›่กŒ่‡ชๅฎšไน‰ไฟฎๆ”น๏ผŒๅช้œ€่ฆๅฏน่ฟ™ไธชๆจกๅ—่ฟ›่กŒ่‡ชๅฎšไน‰ไฟฎๆ”นๅณๅฏ [src/store/modules/permission.js#L10](https://github.com/vueComponent/ant-design-vue-pro/blob/master/src/store/modules/permission.js#L10) - - -้™„ๆƒ้™่ทฏ็”ฑ็ป“ๆž„๏ผš - -![ๆƒ้™็ป“ๆž„](https://static-2.loacg.com/open/static/github/permissions.png) - - -็ฌฌไบŒ็งๅ‰็ซฏ่ทฏ็”ฑ็”ฑๅŽ็ซฏๅŠจๆ€็”Ÿๆˆ็š„่ฎพ่ฎก๏ผŒๅฏไปฅๅ‰ๅพ€ๅฎ˜็ฝ‘ๆ–‡ๆกฃ https://pro.antdv.com/docs/authority-management ๅ‚่€ƒ diff --git a/quantdinger_vue/src/router/generator-routers.js b/quantdinger_vue/src/router/generator-routers.js deleted file mode 100644 index f422d25..0000000 --- a/quantdinger_vue/src/router/generator-routers.js +++ /dev/null @@ -1,85 +0,0 @@ -import { asyncRouterMap } from '@/config/router.config' -import storage from 'store' -import { USER_INFO, USER_ROLES } from '@/store/mutation-types' - -/** - * Filter routes based on user permissions. - * Routes with meta.permission containing 'admin' are only visible to admin users. - * - * @param {Array} routes - Route configuration array - * @param {boolean} isAdmin - Whether current user is admin - * @returns {Array} Filtered routes - */ -function filterRoutesByPermission (routes, isAdmin) { - const filtered = [] - - for (const route of routes) { - // Clone route to avoid mutating original - const clonedRoute = { ...route } - - // Check if route requires admin permission - const permissions = clonedRoute.meta?.permission || [] - const requiresAdmin = permissions.includes('admin') - - // If requires admin but user is not admin, skip this route - if (requiresAdmin && !isAdmin) { - continue - } - - // Recursively filter children - if (clonedRoute.children && clonedRoute.children.length > 0) { - clonedRoute.children = filterRoutesByPermission(clonedRoute.children, isAdmin) - } - - filtered.push(clonedRoute) - } - - return filtered -} - -/** - * Check if current user is admin. - * Checks both userInfo.role and stored roles array. - * - * @returns {boolean} True if user is admin - */ -function checkIsAdmin () { - // Check userInfo.role first - const userInfo = storage.get(USER_INFO) || {} - if (userInfo.role) { - const roleId = typeof userInfo.role === 'string' ? userInfo.role : userInfo.role.id - if (roleId === 'admin') { - return true - } - } - - // Check stored roles array - const roles = storage.get(USER_ROLES) || [] - if (Array.isArray(roles)) { - for (const role of roles) { - if (role && (role.id === 'admin' || role === 'admin')) { - return true - } - } - } - - return false -} - -/** - * Generate dynamic routes based on user permissions. - * Filters admin-only routes for non-admin users. - * - * @param {string} token - User token (unused, kept for compatibility) - * @returns {Promise} Promise resolving to filtered routes - */ -export const generatorDynamicRouter = token => { - return new Promise((resolve) => { - const isAdmin = checkIsAdmin() - - // Filter routes based on permissions - const filteredRoutes = filterRoutesByPermission(asyncRouterMap, isAdmin) - - resolve(filteredRoutes) - }) -} diff --git a/quantdinger_vue/src/router/index.js b/quantdinger_vue/src/router/index.js deleted file mode 100644 index 5acaeff..0000000 --- a/quantdinger_vue/src/router/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import Vue from 'vue' -import Router from 'vue-router' -import { constantRouterMap } from '@/config/router.config' - -// hack router push callback -const originalPush = Router.prototype.push -Router.prototype.push = function push (location, onResolve, onReject) { - if (onResolve || onReject) return originalPush.call(this, location, onResolve, onReject) - return originalPush.call(this, location).catch(err => err) -} - -Vue.use(Router) - -const createRouter = () => - new Router({ - mode: 'hash', - routes: constantRouterMap - }) - -const router = createRouter() - -// ๅฎšไน‰ไธ€ไธชresetRouter ๆ–นๆณ•๏ผŒๅœจ้€€ๅ‡บ็™ปๅฝ•ๅŽๆˆ–token่ฟ‡ๆœŸๅŽ ้œ€่ฆ้‡ๆ–ฐ็™ปๅฝ•ๆ—ถ๏ผŒ่ฐƒ็”จๅณๅฏ -export function resetRouter () { - const newRouter = createRouter() - router.matcher = newRouter.matcher -} - -export default router diff --git a/quantdinger_vue/src/store/app-mixin.js b/quantdinger_vue/src/store/app-mixin.js deleted file mode 100644 index c910ae9..0000000 --- a/quantdinger_vue/src/store/app-mixin.js +++ /dev/null @@ -1,32 +0,0 @@ -import { mapState } from 'vuex' - -const baseMixin = { - computed: { - ...mapState({ - layout: state => state.app.layout, - navTheme: state => state.app.theme, - primaryColor: state => state.app.color, - colorWeak: state => state.app.weak, - fixedHeader: state => state.app.fixedHeader, - fixedSidebar: state => state.app.fixedSidebar, - contentWidth: state => state.app.contentWidth, - autoHideHeader: state => state.app.autoHideHeader, - - isMobile: state => state.app.isMobile, - sideCollapsed: state => state.app.sideCollapsed, - multiTab: state => state.app.multiTab - }), - isTopMenu () { - return this.layout === 'topmenu' - } - }, - methods: { - isSideMenu () { - return !this.isTopMenu - } - } -} - -export { - baseMixin -} diff --git a/quantdinger_vue/src/store/device-mixin.js b/quantdinger_vue/src/store/device-mixin.js deleted file mode 100644 index 2510707..0000000 --- a/quantdinger_vue/src/store/device-mixin.js +++ /dev/null @@ -1,11 +0,0 @@ -import { mapState } from 'vuex' - -const deviceMixin = { - computed: { - ...mapState({ - isMobile: state => state.app.isMobile - }) - } -} - -export { deviceMixin } diff --git a/quantdinger_vue/src/store/getters.js b/quantdinger_vue/src/store/getters.js deleted file mode 100644 index 5a5ad70..0000000 --- a/quantdinger_vue/src/store/getters.js +++ /dev/null @@ -1,16 +0,0 @@ -const getters = { - isMobile: state => state.app.isMobile, - lang: state => state.app.lang, - theme: state => state.app.theme, - color: state => state.app.color, - token: state => state.user.token, - avatar: state => state.user.avatar, - nickname: state => state.user.name, - welcome: state => state.user.welcome, - roles: state => state.user.roles, - userInfo: state => state.user.info, - addRouters: state => state.permission.addRouters, - multiTab: state => state.app.multiTab -} - -export default getters diff --git a/quantdinger_vue/src/store/i18n-mixin.js b/quantdinger_vue/src/store/i18n-mixin.js deleted file mode 100644 index 715b0c8..0000000 --- a/quantdinger_vue/src/store/i18n-mixin.js +++ /dev/null @@ -1,16 +0,0 @@ -import { mapState } from 'vuex' - -const i18nMixin = { - computed: { - ...mapState({ - currentLang: state => state.app.lang - }) - }, - methods: { - setLang (lang) { - this.$store.dispatch('setLang', lang) - } - } -} - -export default i18nMixin diff --git a/quantdinger_vue/src/store/index.js b/quantdinger_vue/src/store/index.js deleted file mode 100644 index d8f8e9a..0000000 --- a/quantdinger_vue/src/store/index.js +++ /dev/null @@ -1,29 +0,0 @@ -import Vue from 'vue' -import Vuex from 'vuex' - -import app from './modules/app' -import user from './modules/user' - -// dynamic router permission control -// ๅŠจๆ€่ทฏ็”ฑๆจกๅผ๏ผˆๆ”ฏๆŒๅŸบไบŽ่ง’่‰ฒ็š„่œๅ•่ฟ‡ๆปค๏ผ‰ -import permission from './modules/async-router' - -// static router permission control (NO filtering) -// ้™ๆ€่ทฏ็”ฑๆจกๅผ๏ผˆไธ่ฟ‡ๆปค่œๅ•๏ผŒๅทฒๅผƒ็”จ๏ผ‰ -// import permission from './modules/static-router' - -import getters from './getters' - -Vue.use(Vuex) - -export default new Vuex.Store({ - modules: { - app, - user, - permission - }, - state: {}, - mutations: {}, - actions: {}, - getters -}) diff --git a/quantdinger_vue/src/store/modules/app.js b/quantdinger_vue/src/store/modules/app.js deleted file mode 100644 index 68f45a2..0000000 --- a/quantdinger_vue/src/store/modules/app.js +++ /dev/null @@ -1,99 +0,0 @@ -import storage from 'store' -import { - SIDEBAR_TYPE, - TOGGLE_MOBILE_TYPE, - TOGGLE_NAV_THEME, - TOGGLE_LAYOUT, - TOGGLE_FIXED_HEADER, - TOGGLE_FIXED_SIDEBAR, - TOGGLE_CONTENT_WIDTH, - TOGGLE_HIDE_HEADER, - TOGGLE_COLOR, - TOGGLE_WEAK, - TOGGLE_MULTI_TAB, - // i18n - APP_LANGUAGE -} from '@/store/mutation-types' -import { loadLanguageAsync } from '@/locales' - -const app = { - state: { - sideCollapsed: false, - isMobile: false, - theme: storage.get(TOGGLE_NAV_THEME, 'light'), // ไปŽ localStorage ่ฏปๅ–ไธป้ข˜๏ผŒ้ป˜่ฎค 'light' - layout: '', - contentWidth: '', - fixedHeader: false, - fixedSidebar: false, - autoHideHeader: false, - color: storage.get(TOGGLE_COLOR, '#13C2C2'), // ไปŽ localStorage ่ฏปๅ–ไธป้ข˜่‰ฒ๏ผŒ้ป˜่ฎค '#13C2C2' - weak: false, - multiTab: true, - lang: 'en-US', - _antLocale: {} - }, - mutations: { - [SIDEBAR_TYPE]: (state, type) => { - state.sideCollapsed = type - storage.set(SIDEBAR_TYPE, type) - }, - [TOGGLE_MOBILE_TYPE]: (state, isMobile) => { - state.isMobile = isMobile - }, - [TOGGLE_NAV_THEME]: (state, theme) => { - state.theme = theme - storage.set(TOGGLE_NAV_THEME, theme) - }, - [TOGGLE_LAYOUT]: (state, mode) => { - state.layout = mode - storage.set(TOGGLE_LAYOUT, mode) - }, - [TOGGLE_FIXED_HEADER]: (state, mode) => { - state.fixedHeader = mode - storage.set(TOGGLE_FIXED_HEADER, mode) - }, - [TOGGLE_FIXED_SIDEBAR]: (state, mode) => { - state.fixedSidebar = mode - storage.set(TOGGLE_FIXED_SIDEBAR, mode) - }, - [TOGGLE_CONTENT_WIDTH]: (state, type) => { - state.contentWidth = type - storage.set(TOGGLE_CONTENT_WIDTH, type) - }, - [TOGGLE_HIDE_HEADER]: (state, type) => { - state.autoHideHeader = type - storage.set(TOGGLE_HIDE_HEADER, type) - }, - [TOGGLE_COLOR]: (state, color) => { - state.color = color - storage.set(TOGGLE_COLOR, color) - }, - [TOGGLE_WEAK]: (state, mode) => { - state.weak = mode - storage.set(TOGGLE_WEAK, mode) - }, - [APP_LANGUAGE]: (state, lang, antd = {}) => { - state.lang = lang - state._antLocale = antd - storage.set(APP_LANGUAGE, lang) - }, - [TOGGLE_MULTI_TAB]: (state, bool) => { - storage.set(TOGGLE_MULTI_TAB, bool) - state.multiTab = bool - } - }, - actions: { - setLang ({ commit }, lang) { - return new Promise((resolve, reject) => { - commit(APP_LANGUAGE, lang) - loadLanguageAsync(lang).then(() => { - resolve() - }).catch((e) => { - reject(e) - }) - }) - } - } -} - -export default app diff --git a/quantdinger_vue/src/store/modules/async-router.js b/quantdinger_vue/src/store/modules/async-router.js deleted file mode 100644 index 7eece42..0000000 --- a/quantdinger_vue/src/store/modules/async-router.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * ๅ‘ๅŽ็ซฏ่ฏทๆฑ‚็”จๆˆท็š„่œๅ•๏ผŒๅŠจๆ€็”Ÿๆˆ่ทฏ็”ฑ - */ -import { constantRouterMap } from '@/config/router.config' -import { generatorDynamicRouter } from '@/router/generator-routers' - -const permission = { - state: { - routers: constantRouterMap, - addRouters: [] - }, - mutations: { - SET_ROUTERS: (state, routers) => { - state.addRouters = routers - state.routers = constantRouterMap.concat(routers) - }, - // Reset routers to force regeneration (used on login/logout) - RESET_ROUTERS: (state) => { - state.addRouters = [] - state.routers = constantRouterMap - } - }, - actions: { - GenerateRoutes ({ commit, rootState }, data) { - return new Promise((resolve, reject) => { - const { token } = data - generatorDynamicRouter(token).then(routers => { - commit('SET_ROUTERS', routers) - resolve() - }).catch(e => { - reject(e) - }) - }) - }, - // Reset routes action - ResetRoutes ({ commit }) { - commit('RESET_ROUTERS') - } - } -} - -export default permission diff --git a/quantdinger_vue/src/store/modules/static-router.js b/quantdinger_vue/src/store/modules/static-router.js deleted file mode 100644 index 874e4fc..0000000 --- a/quantdinger_vue/src/store/modules/static-router.js +++ /dev/null @@ -1,54 +0,0 @@ -import { asyncRouterMap, constantRouterMap } from '@/config/router.config' -import cloneDeep from 'lodash.clonedeep' - -/** - * ๅ•่ดฆๆˆทๅคš่ง’่‰ฒๆ—ถ๏ผŒไฝฟ็”จ่ฏฅๆ–นๆณ•ๅฏ่ฟ‡ๆปค่ง’่‰ฒไธๅญ˜ๅœจ็š„่œๅ• - * - * @param roles - * @param route - * @returns {*} - */ -// eslint-disable-next-line -function hasRole(roles, route) { - if (route.meta && route.meta.roles) { - return route.meta.roles.includes(roles.id) - } else { - return true - } -} - -function filterAsyncRouter (routerMap, role) { - // ไธ่ฟ›่กŒๆƒ้™่ฟ‡ๆปค๏ผŒ็›ดๆŽฅ่ฟ”ๅ›žๆ‰€ๆœ‰่ทฏ็”ฑ๏ผˆๅŽ็ซฏไผš้ชŒ่ฏtoken๏ผ‰ - return routerMap.map(route => { - if (route.children && route.children.length) { - route.children = filterAsyncRouter(route.children, role) - } - return route - }) -} - -const permission = { - state: { - routers: constantRouterMap, - addRouters: [] - }, - mutations: { - SET_ROUTERS: (state, routers) => { - state.addRouters = routers - state.routers = constantRouterMap.concat(routers) - } - }, - actions: { - GenerateRoutes ({ commit }, data) { - return new Promise(resolve => { - const routerMap = cloneDeep(asyncRouterMap) - // ไธ่ฟ›่กŒๆƒ้™่ฟ‡ๆปค๏ผŒ็›ดๆŽฅ่ฟ”ๅ›žๆ‰€ๆœ‰่ทฏ็”ฑ๏ผˆๅŽ็ซฏไผš้ชŒ่ฏtoken๏ผ‰ - const accessedRouters = filterAsyncRouter(routerMap, null) - commit('SET_ROUTERS', accessedRouters) - resolve() - }) - } - } -} - -export default permission diff --git a/quantdinger_vue/src/store/modules/user.js b/quantdinger_vue/src/store/modules/user.js deleted file mode 100644 index 661a23e..0000000 --- a/quantdinger_vue/src/store/modules/user.js +++ /dev/null @@ -1,270 +0,0 @@ -import storage from 'store' -import expirePlugin from 'store/plugins/expire' -import { login, logout, getUserInfo } from '@/api/login' -import { ACCESS_TOKEN, USER_INFO, USER_ROLES } from '@/store/mutation-types' -import { welcome } from '@/utils/util' - -storage.addPlugin(expirePlugin) - -const DEFAULT_ROLE = { id: 'default', permissionList: [] } - -function normalizeRoles (roles) { - if (!roles) return [] - if (Array.isArray(roles)) return roles - return [roles] -} - -function getStoredInfo () { - const info = storage.get(USER_INFO) || {} - return (info && typeof info === 'object') ? info : {} -} - -function getStoredRoles () { - const roles = storage.get(USER_ROLES) || [] - return normalizeRoles(roles) -} - -function getStoredToken () { - const token = storage.get(ACCESS_TOKEN) - return typeof token === 'string' ? token : (token && token.token) ? token.token : token -} - -const initialInfo = getStoredInfo() -// If is_demo is missing (legacy cache), force roles to empty to trigger GetInfo in permission.js -let initialRoles = getStoredRoles() -if (initialInfo && typeof initialInfo.is_demo === 'undefined') { - initialRoles = [] -} -const initialToken = getStoredToken() || '' -const initialName = initialInfo.nickname || initialInfo.username || '' -const initialAvatar = initialInfo.avatar || '' -const initialWelcome = initialName ? welcome() : '' -const user = { - state: { - token: initialToken, - name: initialName, - welcome: initialWelcome, - avatar: initialAvatar, - roles: initialRoles, - info: initialInfo - }, - - mutations: { - SET_TOKEN: (state, token) => { - state.token = token - }, - SET_NAME: (state, { name, welcome }) => { - state.name = name - state.welcome = welcome - }, - SET_AVATAR: (state, avatar) => { - state.avatar = avatar - }, - SET_ROLES: (state, roles) => { - state.roles = roles - }, - SET_INFO: (state, info) => { - state.info = info - } - }, - - actions: { - // ็™ปๅฝ• - Login ({ commit, dispatch }, userInfo) { - return new Promise((resolve, reject) => { - login(userInfo).then(response => { - // ้€‚้… Python ๅŽ็ซฏๅ“ๅบ”ๆ ผๅผ - if (response && response.code === 1 && response.data) { - const result = response.data - const token = result.token - const info = result.userinfo || {} - - const expiresAt = new Date().getTime() + 7 * 24 * 60 * 60 * 1000 - storage.set(ACCESS_TOKEN, token, expiresAt) - commit('SET_TOKEN', token) - commit('SET_INFO', info) - storage.set(USER_INFO, info, expiresAt) - - // ่ฎพ็ฝฎๅŸบๆœฌไฟกๆฏ - const name = info.nickname || info.username || 'User' - commit('SET_NAME', { name: name, welcome: welcome() }) - commit('SET_AVATAR', info.avatar || '/avatar2.jpg') - - // ไปŽๆœๅŠกๅ™จ่ฟ”ๅ›ž็š„่ง’่‰ฒไฟกๆฏ่ฎพ็ฝฎ่ง’่‰ฒ - let roles = [DEFAULT_ROLE] - if (info.role) { - // role: { id: 'admin', permissions: [...] } - const roleId = info.role.id || info.role - const permissions = info.role.permissions || [] - roles = [{ - id: roleId, - permissionList: permissions.length > 0 ? permissions : ['dashboard'] - }] - } - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, expiresAt) - - // ้‡็ฝฎ่ทฏ็”ฑ๏ผŒๅผบๅˆถ้‡ๆ–ฐ็”Ÿๆˆ๏ผˆๆ นๆฎๆ–ฐ็”จๆˆท็š„่ง’่‰ฒ๏ผ‰ - dispatch('ResetRoutes') - - resolve(response) - } else { - reject(new Error((response && response.msg) || 'Login failed')) - } - }).catch(error => { - reject(error) - }) - }) - }, - - // Web3 ็™ปๅฝ•ๅฎŒๆˆๅŽ็š„็ปŸไธ€ๅค„็† - Web3LoginFinalize ({ commit }, payload) { - return new Promise((resolve, reject) => { - try { - const { token, userInfo } = payload - if (!token || !userInfo) { - reject(new Error('็™ปๅฝ•ๆ•ฐๆฎๅผ‚ๅธธ')) - return - } - storage.set(ACCESS_TOKEN, token, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - commit('SET_TOKEN', token) - commit('SET_INFO', userInfo) - - if (userInfo.nickname) { - commit('SET_NAME', { name: userInfo.nickname, welcome: welcome() }) - } else if (userInfo.username) { - commit('SET_NAME', { name: userInfo.username, welcome: welcome() }) - } - - if (userInfo.avatar) { - commit('SET_AVATAR', userInfo.avatar) - } - - if (userInfo.role) { - commit('SET_ROLES', userInfo.role) - } else if (userInfo.roles) { - commit('SET_ROLES', userInfo.roles) - } else { - commit('SET_ROLES', [{ id: 'default', permissionList: [] }]) - } - - resolve() - } catch (e) { - reject(e) - } - }) - }, - - // ๅˆทๆ–ฐ็”จๆˆทไฟกๆฏ - FetchUserInfo ({ commit }) { - return new Promise((resolve, reject) => { - getUserInfo().then(res => { - if (res && res.code === 1 && res.data) { - const info = res.data - commit('SET_INFO', info) - if (info.nickname) { - commit('SET_NAME', { name: info.nickname, welcome: welcome() }) - } else if (info.username) { - commit('SET_NAME', { name: info.username, welcome: welcome() }) - } - if (info.avatar) { - commit('SET_AVATAR', info.avatar) - } - resolve(info) - } else { - reject(new Error((res && res.msg) || '่Žทๅ–็”จๆˆทไฟกๆฏๅคฑ่ดฅ')) - } - }).catch(err => reject(err)) - }) - }, - - // ่Žทๅ–็”จๆˆทไฟกๆฏ๏ผˆไปŽ store ไธญ่Žทๅ–๏ผŒไธๅ†่ฏทๆฑ‚ๆŽฅๅฃ๏ผ‰ - GetInfo ({ commit, state }) { - return new Promise((resolve, reject) => { - // ็”จๆˆทไฟกๆฏๅทฒ็ปๅœจ็™ปๅฝ•ๆ—ถไฟๅญ˜ๅˆฐ store ไธญ๏ผŒ็›ดๆŽฅ่ฟ”ๅ›ž - // ๅขžๅŠ  check: ๅฟ…้กปๅŒ…ๅซ is_demo ๅญ—ๆฎต๏ผŒๅฆๅˆ™่ง†ไธบ่ฟ‡ๆœŸ็ผ“ๅญ˜๏ผŒๅผบๅˆถๅˆทๆ–ฐ - if (state.info && Object.keys(state.info).length > 0 && typeof state.info.is_demo !== 'undefined') { - // ่กฅๅ…จ Roles - const info = state.info - if (info.role) { - const roles = normalizeRoles(info.role) - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } else if (info.roles) { - const roles = normalizeRoles(info.roles) - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } else { - commit('SET_ROLES', [DEFAULT_ROLE]) - storage.set(USER_ROLES, [DEFAULT_ROLE], new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } - resolve(state.info) - } else { - // ๅฐ่ฏ•ไธปๅŠจๆ‹‰ๅ–ไธ€ๆฌก - getUserInfo().then(res => { - if (res && res.code === 1 && res.data) { - const info = res.data - commit('SET_INFO', info) - storage.set(USER_INFO, info, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - if (info.nickname) { - commit('SET_NAME', { name: info.nickname, welcome: welcome() }) - } else if (info.username) { - commit('SET_NAME', { name: info.username, welcome: welcome() }) - } - if (info.avatar) { - commit('SET_AVATAR', info.avatar) - } - // ๅ…ณ้”ฎไฟฎๅค๏ผš่ฎพ็ฝฎ่ง’่‰ฒ๏ผŒ้˜ฒๆญข่ทฏ็”ฑๅฎˆๅซๆญปๅพช็Žฏ - if (info.role) { - const roles = normalizeRoles(info.role) - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } else if (info.roles) { - const roles = normalizeRoles(info.roles) - commit('SET_ROLES', roles) - storage.set(USER_ROLES, roles, new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } else { - commit('SET_ROLES', [DEFAULT_ROLE]) - storage.set(USER_ROLES, [DEFAULT_ROLE], new Date().getTime() + 7 * 24 * 60 * 60 * 1000) - } - resolve(info) - } else { - reject(new Error((res && res.msg) || '็”จๆˆทไฟกๆฏไธๅญ˜ๅœจ')) - } - }).catch(err => reject(err)) - } - }) - }, - - // ็™ปๅ‡บ - Logout ({ commit, dispatch }) { - return new Promise((resolve) => { - logout().then(() => { - commit('SET_TOKEN', '') - commit('SET_ROLES', []) - commit('SET_INFO', {}) - commit('SET_NAME', { name: '', welcome: '' }) - commit('SET_AVATAR', '') - storage.remove(ACCESS_TOKEN) - storage.remove(USER_INFO) - storage.remove(USER_ROLES) - // ้‡็ฝฎ่ทฏ็”ฑ - dispatch('ResetRoutes') - resolve() - }).catch(() => { - // ็™ปๅ‡บๅคฑ่ดฅๆ—ถไนŸ็ปง็ปญๆ‰ง่กŒ๏ผŒ็กฎไฟๆธ…็†ๆœฌๅœฐ็Šถๆ€ - storage.remove(ACCESS_TOKEN) - storage.remove(USER_INFO) - storage.remove(USER_ROLES) - // ้‡็ฝฎ่ทฏ็”ฑ - dispatch('ResetRoutes') - resolve() - }).finally(() => { - }) - }) - } - - } -} - -export default user diff --git a/quantdinger_vue/src/store/mutation-types.js b/quantdinger_vue/src/store/mutation-types.js deleted file mode 100644 index 2ddfdfc..0000000 --- a/quantdinger_vue/src/store/mutation-types.js +++ /dev/null @@ -1,26 +0,0 @@ -export const ACCESS_TOKEN = 'Access-Token' -export const USER_INFO = 'User-Info' -export const USER_ROLES = 'User-Roles' - -export const SIDEBAR_TYPE = 'sidebar_type' -export const TOGGLE_MOBILE_TYPE = 'is_mobile' -export const TOGGLE_NAV_THEME = 'nav_theme' -export const TOGGLE_LAYOUT = 'layout' -export const TOGGLE_FIXED_HEADER = 'fixed_header' -export const TOGGLE_FIXED_SIDEBAR = 'fixed_sidebar' -export const TOGGLE_CONTENT_WIDTH = 'content_width' -export const TOGGLE_HIDE_HEADER = 'auto_hide_header' -export const TOGGLE_COLOR = 'color' -export const TOGGLE_WEAK = 'weak' -export const TOGGLE_MULTI_TAB = 'multi_tab' -export const APP_LANGUAGE = 'app_language' - -export const CONTENT_WIDTH_TYPE = { - Fluid: 'Fluid', - Fixed: 'Fixed' -} - -export const NAV_THEME = { - LIGHT: 'light', - DARK: 'dark' -} diff --git a/quantdinger_vue/src/utils/axios.js b/quantdinger_vue/src/utils/axios.js deleted file mode 100644 index ecccd85..0000000 --- a/quantdinger_vue/src/utils/axios.js +++ /dev/null @@ -1,34 +0,0 @@ -const VueAxios = { - vm: {}, - // eslint-disable-next-line no-unused-vars - install (Vue, instance) { - if (this.installed) { - return - } - this.installed = true - - if (!instance) { - // eslint-disable-next-line no-console - return - } - - Vue.axios = instance - - Object.defineProperties(Vue.prototype, { - axios: { - get: function get () { - return instance - } - }, - $http: { - get: function get () { - return instance - } - } - }) - } -} - -export { - VueAxios -} diff --git a/quantdinger_vue/src/utils/codeDecrypt.js b/quantdinger_vue/src/utils/codeDecrypt.js deleted file mode 100644 index 2faaab8..0000000 --- a/quantdinger_vue/src/utils/codeDecrypt.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * ๆŒ‡ๆ ‡ไปฃ็ ่งฃๅฏ†ๅทฅๅ…ท - * ็”จไบŽ่งฃๅฏ†็”จๆˆท่ดญไนฐ็š„ๅŠ ๅฏ†ๆŒ‡ๆ ‡ไปฃ็  - */ - -import CryptoJS from 'crypto-js' -import request from '@/utils/request' - -/** - * ่งฃๅฏ†ๆŒ‡ๆ ‡ไปฃ็  - * - * @param {string} encryptedCode - base64็ผ–็ ็š„ๅŠ ๅฏ†ไปฃ็  - * @param {number} userId - ็”จๆˆทID - * @param {number} indicatorId - ๆŒ‡ๆ ‡ID - * @param {string} serverSecret - ๆœๅŠกๅ™จๅฏ†้’ฅ๏ผˆ้œ€่ฆไปŽๅŽ็ซฏ่Žทๅ–ๆˆ–้…็ฝฎ๏ผ‰ - * @returns {string} - ่งฃๅฏ†ๅŽ็š„ไปฃ็  - */ -export function decryptCode (encryptedCode, userId, indicatorId, encryptedKey) { - if (!encryptedCode || !userId || !indicatorId || !encryptedKey) { - return encryptedCode - } - - try { - // ่งฃ็ base64ๅŠ ๅฏ†ไปฃ็  - const combined = CryptoJS.enc.Base64.parse(encryptedCode) - - // ๆๅ–IV๏ผˆๅ‰16ๅญ—่Š‚๏ผ‰ๅ’ŒๅŠ ๅฏ†ๆ•ฐๆฎ - const ivWords = CryptoJS.lib.WordArray.create(combined.words.slice(0, 4)) // ๅ‰16ๅญ—่Š‚๏ผˆ4ไธชword๏ผ‰ - const encryptedWords = CryptoJS.lib.WordArray.create(combined.words.slice(4)) // ๅ‰ฉไฝ™้ƒจๅˆ† - - // ่งฃๅฏ†ๅฏ†้’ฅ๏ผˆไปŽๅŽ็ซฏ่Žทๅ–็š„base64็ผ–็ ๅฏ†้’ฅ๏ผ‰ - // encryptedKey ๆ˜ฏไปŽๅŽ็ซฏ่Žทๅ–็š„ base64 ็ผ–็ ็š„ๅฏ†้’ฅ๏ผŒ็›ดๆŽฅ่งฃ็ ไฝฟ็”จ - const key = CryptoJS.enc.Base64.parse(encryptedKey) - - // ่งฃๅฏ† - const decrypted = CryptoJS.AES.decrypt( - { ciphertext: encryptedWords }, - key, - { - iv: ivWords, - mode: CryptoJS.mode.CBC, - padding: CryptoJS.pad.Pkcs7 - } - ) - - // ่ฝฌๆขไธบๅญ—็ฌฆไธฒ - const decryptedText = decrypted.toString(CryptoJS.enc.Utf8) - - if (!decryptedText) { - return encryptedCode - } - - return decryptedText - } catch (error) { - // ่งฃๅฏ†ๅคฑ่ดฅ๏ผŒ่ฟ”ๅ›žๅŽŸไปฃ็ ๏ผˆๅ‘ๅŽๅ…ผๅฎน๏ผ‰ - return encryptedCode - } -} - -/** - * ไปŽๅŽ็ซฏ่Žทๅ–่งฃๅฏ†ๅฏ†้’ฅ๏ผˆๅŠจๆ€ๅฏ†้’ฅ๏ผ‰ - * - * @param {number} userId - ็”จๆˆทID - * @param {number} indicatorId - ๆŒ‡ๆ ‡ID - * @returns {Promise} - ่งฃๅฏ†ๅฏ†้’ฅ๏ผˆbase64็ผ–็ ๏ผ‰ - */ -export async function getDecryptKey (userId, indicatorId) { - if (!userId || !indicatorId) { - throw new Error('็”จๆˆทIDๅ’ŒๆŒ‡ๆ ‡IDไธ่ƒฝไธบ็ฉบ') - } - - try { - // ๅŠจๆ€่ฏทๆฑ‚ๆ–นๅผ๏ผšไปŽๅŽ็ซฏAPI่Žทๅ– - const response = await request({ - url: '/api/indicator/getDecryptKey', - method: 'post', - data: { - userid: userId, - indicatorId: indicatorId - } - }) - - if (response.code === 1 && response.data && response.data.key) { - // ่ฟ”ๅ›žbase64็ผ–็ ็š„ๅฏ†้’ฅ - return response.data.key - } else { - throw new Error(response.msg || '่Žทๅ–่งฃๅฏ†ๅฏ†้’ฅๅคฑ่ดฅ') - } - } catch (error) { - // ๅฆ‚ๆžœๅŽ็ซฏๆŽฅๅฃๅคฑ่ดฅ๏ผŒๆŠ›ๅ‡บ้”™่ฏฏ๏ผŒไธไฝฟ็”จๅค‡็”จๅฏ†้’ฅ๏ผˆๆ›ดๅฎ‰ๅ…จ๏ผ‰ - throw new Error('ๆ— ๆณ•่Žทๅ–่งฃๅฏ†ๅฏ†้’ฅ๏ผŒ่ฏทๆฃ€ๆŸฅ็ฝ‘็ปœ่ฟžๆŽฅๆˆ–่”็ณป็ฎก็†ๅ‘˜: ' + (error.message || 'ๆœช็Ÿฅ้”™่ฏฏ')) - } -} - -/** - * ๆ™บ่ƒฝ่งฃๅฏ†ไปฃ็ ๏ผˆ่‡ชๅŠจ่Žทๅ–ๅฏ†้’ฅ๏ผ‰ - * - * @param {string} encryptedCode - ๅŠ ๅฏ†็š„ไปฃ็  - * @param {number} userId - ็”จๆˆทID - * @param {number} indicatorId - ๆŒ‡ๆ ‡ID - * @returns {Promise} - ่งฃๅฏ†ๅŽ็š„ไปฃ็  - */ -export async function decryptCodeAuto (encryptedCode, userId, indicatorId) { - // ไปŽๅŽ็ซฏๅŠจๆ€่Žทๅ–่งฃๅฏ†ๅฏ†้’ฅ๏ผˆbase64็ผ–็ ๏ผ‰ - const encryptedKey = await getDecryptKey(userId, indicatorId) - // ไฝฟ็”จ่Žทๅ–็š„ๅฏ†้’ฅ่งฃๅฏ† - return decryptCode(encryptedCode, userId, indicatorId, encryptedKey) -} - -/** - * ๆฃ€ๆŸฅไปฃ็ ๆ˜ฏๅฆ้œ€่ฆ่งฃๅฏ† - * - * @param {string} code - ไปฃ็  - * @param {number} isEncrypted - ๆ˜ฏๅฆๅŠ ๅฏ†ๆ ‡่ฎฐ - * @returns {boolean} - */ -export function needsDecrypt (code, isEncrypted) { - // ๅฆ‚ๆžœๆ˜Ž็กฎๆ ‡่ฎฐไธบๅŠ ๅฏ†๏ผŒๆˆ–่€…ไปฃ็ ้•ฟๅบฆๅพˆ้•ฟไธ”็ฌฆๅˆbase64ๆ ผๅผ๏ผŒๅฏ่ƒฝ้œ€่ฆ่งฃๅฏ† - if (isEncrypted === 1 || isEncrypted === true) { - return true - } - - // ็ฎ€ๅ•ๆฃ€ๆŸฅ๏ผšๅŠ ๅฏ†ไปฃ็ ้€šๅธธ่พƒ้•ฟ๏ผˆbase64็ผ–็ ไผšๅขžๅคง็บฆ33%๏ผ‰ - if (code && code.length > 100) { - // ๅฐ่ฏ•base64่งฃ็ ๆฃ€ๆŸฅ - try { - const decoded = atob(code) - // ๅฆ‚ๆžœ่งฃ็ ๅŽ็š„้•ฟๅบฆๅˆ็†๏ผŒๅฏ่ƒฝๆ˜ฏๅŠ ๅฏ†็š„ - if (decoded.length > 50) { - return true - } - } catch (e) { - // ไธๆ˜ฏbase64๏ผŒไธ้œ€่ฆ่งฃๅฏ† - } - } - - return false -} diff --git a/quantdinger_vue/src/utils/domUtil.js b/quantdinger_vue/src/utils/domUtil.js deleted file mode 100644 index be93027..0000000 --- a/quantdinger_vue/src/utils/domUtil.js +++ /dev/null @@ -1,21 +0,0 @@ -import config from '@/config/defaultSettings' - -export const setDocumentTitle = function (title) { - document.title = title - const ua = navigator.userAgent - // eslint-disable-next-line - const regex = /\bMicroMessenger\/([\d\.]+)/ - if (regex.test(ua) && /ip(hone|od|ad)/i.test(ua)) { - const i = document.createElement('iframe') - i.src = '/favicon.ico' - i.style.display = 'none' - i.onload = function () { - setTimeout(function () { - i.remove() - }, 9) - } - document.body.appendChild(i) - } -} - -export const domTitle = config.title diff --git a/quantdinger_vue/src/utils/filter.js b/quantdinger_vue/src/utils/filter.js deleted file mode 100644 index 45702c6..0000000 --- a/quantdinger_vue/src/utils/filter.js +++ /dev/null @@ -1,20 +0,0 @@ -import Vue from 'vue' -import moment from 'moment' -import 'moment/locale/zh-cn' -moment.locale('zh-cn') - -Vue.filter('NumberFormat', function (value) { - if (!value) { - return '0' - } - const intPartFormat = value.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') // ๅฐ†ๆ•ดๆ•ฐ้ƒจๅˆ†้€ขไธ‰ไธ€ๆ–ญ - return intPartFormat -}) - -Vue.filter('dayjs', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { - return moment(dataStr).format(pattern) -}) - -Vue.filter('moment', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { - return moment(dataStr).format(pattern) -}) diff --git a/quantdinger_vue/src/utils/request.js b/quantdinger_vue/src/utils/request.js deleted file mode 100644 index b1d05cd..0000000 --- a/quantdinger_vue/src/utils/request.js +++ /dev/null @@ -1,197 +0,0 @@ -import axios from 'axios' -// import store from '@/store' -import storage from 'store' -import notification from 'ant-design-vue/es/notification' -import { VueAxios } from './axios' -import { ACCESS_TOKEN, USER_INFO, USER_ROLES } from '@/store/mutation-types' - -// PHPSESSID ๅญ˜ๅ‚จ้”ฎๅ -const PHPSESSID_KEY = 'PHPSESSID' -// Locale storage key used by vue-i18n (see src/locales/index.js) -const LOCALE_KEY = 'lang' - -// Prevent multiple concurrent 401 redirects -let isRedirectingToLogin = false - -/** - * ่Žทๅ– token๏ผŒๅค„็† token ๅฏ่ƒฝๆ˜ฏๅญ—็ฌฆไธฒๆˆ–ๅฏน่ฑก็š„ๆƒ…ๅ†ต - */ -function getToken () { - let token = storage.get(ACCESS_TOKEN) - if (!token) { - return null - } - if (typeof token !== 'string') { - // ๅฆ‚ๆžœๆ˜ฏๅฏน่ฑก๏ผŒๅฐ่ฏ•่Žทๅ– token ๅฑžๆ€ง - if (token && typeof token === 'object') { - token = token.token || token.value || null - } else { - token = null - } - } - // ็กฎไฟ token ๆ˜ฏๅญ—็ฌฆไธฒไธ”ไธไธบ็ฉบ - return (typeof token === 'string' && token.length > 0) ? token : null -} - -// ๅˆ›ๅปบ axios ๅฎžไพ‹ -const request = axios.create({ - // API ่ฏทๆฑ‚็š„้ป˜่ฎคๅ‰็ผ€ - // ็”Ÿไบง็Žฏๅขƒๅบ”็”ฑ Nginx ๅค„็†๏ผŒๅผ€ๅ‘็Žฏๅขƒ็”ฑ devServer proxy ๅค„็† - baseURL: '/', - timeout: 30000, // Default request timeout 30s - withCredentials: true // ๅ…่ฎธๆบๅธฆ cookies -}) - -// Extended timeout for long-running AI analysis APIs -export const ANALYSIS_TIMEOUT = 180000 // 3 minutes for AI analysis - -// ๅผ‚ๅธธๆ‹ฆๆˆชๅค„็†ๅ™จ -const errorHandler = (error) => { - if (error.response) { - const data = error.response.data - if (error.response.status === 403) { - notification.error({ - message: '(Demo Mode)', - description: data.msg || data.message || 'Read-only in demo mode' - }) - } - if (error.response.status === 401 && !(data.result && data.result.isLogin)) { - // Token invalid/expired: MUST clear local auth state, otherwise route guard will - // detect a stale token and immediately bounce user away from login page. - if (!isRedirectingToLogin) { - isRedirectingToLogin = true - try { - storage.remove(ACCESS_TOKEN) - storage.remove(USER_INFO) - storage.remove(USER_ROLES) - storage.remove(PHPSESSID_KEY) - } catch (e) {} - - notification.error({ - message: 'Unauthorized', - description: data.msg || data.message || 'Token invalid or expired, please login again.' - }) - - // ้กน็›ฎไฝฟ็”จ hash ๆจกๅผ๏ผŒ้œ€่ฆ่ทณ่ฝฌๅˆฐ /#/user/login - const curHash = window.location.hash || '' - if (!curHash.includes('/user/login')) { - const redirect = encodeURIComponent(curHash.replace('#', '') || '/') - window.location.assign(`/#/user/login?redirect=${redirect}`) - } - } - } - } - return Promise.reject(error) -} - -// request interceptor -request.interceptors.request.use(config => { - // ไฝฟ็”จ็ปŸไธ€็š„ token ่Žทๅ–ๅ‡ฝๆ•ฐ - const token = getToken() - const lang = storage.get(LOCALE_KEY) || 'en-US' - - // Tell backend which UI language user is using, so AI reports can match it. - // We keep both a custom header and the standard Accept-Language for compatibility. - config.headers['X-App-Lang'] = lang - config.headers['Accept-Language'] = lang - - // ๅฆ‚ๆžœ token ๅญ˜ๅœจ๏ผŒๅฐ† token ๆทปๅŠ ๅˆฐ่ฏทๆฑ‚ๅคด - if (token) { - // ไฝฟ็”จ Authorization header๏ผŒๆ ผๅผไธบ Bearer {token} - config.headers['Authorization'] = `Bearer ${token}` - // ๅŒๆ—ถไฟ็•™ๅŽŸๆœ‰็š„ Access-Token header๏ผˆๅฆ‚ๆžœๅŽ็ซฏ้œ€่ฆ๏ผ‰ - config.headers[ACCESS_TOKEN] = token - // ๅ…ผๅฎนๅŽ็ซฏ่ฆๆฑ‚็š„ token ๅคด - config.headers['token'] = token - } else { - // ่ฐƒ่ฏ•๏ผšๅฆ‚ๆžœ token ไธๅญ˜ๅœจ๏ผŒ่ฎฐๅฝ•ๆ—ฅๅฟ— - if (config.url && config.url.includes('/api/auth/info')) { - const rawToken = storage.get(ACCESS_TOKEN) - console.warn('Token missing for /api/auth/info request') - console.warn('Raw token from storage:', rawToken) - console.warn('Token type:', typeof rawToken) - console.warn('Token value:', rawToken) - } - } - - // ้˜ฒๆญข็ผ“ๅญ˜ๅฏผ่‡ด็š„ 304๏ผšไธบ่ฏทๆฑ‚ๆทปๅŠ ็ฆๆญข็ผ“ๅญ˜็š„ๅคด - config.headers['Cache-Control'] = 'no-cache' - config.headers['Pragma'] = 'no-cache' - config.headers['If-Modified-Since'] = '0' - - // ไธบ GET ่ฏทๆฑ‚ๆทปๅŠ ๆ—ถ้—ดๆˆณๅ‚ๆ•ฐ๏ผŒ้ฟๅ…็ผ“ๅญ˜ - if ((config.method || 'get').toLowerCase() === 'get') { - const ts = Date.now() - config.params = Object.assign({}, config.params || {}, { _t: ts }) - } - - // ๆ‰‹ๅŠจ่ฎพ็ฝฎ PHPSESSID cookie๏ผŒ็กฎไฟๆฏๆฌก่ฏทๆฑ‚ไฝฟ็”จ็›ธๅŒ็š„ session - // ๆณจๆ„๏ผšๆต่งˆๅ™จไธๅ…่ฎธๆ‰‹ๅŠจ่ฎพ็ฝฎ Cookie ่ฏทๆฑ‚ๅคด๏ผŒ้œ€่ฆ้€š่ฟ‡ document.cookie ่ฎพ็ฝฎ - // ไฝ†็”ฑไบŽ่ทจๅŸŸ้™ๅˆถ๏ผŒๅฏ่ƒฝๆ— ๆณ•็›ดๆŽฅ่ฎพ็ฝฎ cookie๏ผŒไธป่ฆไพ่ต– withCredentials: true - const phpsessid = storage.get(PHPSESSID_KEY) - if (phpsessid && typeof document !== 'undefined') { - // ๆฃ€ๆŸฅๅฝ“ๅ‰ document.cookie ไธญ็š„ PHPSESSID - const currentCookies = document.cookie - const currentPhpsessidMatch = currentCookies.match(/PHPSESSID=([^;]+)/i) - const currentPhpsessid = currentPhpsessidMatch ? currentPhpsessidMatch[1].trim() : null - - // ๅฆ‚ๆžœๅฝ“ๅ‰ cookie ไธญ็š„ PHPSESSID ไธŽไฟๅญ˜็š„ไธไธ€่‡ด๏ผŒๅฐ่ฏ•ๆ›ดๆ–ฐ - // ๆณจๆ„๏ผš่ทจๅŸŸๆƒ…ๅ†ตไธ‹ๅฏ่ƒฝๆ— ๆณ•่ฎพ็ฝฎ cookie๏ผŒ่ฟ™ๅ–ๅ†ณไบŽ CORS ้…็ฝฎ - if (!currentPhpsessid || currentPhpsessid !== phpsessid) { - // ๅฐ่ฏ•่ฎพ็ฝฎ cookie๏ผˆๅฏ่ƒฝๅ› ไธบ่ทจๅŸŸ่€Œๅคฑ่ดฅ๏ผŒไฝ†ไธๅฝฑๅ“ withCredentials ็š„ๅทฅไฝœ๏ผ‰ - try { - // ๅฐ่ฏ•่ฎพ็ฝฎๅธฆ domain ็š„ cookie๏ผˆไป…ๅฝ“ๅœจ็›ธๅŒๅŸŸๅไธ‹ๆ—ถๆœ‰ๆ•ˆ๏ผ‰ - if (window.location.hostname.includes('quantdinger.com')) { - document.cookie = `PHPSESSID=${phpsessid}; path=/; domain=.quantdinger.com; SameSite=None; Secure` - } else { - // ่ทจๅŸŸๆƒ…ๅ†ตไธ‹๏ผŒๅช่ƒฝไพ่ต– withCredentials: true ๅ’ŒๆœๅŠกๅ™จ่ฎพ็ฝฎ - // ่ฟ™้‡Œๅฐ่ฏ•่ฎพ็ฝฎ๏ผŒไฝ†ๅฏ่ƒฝไธไผšๆˆๅŠŸ - document.cookie = `PHPSESSID=${phpsessid}; path=/; SameSite=None; Secure` - } - } catch (e) { - // ่ฎพ็ฝฎๅคฑ่ดฅๆ˜ฏๆญฃๅธธ็š„๏ผˆ่ทจๅŸŸ้™ๅˆถ๏ผ‰๏ผŒไธป่ฆไพ่ต– withCredentials - } - } - } - - return config -}, errorHandler) - -// response interceptor -request.interceptors.response.use((response) => { - // ไปŽๅ“ๅบ”ไธญๆๅ– PHPSESSID ๅนถไฟๅญ˜ - // ็”ฑไบŽๆต่งˆๅ™จๅฎ‰ๅ…จ้™ๅˆถ๏ผŒๆ— ๆณ•็›ดๆŽฅ่ฏปๅ– set-cookie ๅคด๏ผŒ้œ€่ฆ้€š่ฟ‡ document.cookie ่Žทๅ– - try { - if (typeof document !== 'undefined') { - // ไปŽ document.cookie ่Žทๅ– PHPSESSID๏ผˆๆต่งˆๅ™จ่‡ชๅŠจ่ฎพ็ฝฎ็š„๏ผ‰ - const cookies = document.cookie - const phpsessidMatch = cookies.match(/PHPSESSID=([^;]+)/i) - if (phpsessidMatch && phpsessidMatch[1]) { - const phpsessid = phpsessidMatch[1].trim() - // ไฟๅญ˜ PHPSESSID ๅˆฐ storage๏ผŒๆœ‰ๆ•ˆๆœŸ 24 ๅฐๆ—ถ - const savedPhpsessid = storage.get(PHPSESSID_KEY) - // ๅฆ‚ๆžœ PHPSESSID ๅ‘็”Ÿๅ˜ๅŒ–๏ผŒๆ›ดๆ–ฐไฟๅญ˜็š„ๅ€ผ - if (!savedPhpsessid || savedPhpsessid !== phpsessid) { - storage.set(PHPSESSID_KEY, phpsessid, new Date().getTime() + 24 * 60 * 60 * 1000) - } - } - } - } catch (e) { - } - - return response.data -}, errorHandler) - -const installer = { - vm: {}, - install (Vue) { - Vue.use(VueAxios, request) - } -} - -export default request - -export { - installer as VueAxios, - request as axios -} diff --git a/quantdinger_vue/src/utils/routeConvert.js b/quantdinger_vue/src/utils/routeConvert.js deleted file mode 100644 index e88b0d6..0000000 --- a/quantdinger_vue/src/utils/routeConvert.js +++ /dev/null @@ -1,30 +0,0 @@ -import cloneDeep from 'lodash.clonedeep' - -export function convertRoutes (nodes) { - if (!nodes) return null - - nodes = cloneDeep(nodes) - - let queue = Array.isArray(nodes) ? nodes.concat() : [nodes] - - while (queue.length) { - const levelSize = queue.length - - for (let i = 0; i < levelSize; i++) { - const node = queue.shift() - - if (!node.children || !node.children.length) continue - - node.children.forEach(child => { - // ่ฝฌๅŒ–็›ธๅฏน่ทฏๅพ„ - if (child.path[0] !== '/' && !child.path.startsWith('http')) { - child.path = node.path.replace(/(\w*)[/]*$/, `$1/${child.path}`) - } - }) - - queue = queue.concat(node.children) - } - } - - return nodes -} diff --git a/quantdinger_vue/src/utils/screenLog.js b/quantdinger_vue/src/utils/screenLog.js deleted file mode 100644 index a0386ac..0000000 --- a/quantdinger_vue/src/utils/screenLog.js +++ /dev/null @@ -1,4 +0,0 @@ -/* eslint-disable */ -export const printANSI = () => { - -} diff --git a/quantdinger_vue/src/utils/util.js b/quantdinger_vue/src/utils/util.js deleted file mode 100644 index 2b77158..0000000 --- a/quantdinger_vue/src/utils/util.js +++ /dev/null @@ -1,95 +0,0 @@ -export function timeFix () { - const time = new Date() - const hour = time.getHours() - return hour < 12 ? 'Good morning' : hour < 18 ? 'Good afternoon' : 'Good evening' -} - -export function welcome () { - const arr = ['ไผ‘ๆฏไธ€ไผšๅ„ฟๅง', 'ๅ‡†ๅค‡ๅƒไป€ไนˆๅ‘ข?', '่ฆไธ่ฆๆ‰“ไธ€ๆŠŠ DOTA', 'ๆˆ‘็Œœไฝ ๅฏ่ƒฝ็ดฏไบ†'] - const index = Math.floor(Math.random() * arr.length) - return arr[index] -} - -/** - * ่งฆๅ‘ window.resize - */ -export function triggerWindowResizeEvent () { - const event = document.createEvent('HTMLEvents') - event.initEvent('resize', true, true) - event.eventType = 'message' - window.dispatchEvent(event) -} - -export function handleScrollHeader (callback) { - let timer = 0 - - let beforeScrollTop = window.pageYOffset - callback = callback || function () {} - window.addEventListener( - 'scroll', - event => { - clearTimeout(timer) - timer = setTimeout(() => { - let direction = 'up' - const afterScrollTop = window.pageYOffset - const delta = afterScrollTop - beforeScrollTop - if (delta === 0) { - return false - } - direction = delta > 0 ? 'down' : 'up' - callback(direction) - beforeScrollTop = afterScrollTop - }, 50) - }, - false - ) -} - -export function isIE () { - const bw = window.navigator.userAgent - const compare = (s) => bw.indexOf(s) >= 0 - const ie11 = (() => 'ActiveXObject' in window)() - return compare('MSIE') || ie11 -} - -/** - * Remove loading animate - * @param id parent element id or class - * @param timeout - */ -export function removeLoadingAnimate (id = '', timeout = 1500) { - if (id === '') { - return - } - setTimeout(() => { - document.body.removeChild(document.getElementById(id)) - }, timeout) -} -export function scorePassword (pass) { - let score = 0 - if (!pass) { - return score - } - // award every unique letter until 5 repetitions - const letters = {} - for (let i = 0; i < pass.length; i++) { - letters[pass[i]] = (letters[pass[i]] || 0) + 1 - score += 5.0 / letters[pass[i]] - } - - // bonus points for mixing it up - const variations = { - digits: /\d/.test(pass), - lower: /[a-z]/.test(pass), - upper: /[A-Z]/.test(pass), - nonWords: /\W/.test(pass) - } - - let variationCount = 0 - for (var check in variations) { - variationCount += (variations[check] === true) ? 1 : 0 - } - score += (variationCount - 1) * 10 - - return parseInt(score) -} diff --git a/quantdinger_vue/src/utils/utils.less b/quantdinger_vue/src/utils/utils.less deleted file mode 100644 index 23bc405..0000000 --- a/quantdinger_vue/src/utils/utils.less +++ /dev/null @@ -1,54 +0,0 @@ -.textOverflow() { - overflow: hidden; - text-overflow: ellipsis; - word-break: break-all; - white-space: nowrap; -} - -.textOverflowMulti(@line: 3, @bg: #fff) { - position: relative; - max-height: @line * 1.5em; - padding-right: 1em; - margin-right: -1em; - overflow: hidden; - line-height: 1.5em; - text-align: justify; - - &::before { - position: absolute; - right: 14px; - bottom: 0; - padding: 0 1px; - background: @bg; - content: '...'; - } - - &::after { - position: absolute; - right: 14px; - width: 1em; - height: 1em; - margin-top: .2em; - background: white; - content: ''; - } -} - -// mixins for clearfix -// ------------------------ -.clearfix() { - zoom: 1; - - &::before, - &::after { - display: table; - content: ' '; - } - - &::after { - height: 0; - clear: both; - font-size: 0; - visibility: hidden; - } -} diff --git a/quantdinger_vue/src/views/404.vue b/quantdinger_vue/src/views/404.vue deleted file mode 100644 index 8c1d8a1..0000000 --- a/quantdinger_vue/src/views/404.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/ai-analysis/components/FastAnalysisReport.vue b/quantdinger_vue/src/views/ai-analysis/components/FastAnalysisReport.vue deleted file mode 100644 index 4a07fde..0000000 --- a/quantdinger_vue/src/views/ai-analysis/components/FastAnalysisReport.vue +++ /dev/null @@ -1,1221 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/ai-analysis/components/index.vue b/quantdinger_vue/src/views/ai-analysis/components/index.vue deleted file mode 100644 index 62fbddc..0000000 --- a/quantdinger_vue/src/views/ai-analysis/components/index.vue +++ /dev/null @@ -1,3748 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/ai-analysis/index.vue b/quantdinger_vue/src/views/ai-analysis/index.vue deleted file mode 100644 index 7f3f4e1..0000000 --- a/quantdinger_vue/src/views/ai-analysis/index.vue +++ /dev/null @@ -1,2045 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/ai-asset-analysis/index.vue b/quantdinger_vue/src/views/ai-asset-analysis/index.vue deleted file mode 100644 index 2cb1269..0000000 --- a/quantdinger_vue/src/views/ai-asset-analysis/index.vue +++ /dev/null @@ -1,491 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/billing/index.vue b/quantdinger_vue/src/views/billing/index.vue deleted file mode 100644 index f0659aa..0000000 --- a/quantdinger_vue/src/views/billing/index.vue +++ /dev/null @@ -1,768 +0,0 @@ - - - - - - - diff --git a/quantdinger_vue/src/views/dashboard/index.vue b/quantdinger_vue/src/views/dashboard/index.vue deleted file mode 100644 index a6d4596..0000000 --- a/quantdinger_vue/src/views/dashboard/index.vue +++ /dev/null @@ -1,2383 +0,0 @@ - - - - - - diff --git a/quantdinger_vue/src/views/exception/403.vue b/quantdinger_vue/src/views/exception/403.vue deleted file mode 100644 index fb1bf36..0000000 --- a/quantdinger_vue/src/views/exception/403.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/quantdinger_vue/src/views/exception/404.vue b/quantdinger_vue/src/views/exception/404.vue deleted file mode 100644 index 3142e7b..0000000 --- a/quantdinger_vue/src/views/exception/404.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/quantdinger_vue/src/views/exception/500.vue b/quantdinger_vue/src/views/exception/500.vue deleted file mode 100644 index 2770b77..0000000 --- a/quantdinger_vue/src/views/exception/500.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue b/quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue deleted file mode 100644 index f776874..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/BacktestHistoryDrawer.vue +++ /dev/null @@ -1,221 +0,0 @@ - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue b/quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue deleted file mode 100644 index 0bd6c47..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/BacktestModal.vue +++ /dev/null @@ -1,1642 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue b/quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue deleted file mode 100644 index be20e4d..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/BacktestRunViewer.vue +++ /dev/null @@ -1,283 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue b/quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue deleted file mode 100644 index 6731204..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/IndicatorEditor.vue +++ /dev/null @@ -1,1180 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue b/quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue deleted file mode 100644 index b6028b1..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/components/KlineChart.vue +++ /dev/null @@ -1,3887 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-analysis/index.vue b/quantdinger_vue/src/views/indicator-analysis/index.vue deleted file mode 100644 index 8543537..0000000 --- a/quantdinger_vue/src/views/indicator-analysis/index.vue +++ /dev/null @@ -1,3455 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-community/components/CommentList.vue b/quantdinger_vue/src/views/indicator-community/components/CommentList.vue deleted file mode 100644 index 469f15a..0000000 --- a/quantdinger_vue/src/views/indicator-community/components/CommentList.vue +++ /dev/null @@ -1,402 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-community/components/IndicatorCard.vue b/quantdinger_vue/src/views/indicator-community/components/IndicatorCard.vue deleted file mode 100644 index 3ee5689..0000000 --- a/quantdinger_vue/src/views/indicator-community/components/IndicatorCard.vue +++ /dev/null @@ -1,357 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-community/components/IndicatorDetail.vue b/quantdinger_vue/src/views/indicator-community/components/IndicatorDetail.vue deleted file mode 100644 index b03b1e5..0000000 --- a/quantdinger_vue/src/views/indicator-community/components/IndicatorDetail.vue +++ /dev/null @@ -1,606 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/indicator-community/index.vue b/quantdinger_vue/src/views/indicator-community/index.vue deleted file mode 100644 index f32a6ad..0000000 --- a/quantdinger_vue/src/views/indicator-community/index.vue +++ /dev/null @@ -1,1004 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/portfolio/index.vue b/quantdinger_vue/src/views/portfolio/index.vue deleted file mode 100644 index c3f8087..0000000 --- a/quantdinger_vue/src/views/portfolio/index.vue +++ /dev/null @@ -1,3200 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/profile/index.vue b/quantdinger_vue/src/views/profile/index.vue deleted file mode 100644 index cda5eaa..0000000 --- a/quantdinger_vue/src/views/profile/index.vue +++ /dev/null @@ -1,2041 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/settings/index.vue b/quantdinger_vue/src/views/settings/index.vue deleted file mode 100644 index 4a89455..0000000 --- a/quantdinger_vue/src/views/settings/index.vue +++ /dev/null @@ -1,828 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/trading-assistant/components/AIDecisionRecords.vue b/quantdinger_vue/src/views/trading-assistant/components/AIDecisionRecords.vue deleted file mode 100644 index 0b29cfe..0000000 --- a/quantdinger_vue/src/views/trading-assistant/components/AIDecisionRecords.vue +++ /dev/null @@ -1,539 +0,0 @@ - - - - - - - diff --git a/quantdinger_vue/src/views/trading-assistant/components/PositionRecords.vue b/quantdinger_vue/src/views/trading-assistant/components/PositionRecords.vue deleted file mode 100644 index 74dbc78..0000000 --- a/quantdinger_vue/src/views/trading-assistant/components/PositionRecords.vue +++ /dev/null @@ -1,806 +0,0 @@ - - - - - - - - - - - diff --git a/quantdinger_vue/src/views/trading-assistant/components/TradingRecords.vue b/quantdinger_vue/src/views/trading-assistant/components/TradingRecords.vue deleted file mode 100644 index 60a7883..0000000 --- a/quantdinger_vue/src/views/trading-assistant/components/TradingRecords.vue +++ /dev/null @@ -1,1242 +0,0 @@ - - - - - - - - - - - diff --git a/quantdinger_vue/src/views/trading-assistant/index.vue b/quantdinger_vue/src/views/trading-assistant/index.vue deleted file mode 100644 index 4794caf..0000000 --- a/quantdinger_vue/src/views/trading-assistant/index.vue +++ /dev/null @@ -1,5758 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/user-manage/index.vue b/quantdinger_vue/src/views/user-manage/index.vue deleted file mode 100644 index d0fa1f5..0000000 --- a/quantdinger_vue/src/views/user-manage/index.vue +++ /dev/null @@ -1,1448 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/user/Login.vue b/quantdinger_vue/src/views/user/Login.vue deleted file mode 100644 index b12b64e..0000000 --- a/quantdinger_vue/src/views/user/Login.vue +++ /dev/null @@ -1,1598 +0,0 @@ - - - - - diff --git a/quantdinger_vue/src/views/user/RegisterResult.vue b/quantdinger_vue/src/views/user/RegisterResult.vue deleted file mode 100644 index 829b689..0000000 --- a/quantdinger_vue/src/views/user/RegisterResult.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/quantdinger_vue/tests/unit/.eslintrc.js b/quantdinger_vue/tests/unit/.eslintrc.js deleted file mode 100644 index 958d51b..0000000 --- a/quantdinger_vue/tests/unit/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - env: { - jest: true - } -} diff --git a/quantdinger_vue/vue.config.js b/quantdinger_vue/vue.config.js deleted file mode 100644 index 8a5c138..0000000 --- a/quantdinger_vue/vue.config.js +++ /dev/null @@ -1,151 +0,0 @@ -const path = require('path') -const webpack = require('webpack') -const packageJson = require('./package.json') -const GitRevisionPlugin = require('git-revision-webpack-plugin') -const GitRevision = new GitRevisionPlugin() -const buildDate = JSON.stringify(new Date().toLocaleString()) -const createThemeColorReplacerPlugin = require('./config/plugin.config') - -function resolve (dir) { - return path.join(__dirname, dir) -} - -// check Git -function getGitHash () { - try { - return GitRevision.version() - } catch (e) {} - return 'unknown' -} -// eslint-disable-next-line no-unused-vars -const isProd = process.env.NODE_ENV === 'production' -// eslint-disable-next-line no-unused-vars -const assetsCDN = { - // webpack build externals - externals: { - vue: 'Vue', - 'vue-router': 'VueRouter', - vuex: 'Vuex', - axios: 'axios' - }, - css: [], - // https://unpkg.com/browse/vue@2.6.10/ - js: [ - '//cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.min.js', - '//cdn.jsdelivr.net/npm/vue-router@3.5.1/dist/vue-router.min.js', - '//cdn.jsdelivr.net/npm/vuex@3.1.1/dist/vuex.min.js', - '//cdn.jsdelivr.net/npm/axios@0.21.1/dist/axios.min.js' - ] -} - -// vue.config.js -const vueConfig = { - configureWebpack: { - // webpack plugins - plugins: [ - // Ignore all locale files of moment.js - new webpack.IgnorePlugin({ - contextRegExp: /^\.\/locale$/, - resourceRegExp: /moment$/ - }), - new webpack.DefinePlugin({ - APP_VERSION: `"${packageJson.version}"`, - GIT_HASH: JSON.stringify(getGitHash()), - BUILD_DATE: buildDate - }) - ] - // en_US: `if prod, add externals` - // zh_CN: `่ฟ™้‡Œๆ˜ฏ็”จๆฅๆŽงๅˆถ็ผ–่ฏ‘ๅฟฝ็•ฅๅค–้ƒจไพ่ต–็š„๏ผŒไธŽ config.plugin('html') ้…ๅˆๅฏไปฅ็ผ–่ฏ‘ๆ—ถๅผ•ๅ…ฅๅค–้ƒจCDNๆ–‡ไปถไพ่ต–` - // externals: isProd ? assetsCDN.externals : {} - }, - - chainWebpack: config => { - config.resolve.alias.set('@$', resolve('src')) - - // fixed svg-loader by https://github.com/damianstasik/vue-svg-loader/issues/185#issuecomment-1126721069 - const svgRule = config.module.rule('svg') - // Remove regular svg config from root rules list - config.module.rules.delete('svg') - - config.module.rule('svg') - // Use svg component rule - .oneOf('svg_as_component') - .resourceQuery(/inline/) - .test(/\.(svg)(\?.*)?$/) - .use('babel-loader') - .loader('babel-loader') - .end() - .use('vue-svg-loader') - .loader('vue-svg-loader') - .options({ - svgo: { - plugins: [ - { prefixIds: true }, - { cleanupIDs: true }, - { convertShapeToPath: false }, - { convertStyleToAttrs: true } - ] - } - }) - .end() - .end() - // Otherwise use original svg rule - .oneOf('svg_as_regular') - .merge(svgRule.toConfig()) - .end() - - // en_US: If prod is on assets require on cdn - // zh_CN: ๅฆ‚ๆžœๆ˜ฏ prod ๆจกๅผ๏ผŒๅˆ™ๅผ•ๅ…ฅ CDN ไพ่ต–ๆ–‡ไปถ๏ผŒๆœ‰้œ€่ฆๅ‡ๅฐ‘ๅŒ…ๅคงๅฐ่ฏท่‡ช่กŒ่งฃ้™คไพ่ต– - // - // if (isProd) { - // config.plugin('html').tap(args => { - // args[0].cdn = assetsCDN - // return args - // }) - // } - }, - - css: { - loaderOptions: { - less: { - modifyVars: { - // less vars๏ผŒcustomize ant design theme - - // 'primary-color': '#F5222D', - // 'link-color': '#F5222D', - 'border-radius-base': '2px' - }, - // DO NOT REMOVE THIS LINE - javascriptEnabled: true - } - } - }, - - devServer: { - // development server port 8000 - port: 8000, - proxy: { - '/api': { - target: 'http://localhost:5000', - ws: true, - changeOrigin: true - } - } - }, - - // disable source map in production - productionSourceMap: false, - lintOnSave: undefined, - // babel-loader no-ignore node_modules/* - transpileDependencies: [] -} - -// Add ThemeColorReplacer plugin for theme color switching -// This plugin is needed in production to support dynamic theme color changes -vueConfig.configureWebpack.plugins.push(createThemeColorReplacerPlugin()) - -module.exports = vueConfig -// vue.config.js -// module.exports = { -// lintOnSave: false // ็ฆ็”จ ESLint -// } diff --git a/scripts/build-frontend.sh b/scripts/build-frontend.sh new file mode 100644 index 0000000..4b251ff --- /dev/null +++ b/scripts/build-frontend.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# ====================================================== +# QuantDinger Frontend Build Script +# Run this in your PRIVATE frontend repo to build and +# sync compiled files to the open-source repo. +# +# Usage: +# ./scripts/build-frontend.sh +# +# Prerequisites: +# - Node.js >= 16 +# - quantdinger_vue/ source code available +# ====================================================== + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)" +VUE_DIR="$PROJECT_ROOT/quantdinger_vue" +DIST_TARGET="$PROJECT_ROOT/frontend/dist" + +echo "============================================" +echo " QuantDinger Frontend Build" +echo "============================================" + +# Check if source exists +if [ ! -d "$VUE_DIR" ]; then + echo "ERROR: quantdinger_vue/ directory not found!" + echo "This script should be run in the dev environment with frontend source." + exit 1 +fi + +# Build frontend +echo "[1/3] Installing dependencies..." +cd "$VUE_DIR" +npm install --legacy-peer-deps + +echo "[2/3] Building production bundle..." +npm run build + +# Sync dist +echo "[3/3] Syncing dist to frontend/dist/..." +rm -rf "$DIST_TARGET"/* +cp -r "$VUE_DIR/dist/"* "$DIST_TARGET/" + +echo "" +echo "============================================" +echo " Build complete!" +echo " Output: frontend/dist/" +echo " Files: $(find "$DIST_TARGET" -type f | wc -l)" +echo " Size: $(du -sh "$DIST_TARGET" | cut -f1)" +echo "============================================" +echo "" +echo "Next steps:" +echo " cd $PROJECT_ROOT" +echo " git add frontend/dist/" +echo " git commit -m 'chore: update frontend build'" +echo " git push" diff --git a/scripts/private-frontend-ci.yml.example b/scripts/private-frontend-ci.yml.example new file mode 100644 index 0000000..e12382a --- /dev/null +++ b/scripts/private-frontend-ci.yml.example @@ -0,0 +1,63 @@ +# ====================================================== +# [TEMPLATE] Place this in your PRIVATE frontend repo: +# .github/workflows/build-and-deploy.yml +# +# This builds the Vue.js frontend and triggers the +# open-source repo to update its frontend/dist/. +# ====================================================== + +name: Build & Deploy Frontend + +on: + push: + branches: [main, master] + workflow_dispatch: + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout frontend source + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install dependencies + run: npm install --legacy-peer-deps + + - name: Build production + run: npm run build + + - name: Package dist + run: | + cd dist + tar -czf /tmp/dist.tar.gz . + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + tag_name: build-${{ github.run_number }} + files: /tmp/dist.tar.gz + generate_release_notes: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Trigger open-source repo update + # Replace OWNER/QuantDinger with your open-source repo + run: | + curl -X POST \ + -H "Accept: application/vnd.github.v3+json" \ + -H "Authorization: token ${{ secrets.OPENSOURCE_REPO_TOKEN }}" \ + https://api.github.com/repos/OWNER/QuantDinger/dispatches \ + -d '{ + "event_type": "frontend-updated", + "client_payload": { + "version": "'${{ github.run_number }}'", + "sha": "'${{ github.sha }}'" + } + }' diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index db30c47..0000000 --- a/yarn.lock +++ /dev/null @@ -1,11922 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@achrinza/node-ipc@^9.2.5": - version "9.2.9" - resolved "https://registry.npmjs.org/@achrinza/node-ipc/-/node-ipc-9.2.9.tgz" - integrity sha512-7s0VcTwiK/0tNOVdSX9FWMeFdOEcsAOz9HesBldXxFMaGvIak7KC2z9tV9EgsQXn6KUsWsfIkViMNuIo0GoZDQ== - dependencies: - "@node-ipc/js-queue" "2.0.3" - event-pubsub "4.3.0" - js-message "1.0.7" - -"@ant-design-vue/pro-layout@^1.0.12": - version "1.0.13" - resolved "https://registry.npmjs.org/@ant-design-vue/pro-layout/-/pro-layout-1.0.13.tgz" - integrity sha512-O0Kixs9C0noECnAVHxnhvkI0MKWqnAJaV9H8O6tr3ad3Bpr4IAPd+f7y9o3y57eDhfZCPaLR3quM4nxfHSgYWA== - dependencies: - ant-design-vue "^1.6.2" - classnames "^2.2.6" - insert-css "^2.0.0" - lodash "^4.17.15" - omit.js "^1.0.2" - umi-request "^1.2.11" - vue-container-query "^0.1.0" - vue-copy-to-clipboard "^1.0.3" - -"@ant-design/colors@^3.1.0", "@ant-design/colors@^3.2.2": - version "3.2.2" - resolved "https://registry.npmjs.org/@ant-design/colors/-/colors-3.2.2.tgz" - integrity sha512-YKgNbG2dlzqMhA9NtI3/pbY16m3Yl/EeWBRa+lB1X1YaYxHrxNexiQYCLTWO/uDvAjLFMEDU+zR901waBtMtjQ== - dependencies: - tinycolor2 "^1.4.1" - -"@ant-design/icons-vue@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-2.0.0.tgz" - integrity sha512-2c0QQE5hL4N48k5NkPG5sdpMl9YnvyNhf0U7YkdZYDlLnspoRU7vIA0UK9eHBs6OpFLcJB6o8eJrIl2ajBskPg== - dependencies: - "@ant-design/colors" "^3.1.0" - babel-runtime "^6.26.0" - -"@ant-design/icons@^2.1.1": - version "2.1.1" - resolved "https://registry.npmjs.org/@ant-design/icons/-/icons-2.1.1.tgz" - integrity sha512-jCH+k2Vjlno4YWl6g535nHR09PwCEmTBKAG6VqF+rhkrSPRLfgpU2maagwbZPLjaHuU5Jd1DFQ2KJpQuI6uG8w== - -"@antv/adjust@~0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@antv/adjust/-/adjust-0.1.1.tgz" - integrity sha512-9FaMOyBlM4AgoRL0b5o0VhEKAYkexBNUrxV8XmpHU/9NBPJONBOB/NZUlQDqxtLItrt91tCfbAuMQmF529UX2Q== - dependencies: - "@antv/util" "~1.3.1" - -"@antv/attr@~0.1.2": - version "0.1.2" - resolved "https://registry.npmjs.org/@antv/attr/-/attr-0.1.2.tgz" - integrity sha512-QXjP+T2I+pJQcwZx1oCA4tipG43vgeCeKcGGKahlcxb71OBAzjJZm1QbF4frKXcnOqRkxVXtCr70X9TRair3Ew== - dependencies: - "@antv/util" "~1.3.1" - -"@antv/component@~0.3.3": - version "0.3.10" - resolved "https://registry.npmjs.org/@antv/component/-/component-0.3.10.tgz" - integrity sha512-8HLkgdhc0jXrnNrkaACPrWx2JB/51VGscL9t0pH2xoLdxiDQVtTUad2geWxbac5k/ZZHG+bDPWWb83CZIR9A9w== - dependencies: - "@antv/attr" "~0.1.2" - "@antv/g" "~3.3.5" - "@antv/util" "~1.3.1" - wolfy87-eventemitter "~5.1.0" - -"@antv/coord@~0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@antv/coord/-/coord-0.1.0.tgz" - integrity sha512-W1R8h3Jfb3AfMBVfCreFPMVetgEYuwHBIGn0+d3EgYXe2ckOF8XWjkpGF1fZhOMHREMr+Gt27NGiQh8yBdLUgg== - dependencies: - "@antv/util" "~1.3.1" - -"@antv/data-set@^0.10.2": - version "0.10.2" - resolved "https://registry.npmjs.org/@antv/data-set/-/data-set-0.10.2.tgz" - integrity sha512-FFWG5tiTiFiUrLDRwulraU5XfOdDjkYOlZna+AMT9FJw406D/gfS8eXM9YibscBH28M/+KLAVO8xEwuD1sc3bw== - dependencies: - "@antv/hierarchy" "~0.4.0" - "@antv/util" "~1.3.1" - d3-array "~1.2.0" - d3-composite-projections "~1.2.0" - d3-dsv "~1.0.5" - d3-geo "~1.6.4" - d3-geo-projection "~2.1.2" - d3-hexjson "~1.0.1" - d3-hierarchy "~1.1.5" - d3-sankey "~0.7.1" - d3-voronoi "~1.1.2" - dagre "~0.8.2" - point-at-length "~1.0.2" - regression "~2.0.0" - simple-statistics "~6.1.0" - topojson-client "~3.0.0" - wolfy87-eventemitter "~5.1.0" - -"@antv/g@~3.3.5": - version "3.3.6" - resolved "https://registry.npmjs.org/@antv/g/-/g-3.3.6.tgz" - integrity sha512-2GtyTz++s0BbN6s0ZL2/nrqGYCkd52pVoNH92YkrTdTOvpO6Z4DNoo6jGVgZdPX6Nzwli6yduC8MinVAhE8X6g== - dependencies: - "@antv/gl-matrix" "~2.7.1" - "@antv/util" "~1.3.1" - d3-ease "~1.0.3" - d3-interpolate "~1.1.5" - d3-timer "~1.0.6" - wolfy87-eventemitter "~5.1.0" - -"@antv/g@~3.4.10": - version "3.4.10" - resolved "https://registry.npmjs.org/@antv/g/-/g-3.4.10.tgz" - integrity sha512-pKy/L1SyRBsXuujdkggqrdBA0/ciAgHiArYBdIJsxHRxCneUP01wGwHdGfDayh2+S0gcSBHynjhoEahsaZaLkw== - dependencies: - "@antv/gl-matrix" "~2.7.1" - "@antv/util" "~1.3.1" - d3-ease "~1.0.3" - d3-interpolate "~1.1.5" - d3-timer "~1.0.6" - detect-browser "^5.1.0" - -"@antv/g2-brush@^0.0.2": - version "0.0.2" - resolved "https://registry.npmjs.org/@antv/g2-brush/-/g2-brush-0.0.2.tgz" - integrity sha512-7O9szwem19nmEgReXhFB8kVLRaz8J5MHvrzDSDY36YaBOaHSWRGHnvYt2KkkPqgWtHtLY1srssk4X/UmP5govA== - -"@antv/g2-plugin-slider@^2.1.0": - version "2.1.1" - resolved "https://registry.npmjs.org/@antv/g2-plugin-slider/-/g2-plugin-slider-2.1.1.tgz" - integrity sha512-nB678VEGG3FkrvkDDFADAKjLQIeXzITEYqey5oeOpbf0vT5jOa55lQDyJDZ79cK8PmU/Hz6VPeSb3CNQBA+/FQ== - -"@antv/g2@~3.5.3": - version "3.5.19" - resolved "https://registry.npmjs.org/@antv/g2/-/g2-3.5.19.tgz" - integrity sha512-OWWDJof1ghfsxDYO20TxVF9TUhDsyOE/yzbSdSu+N9Ft1zQxKJQlgG43/FO+rOsdC/k1dXoYOBRPQ7kk5EBaJA== - dependencies: - "@antv/adjust" "~0.1.0" - "@antv/attr" "~0.1.2" - "@antv/component" "~0.3.3" - "@antv/coord" "~0.1.0" - "@antv/g" "~3.4.10" - "@antv/scale" "~0.1.1" - "@antv/util" "~1.3.1" - core-js "2" - venn.js "~0.2.20" - wolfy87-eventemitter "~5.1.0" - -"@antv/gl-matrix@^2.7.1", "@antv/gl-matrix@~2.7.1": - version "2.7.1" - resolved "https://registry.npmjs.org/@antv/gl-matrix/-/gl-matrix-2.7.1.tgz" - integrity sha512-oOWcVNlpELIKi9x+Mm1Vwbz8pXfkbJKykoCIOJ/dNK79hSIANbpXJ5d3Rra9/wZqK6MC961B7sybFhPlLraT3Q== - -"@antv/hierarchy@~0.4.0": - version "0.4.0" - resolved "https://registry.npmjs.org/@antv/hierarchy/-/hierarchy-0.4.0.tgz" - integrity sha512-ols+m+Z8QA4895SWMTOSjVImOX4tEbWQTwJ0NE+WATc0WLSKs6D9y2yaR+ZWt6P60BMGVIKS6lIfabO3CwGgnQ== - dependencies: - "@antv/util" "~1.3.1" - -"@antv/scale@~0.1.1": - version "0.1.5" - resolved "https://registry.npmjs.org/@antv/scale/-/scale-0.1.5.tgz" - integrity sha512-7RAu4iH5+Hk21h6+aBMiDTfmLf4IibK2SWjx/+E4f4AXRpqucO+8u7IbZdFkakAWxvqhJtN3oePJuTKqOMcmlg== - dependencies: - "@antv/util" "~1.3.1" - fecha "~2.3.3" - -"@antv/util@~1.3.1": - version "1.3.1" - resolved "https://registry.npmjs.org/@antv/util/-/util-1.3.1.tgz" - integrity sha512-cbUta0hIJrKEaW3eKoGarz3Ita+9qUPF2YzTj8A6wds/nNiy20G26ztIWHU+5ThLc13B1n5Ik52LbaCaeg9enA== - dependencies: - "@antv/gl-matrix" "^2.7.1" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1", "@babel/code-frame@^7.28.6": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz" - integrity sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q== - dependencies: - "@babel/helper-validator-identifier" "^7.28.5" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0", "@babel/compat-data@^7.28.6": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz" - integrity sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg== - -"@babel/core@^7.1.0", "@babel/core@^7.12.16", "@babel/core@^7.12.3", "@babel/core@^7.7.2", "@babel/core@^7.8.0": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz" - integrity sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw== - dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/generator" "^7.28.6" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helpers" "^7.28.6" - "@babel/parser" "^7.28.6" - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - "@jridgewell/remapping" "^2.3.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.28.6", "@babel/generator@^7.7.2": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz" - integrity sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw== - dependencies: - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - -"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== - dependencies: - "@babel/types" "^7.27.3" - -"@babel/helper-compilation-targets@^7.12.16", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2", "@babel/helper-compilation-targets@^7.28.6": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz" - integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== - dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz" - integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-member-expression-to-functions" "^7.27.1" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.27.1" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz" - integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - regexpu-core "^6.2.0" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.6.5": - version "0.6.5" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz" - integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== - dependencies: - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - debug "^4.4.1" - lodash.debounce "^4.0.8" - resolve "^1.22.10" - -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== - -"@babel/helper-member-expression-to-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz" - integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.27.1", "@babel/helper-module-imports@^7.28.6": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz" - integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== - dependencies: - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.6": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz" - integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.6" - -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz" - integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== - -"@babel/helper-remap-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz" - integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-wrap-function" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-replace-supers@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz" - integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.27.1" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz" - integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.25.9", "@babel/helper-validator-identifier@^7.27.1", "@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helper-wrap-function@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.27.1.tgz" - integrity sha512-NFJK2sHUvrjo8wAU/nQTWU890/zB2jj0qBcCbZbbf+005cAsv6tMjXz31fBign6M5ov1o0Bllu+9nbqkfsjjJQ== - dependencies: - "@babel/template" "^7.27.1" - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helpers@^7.28.6": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz" - integrity sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw== - dependencies: - "@babel/template" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/highlight@^7.10.4": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz" - integrity sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - chalk "^2.4.2" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.5", "@babel/parser@^7.28.0", "@babel/parser@^7.28.6", "@babel/parser@^7.7.0": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz" - integrity sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ== - dependencies: - "@babel/types" "^7.28.6" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz" - integrity sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz" - integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz" - integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz" - integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz" - integrity sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/plugin-proposal-class-properties@^7.12.13": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-decorators@^7.12.13": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz" - integrity sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-syntax-decorators" "^7.27.1" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-decorators@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz" - integrity sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-import-assertions@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz" - integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz" - integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz" - integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz" - integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz" - integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-async-generator-functions@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz" - integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.28.0" - -"@babel/plugin-transform-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz" - integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-remap-async-to-generator" "^7.27.1" - -"@babel/plugin-transform-block-scoped-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz" - integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-block-scoping@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz" - integrity sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-class-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz" - integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-class-static-block@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz" - integrity sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-classes@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz" - integrity sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/traverse" "^7.28.0" - -"@babel/plugin-transform-computed-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz" - integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/template" "^7.27.1" - -"@babel/plugin-transform-destructuring@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz" - integrity sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.0" - -"@babel/plugin-transform-dotall-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz" - integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-duplicate-keys@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz" - integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz" - integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-dynamic-import@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz" - integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-explicit-resource-management@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz" - integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - -"@babel/plugin-transform-exponentiation-operator@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz" - integrity sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-export-namespace-from@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz" - integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-for-of@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz" - integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-function-name@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz" - integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== - dependencies: - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/plugin-transform-json-strings@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz" - integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz" - integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-logical-assignment-operators@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz" - integrity sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-member-expression-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz" - integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-amd@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz" - integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-commonjs@^7.15.0", "@babel/plugin-transform-modules-commonjs@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz" - integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-modules-systemjs@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz" - integrity sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/plugin-transform-modules-umd@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz" - integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== - dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz" - integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-new-target@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz" - integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz" - integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-numeric-separator@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz" - integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-object-rest-spread@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz" - integrity sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA== - dependencies: - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.0" - -"@babel/plugin-transform-object-super@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz" - integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - -"@babel/plugin-transform-optional-catch-binding@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz" - integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz" - integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-parameters@^7.27.7": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-private-methods@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz" - integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-private-property-in-object@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz" - integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-property-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz" - integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-regenerator@^7.28.0": - version "7.28.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz" - integrity sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-regexp-modifiers@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz" - integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-reserved-words@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz" - integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-runtime@^7.12.15": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.0.tgz" - integrity sha512-dGopk9nZrtCs2+nfIem25UuHyt5moSJamArzIoh9/vezUQPmYDOzjaHDCkAzuGJibCIkPup8rMT2+wYB6S73cA== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - semver "^6.3.1" - -"@babel/plugin-transform-shorthand-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz" - integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-spread@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz" - integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - -"@babel/plugin-transform-sticky-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz" - integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-template-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz" - integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-typeof-symbol@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz" - integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-escapes@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz" - integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-property-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz" - integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz" - integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-unicode-sets-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz" - integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/preset-env@^7.12.16": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz" - integrity sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg== - dependencies: - "@babel/compat-data" "^7.28.0" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.27.1" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.27.1" - "@babel/plugin-syntax-import-attributes" "^7.27.1" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.28.0" - "@babel/plugin-transform-async-to-generator" "^7.27.1" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.0" - "@babel/plugin-transform-class-properties" "^7.27.1" - "@babel/plugin-transform-class-static-block" "^7.27.1" - "@babel/plugin-transform-classes" "^7.28.0" - "@babel/plugin-transform-computed-properties" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-dotall-regex" "^7.27.1" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.0" - "@babel/plugin-transform-exponentiation-operator" "^7.27.1" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.27.1" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-modules-systemjs" "^7.27.1" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" - "@babel/plugin-transform-numeric-separator" "^7.27.1" - "@babel/plugin-transform-object-rest-spread" "^7.28.0" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.27.1" - "@babel/plugin-transform-private-property-in-object" "^7.27.1" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.28.0" - "@babel/plugin-transform-regexp-modifiers" "^7.27.1" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.27.1" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.27.1" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - core-js-compat "^3.43.0" - semver "^6.3.1" - -"@babel/preset-modules@0.1.6-no-external-plugins": - version "0.1.6-no-external-plugins" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" - integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/runtime@^7.12.13": - version "7.28.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz" - integrity sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA== - -"@babel/template@^7.27.1", "@babel/template@^7.27.2", "@babel/template@^7.28.6", "@babel/template@^7.3.3": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz" - integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== - dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.6", "@babel/traverse@^7.7.0", "@babel/traverse@^7.7.2": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz" - integrity sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg== - dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/generator" "^7.28.6" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.6" - "@babel/template" "^7.28.6" - "@babel/types" "^7.28.6" - debug "^4.3.1" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.28.6" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz" - integrity sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@commitlint/cli@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-12.1.4.tgz" - integrity sha512-ZR1WjXLvqEffYyBPT0XdnSxtt3Ty1TMoujEtseW5o3vPnkA1UNashAMjQVg/oELqfaiAMnDw8SERPMN0e/0kLg== - dependencies: - "@commitlint/format" "^12.1.4" - "@commitlint/lint" "^12.1.4" - "@commitlint/load" "^12.1.4" - "@commitlint/read" "^12.1.4" - "@commitlint/types" "^12.1.4" - lodash "^4.17.19" - resolve-from "5.0.0" - resolve-global "1.0.0" - yargs "^16.2.0" - -"@commitlint/config-conventional@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-12.1.4.tgz" - integrity sha512-ZIdzmdy4o4WyqywMEpprRCrehjCSQrHkaRTVZV411GyLigFQHlEBSJITAihLAWe88Qy/8SyoIe5uKvAsV5vRqQ== - dependencies: - conventional-changelog-conventionalcommits "^4.3.1" - -"@commitlint/ensure@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-12.1.4.tgz" - integrity sha512-MxHIBuAG9M4xl33qUfIeMSasbv3ktK0W+iygldBxZOL4QSYC2Gn66pZAQMnV9o3V+sVFHoAK2XUKqBAYrgbEqw== - dependencies: - "@commitlint/types" "^12.1.4" - lodash "^4.17.19" - -"@commitlint/execute-rule@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-12.1.4.tgz" - integrity sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg== - -"@commitlint/format@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/format/-/format-12.1.4.tgz" - integrity sha512-h28ucMaoRjVvvgS6Bdf85fa/+ZZ/iu1aeWGCpURnQV7/rrVjkhNSjZwGlCOUd5kDV1EnZ5XdI7L18SUpRjs26g== - dependencies: - "@commitlint/types" "^12.1.4" - chalk "^4.0.0" - -"@commitlint/is-ignored@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-12.1.4.tgz" - integrity sha512-uTu2jQU2SKvtIRVLOzMQo3KxDtO+iJ1p0olmncwrqy4AfPLgwoyCP2CiULq5M7xpR3+dE3hBlZXbZTQbD7ycIw== - dependencies: - "@commitlint/types" "^12.1.4" - semver "7.3.5" - -"@commitlint/lint@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-12.1.4.tgz" - integrity sha512-1kZ8YDp4to47oIPFELUFGLiLumtPNKJigPFDuHt2+f3Q3IKdQ0uk53n3CPl4uoyso/Og/EZvb1mXjFR/Yce4cA== - dependencies: - "@commitlint/is-ignored" "^12.1.4" - "@commitlint/parse" "^12.1.4" - "@commitlint/rules" "^12.1.4" - "@commitlint/types" "^12.1.4" - -"@commitlint/load@^12.1.4", "@commitlint/load@>6.1.1": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/load/-/load-12.1.4.tgz" - integrity sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA== - dependencies: - "@commitlint/execute-rule" "^12.1.4" - "@commitlint/resolve-extends" "^12.1.4" - "@commitlint/types" "^12.1.4" - chalk "^4.0.0" - cosmiconfig "^7.0.0" - lodash "^4.17.19" - resolve-from "^5.0.0" - -"@commitlint/message@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/message/-/message-12.1.4.tgz" - integrity sha512-6QhalEKsKQ/Y16/cTk5NH4iByz26fqws2ub+AinHPtM7Io0jy4e3rym9iE+TkEqiqWZlUigZnTwbPvRJeSUBaA== - -"@commitlint/parse@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-12.1.4.tgz" - integrity sha512-yqKSAsK2V4X/HaLb/yYdrzs6oD/G48Ilt0EJ2Mp6RJeWYxG14w/Out6JrneWnr/cpzemyN5hExOg6+TB19H/Lw== - dependencies: - "@commitlint/types" "^12.1.4" - conventional-changelog-angular "^5.0.11" - conventional-commits-parser "^3.0.0" - -"@commitlint/read@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/read/-/read-12.1.4.tgz" - integrity sha512-TnPQSJgD8Aod5Xeo9W4SaYKRZmIahukjcCWJ2s5zb3ZYSmj6C85YD9cR5vlRyrZjj78ItLUV/X4FMWWVIS38Jg== - dependencies: - "@commitlint/top-level" "^12.1.4" - "@commitlint/types" "^12.1.4" - fs-extra "^9.0.0" - git-raw-commits "^2.0.0" - -"@commitlint/resolve-extends@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-12.1.4.tgz" - integrity sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg== - dependencies: - import-fresh "^3.0.0" - lodash "^4.17.19" - resolve-from "^5.0.0" - resolve-global "^1.0.0" - -"@commitlint/rules@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-12.1.4.tgz" - integrity sha512-W8m6ZSjg7RuIsIfzQiFHa48X5mcPXeKT9yjBxVmjHvYfS2FDBf1VxCQ7vO0JTVIdV4ohjZ0eKg/wxxUuZHJAZg== - dependencies: - "@commitlint/ensure" "^12.1.4" - "@commitlint/message" "^12.1.4" - "@commitlint/to-lines" "^12.1.4" - "@commitlint/types" "^12.1.4" - -"@commitlint/to-lines@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-12.1.4.tgz" - integrity sha512-TParumvbi8bdx3EdLXz2MaX+e15ZgoCqNUgqHsRLwyqLUTRbqCVkzrfadG1UcMQk8/d5aMbb327ZKG3Q4BRorw== - -"@commitlint/top-level@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-12.1.4.tgz" - integrity sha512-d4lTJrOT/dXlpY+NIt4CUl77ciEzYeNVc0VFgUQ6VA+b1rqYD2/VWFjBlWVOrklxtSDeKyuEhs36RGrppEFAvg== - dependencies: - find-up "^5.0.0" - -"@commitlint/types@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/types/-/types-12.1.4.tgz" - integrity sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw== - dependencies: - chalk "^4.0.0" - -"@csstools/selector-specificity@^2.0.2": - version "2.2.0" - resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" - integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== - -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": - version "9.3.0" - resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.1.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@iconify/types@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz" - integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== - -"@iconify/vue2@^2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@iconify/vue2/-/vue2-2.1.0.tgz" - integrity sha512-+R4T9EqrUecMKh/tdiscju/mJS+HCzHFFuJ9XnNcFLaIj3lBOdh8RJolPY9n4k7XRG5V/tY16Lzx+mv+vOmjhA== - dependencies: - "@iconify/types" "^2.0.0" - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - -"@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - -"@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== - dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== - dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" - -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== - dependencies: - "@sinclair/typebox" "^0.24.1" - -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" - -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== - dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== - dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" - -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== - dependencies: - "@jest/schemas" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.13" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/source-map@^0.3.3": - version "0.3.11" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz" - integrity sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.5" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.30" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz" - integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.5" - resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz" - integrity sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw== - -"@ljharb/resumer@~0.0.1": - version "0.0.1" - resolved "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.0.1.tgz" - integrity sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw== - dependencies: - "@ljharb/through" "^2.3.9" - -"@ljharb/through@^2.3.9", "@ljharb/through@~2.3.9": - version "2.3.14" - resolved "https://registry.npmjs.org/@ljharb/through/-/through-2.3.14.tgz" - integrity sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A== - dependencies: - call-bind "^1.0.8" - -"@node-ipc/js-queue@2.0.3": - version "2.0.3" - resolved "https://registry.npmjs.org/@node-ipc/js-queue/-/js-queue-2.0.3.tgz" - integrity sha512-fL1wpr8hhD5gT2dA1qifeVaoDFlQR5es8tFuKqjHX+kdOtdNHnxkVZbtIrR2rxnMFvehkjaZRNV2H/gPXlb0hw== - dependencies: - easy-stack "1.0.1" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@one-ini/wasm@0.1.1": - version "0.1.1" - resolved "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz" - integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw== - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@polka/url@^1.0.0-next.24": - version "1.0.0-next.29" - resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz" - integrity sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww== - -"@rtsao/scc@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz" - integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== - -"@sideway/address@^4.1.5": - version "4.1.5" - resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz" - integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@simonwep/pickr@~1.7.0": - version "1.7.4" - resolved "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.7.4.tgz" - integrity sha512-fq7jgKJT21uWGC1mARBHvvd1JYlEf93o7SuVOB4Lr0x/2UPuNC9Oe9n/GzVeg4oVtqMDfh1wIEJpsdOJEZb+3g== - dependencies: - core-js "^3.6.5" - nanopop "^2.1.0" - -"@sinclair/typebox@^0.24.1": - version "0.24.51" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" - integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== - -"@sinonjs/commons@^1.7.0": - version "1.8.6" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz" - integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@soda/friendly-errors-webpack-plugin@^1.8.0": - version "1.8.1" - resolved "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz" - integrity sha512-h2ooWqP8XuFqTXT+NyAFbrArzfQA7R6HTezADrvD9Re8fxMLTPPniLdqVTdDaO0eIoLaAwKT+d6w+5GeTk7Vbg== - dependencies: - chalk "^3.0.0" - error-stack-parser "^2.0.6" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -"@soda/get-current-script@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@soda/get-current-script/-/get-current-script-1.0.2.tgz" - integrity sha512-T7VNNlYVM1SgQ+VsMYhnDkcGmWhQdL0bDyGm5TlQ3GBXnJscEClUUOKduWTmm2zCnvNLC1hc3JpuXjs/nFOc5w== - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14": - version "7.20.5" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.27.0" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz" - integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.28.0" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz" - integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== - dependencies: - "@babel/types" "^7.28.2" - -"@types/body-parser@*": - version "1.19.6" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz" - integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.13" - resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz" - integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.4" - resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz" - integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.38" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" - integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== - dependencies: - "@types/node" "*" - -"@types/d3-format@*": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz" - integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== - -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/eslint@^7.29.0 || ^8.4.1": - version "8.56.12" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.12.tgz" - integrity sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/express-serve-static-core@*": - version "5.0.7" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz" - integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express-serve-static-core@^4.17.33": - version "4.19.6" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz" - integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.23" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz" - integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/graceful-fs@^4.1.2": - version "4.1.9" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" - integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== - dependencies: - "@types/node" "*" - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-errors@*": - version "2.0.5" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz" - integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== - -"@types/http-proxy@^1.17.8": - version "1.17.16" - resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz" - integrity sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.6" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" - integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== - -"@types/istanbul-lib-report@*": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz" - integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz" - integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest@^27.0.1": - version "27.5.2" - resolved "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz" - integrity sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA== - dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" - -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" - integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/loader-utils@1.1.3": - version "1.1.3" - resolved "https://registry.npmjs.org/@types/loader-utils/-/loader-utils-1.1.3.tgz" - integrity sha512-euKGFr2oCB3ASBwG39CYJMR3N9T0nanVqXdiH7Zu/Nqddt6SmFRxytq/i2w9LQYNQekEtGBz+pE3qG6fQTNvRg== - dependencies: - "@types/node" "*" - "@types/webpack" "*" - -"@types/lodash@*": - version "4.17.20" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz" - integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA== - -"@types/mime@^1": - version "1.3.5" - resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" - integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== - -"@types/minimist@^1.2.0": - version "1.2.5" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz" - integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== - -"@types/node-forge@^1.3.0": - version "1.3.13" - resolved "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.13.tgz" - integrity sha512-zePQJSW5QkwSHKRApqWCVKeKoSOt4xvEnLENZPjyvm9Ezdf/EyDeJM7jqLzOwjVICQQzvLZ63T55MKdJB5H6ww== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "24.2.1" - resolved "https://registry.npmjs.org/@types/node/-/node-24.2.1.tgz" - integrity sha512-DRh5K+ka5eJic8CjH7td8QpYEV6Zo10gfRkjHCO3weqZHWDtAaSTFtl4+VMqOJ4N5jcuhZ9/l+yy8rVgw7BQeQ== - dependencies: - undici-types "~7.10.0" - -"@types/node@^8.0.53": - version "8.10.66" - resolved "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz" - integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== - -"@types/node@8.9": - version "8.9.5" - resolved "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz" - integrity sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ== - -"@types/normalize-package-data@^2.4.0": - version "2.4.4" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" - integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== - -"@types/parse-json@^4.0.0": - version "4.0.2" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" - integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== - -"@types/prettier@^2.1.5": - version "2.7.3" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" - integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== - -"@types/q@^1.5.1": - version "1.5.8" - resolved "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz" - integrity sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw== - -"@types/qs@*": - version "6.14.0" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz" - integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== - -"@types/range-parser@*": - version "1.2.7" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" - integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/send@*": - version "0.17.5" - resolved "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz" - integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.1": - version "1.9.4" - resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz" - integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.8" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz" - integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== - dependencies: - "@types/http-errors" "*" - "@types/node" "*" - "@types/send" "*" - -"@types/sockjs@^0.3.33": - version "0.3.36" - resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz" - integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== - dependencies: - "@types/node" "*" - -"@types/stack-utils@^2.0.0": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz" - integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== - -"@types/webpack@*": - version "5.28.5" - resolved "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.5.tgz" - integrity sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw== - dependencies: - "@types/node" "*" - tapable "^2.2.0" - webpack "^5" - -"@types/ws@^8.5.5": - version "8.18.1" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz" - integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.3" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz" - integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== - -"@types/yargs@^16.0.0": - version "16.0.9" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz" - integrity sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== - dependencies: - "@types/yargs-parser" "*" - -"@vue/babel-helper-vue-jsx-merge-props@^1.2.1", "@vue/babel-helper-vue-jsx-merge-props@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz" - integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA== - -"@vue/babel-helper-vue-transform-on@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz" - integrity sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA== - -"@vue/babel-plugin-jsx@^1.0.3": - version "1.5.0" - resolved "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz" - integrity sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.0" - "@babel/types" "^7.28.2" - "@vue/babel-helper-vue-transform-on" "1.5.0" - "@vue/babel-plugin-resolve-type" "1.5.0" - "@vue/shared" "^3.5.18" - -"@vue/babel-plugin-resolve-type@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz" - integrity sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/parser" "^7.28.0" - "@vue/compiler-sfc" "^3.5.18" - -"@vue/babel-plugin-transform-vue-jsx@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz" - integrity sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - html-tags "^2.0.0" - lodash.kebabcase "^4.1.1" - svg-tags "^1.0.0" - -"@vue/babel-preset-app@^5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.8.tgz" - integrity sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg== - dependencies: - "@babel/core" "^7.12.16" - "@babel/helper-compilation-targets" "^7.12.16" - "@babel/helper-module-imports" "^7.12.13" - "@babel/plugin-proposal-class-properties" "^7.12.13" - "@babel/plugin-proposal-decorators" "^7.12.13" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-jsx" "^7.12.13" - "@babel/plugin-transform-runtime" "^7.12.15" - "@babel/preset-env" "^7.12.16" - "@babel/runtime" "^7.12.13" - "@vue/babel-plugin-jsx" "^1.0.3" - "@vue/babel-preset-jsx" "^1.1.2" - babel-plugin-dynamic-import-node "^2.3.3" - core-js "^3.8.3" - core-js-compat "^3.8.3" - semver "^7.3.4" - -"@vue/babel-preset-jsx@^1.1.2": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz" - integrity sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA== - dependencies: - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - "@vue/babel-sugar-composition-api-inject-h" "^1.4.0" - "@vue/babel-sugar-composition-api-render-instance" "^1.4.0" - "@vue/babel-sugar-functional-vue" "^1.4.0" - "@vue/babel-sugar-inject-h" "^1.4.0" - "@vue/babel-sugar-v-model" "^1.4.0" - "@vue/babel-sugar-v-on" "^1.4.0" - -"@vue/babel-sugar-composition-api-inject-h@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz" - integrity sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@vue/babel-sugar-composition-api-render-instance@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz" - integrity sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@vue/babel-sugar-functional-vue@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz" - integrity sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@vue/babel-sugar-inject-h@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz" - integrity sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - -"@vue/babel-sugar-v-model@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz" - integrity sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - camelcase "^5.0.0" - html-tags "^2.0.0" - svg-tags "^1.0.0" - -"@vue/babel-sugar-v-on@^1.4.0": - version "1.4.0" - resolved "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz" - integrity sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA== - dependencies: - "@babel/plugin-syntax-jsx" "^7.2.0" - "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" - camelcase "^5.0.0" - -"@vue/cli-overlay@^5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.8.tgz" - integrity sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ== - -"@vue/cli-plugin-babel@~5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.8.tgz" - integrity sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ== - dependencies: - "@babel/core" "^7.12.16" - "@vue/babel-preset-app" "^5.0.8" - "@vue/cli-shared-utils" "^5.0.8" - babel-loader "^8.2.2" - thread-loader "^3.0.0" - webpack "^5.54.0" - -"@vue/cli-plugin-eslint@~5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz" - integrity sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg== - dependencies: - "@vue/cli-shared-utils" "^5.0.8" - eslint-webpack-plugin "^3.1.0" - globby "^11.0.2" - webpack "^5.54.0" - yorkie "^2.0.0" - -"@vue/cli-plugin-router@^5.0.8", "@vue/cli-plugin-router@~5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz" - integrity sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg== - dependencies: - "@vue/cli-shared-utils" "^5.0.8" - -"@vue/cli-plugin-unit-jest@~5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-5.0.8.tgz" - integrity sha512-8aTmXUxEUdhJEjMHHoHI1wgi2SHzVRgCQQWIn5lgCAV2xJnXng09+wv8Ap0dhO4Z5vOOA/7xnubMQ9pDLqiskg== - dependencies: - "@babel/core" "^7.12.16" - "@babel/plugin-transform-modules-commonjs" "^7.15.0" - "@types/jest" "^27.0.1" - "@vue/cli-shared-utils" "^5.0.8" - babel-jest "^27.1.0" - deepmerge "^4.2.2" - jest "^27.1.0" - jest-serializer-vue "^2.0.2" - jest-transform-stub "^2.0.0" - jest-watch-typeahead "^1.0.0" - -"@vue/cli-plugin-vuex@^5.0.8", "@vue/cli-plugin-vuex@~5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz" - integrity sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA== - -"@vue/cli-service@~5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.8.tgz" - integrity sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw== - dependencies: - "@babel/helper-compilation-targets" "^7.12.16" - "@soda/friendly-errors-webpack-plugin" "^1.8.0" - "@soda/get-current-script" "^1.0.2" - "@types/minimist" "^1.2.0" - "@vue/cli-overlay" "^5.0.8" - "@vue/cli-plugin-router" "^5.0.8" - "@vue/cli-plugin-vuex" "^5.0.8" - "@vue/cli-shared-utils" "^5.0.8" - "@vue/component-compiler-utils" "^3.3.0" - "@vue/vue-loader-v15" "npm:vue-loader@^15.9.7" - "@vue/web-component-wrapper" "^1.3.0" - acorn "^8.0.5" - acorn-walk "^8.0.2" - address "^1.1.2" - autoprefixer "^10.2.4" - browserslist "^4.16.3" - case-sensitive-paths-webpack-plugin "^2.3.0" - cli-highlight "^2.1.10" - clipboardy "^2.3.0" - cliui "^7.0.4" - copy-webpack-plugin "^9.0.1" - css-loader "^6.5.0" - css-minimizer-webpack-plugin "^3.0.2" - cssnano "^5.0.0" - debug "^4.1.1" - default-gateway "^6.0.3" - dotenv "^10.0.0" - dotenv-expand "^5.1.0" - fs-extra "^9.1.0" - globby "^11.0.2" - hash-sum "^2.0.0" - html-webpack-plugin "^5.1.0" - is-file-esm "^1.0.0" - launch-editor-middleware "^2.2.1" - lodash.defaultsdeep "^4.6.1" - lodash.mapvalues "^4.6.0" - mini-css-extract-plugin "^2.5.3" - minimist "^1.2.5" - module-alias "^2.2.2" - portfinder "^1.0.26" - postcss "^8.2.6" - postcss-loader "^6.1.1" - progress-webpack-plugin "^1.0.12" - ssri "^8.0.1" - terser-webpack-plugin "^5.1.1" - thread-loader "^3.0.0" - vue-loader "^17.0.0" - vue-style-loader "^4.1.3" - webpack "^5.54.0" - webpack-bundle-analyzer "^4.4.0" - webpack-chain "^6.5.1" - webpack-dev-server "^4.7.3" - webpack-merge "^5.7.3" - webpack-virtual-modules "^0.4.2" - whatwg-fetch "^3.6.2" - -"@vue/cli-shared-utils@^5.0.8": - version "5.0.8" - resolved "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz" - integrity sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ== - dependencies: - "@achrinza/node-ipc" "^9.2.5" - chalk "^4.1.2" - execa "^1.0.0" - joi "^17.4.0" - launch-editor "^2.2.1" - lru-cache "^6.0.0" - node-fetch "^2.6.7" - open "^8.0.2" - ora "^5.3.0" - read-pkg "^5.1.1" - semver "^7.3.4" - strip-ansi "^6.0.0" - -"@vue/compiler-core@3.5.18": - version "3.5.18" - resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz" - integrity sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw== - dependencies: - "@babel/parser" "^7.28.0" - "@vue/shared" "3.5.18" - entities "^4.5.0" - estree-walker "^2.0.2" - source-map-js "^1.2.1" - -"@vue/compiler-dom@3.5.18": - version "3.5.18" - resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz" - integrity sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A== - dependencies: - "@vue/compiler-core" "3.5.18" - "@vue/shared" "3.5.18" - -"@vue/compiler-sfc@^3.5.18": - version "3.5.18" - resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz" - integrity sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA== - dependencies: - "@babel/parser" "^7.28.0" - "@vue/compiler-core" "3.5.18" - "@vue/compiler-dom" "3.5.18" - "@vue/compiler-ssr" "3.5.18" - "@vue/shared" "3.5.18" - estree-walker "^2.0.2" - magic-string "^0.30.17" - postcss "^8.5.6" - source-map-js "^1.2.1" - -"@vue/compiler-sfc@2.7.16": - version "2.7.16" - resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz" - integrity sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg== - dependencies: - "@babel/parser" "^7.23.5" - postcss "^8.4.14" - source-map "^0.6.1" - optionalDependencies: - prettier "^1.18.2 || ^2.0.0" - -"@vue/compiler-ssr@3.5.18": - version "3.5.18" - resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz" - integrity sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g== - dependencies: - "@vue/compiler-dom" "3.5.18" - "@vue/shared" "3.5.18" - -"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.3.0": - version "3.3.0" - resolved "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz" - integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ== - dependencies: - consolidate "^0.15.1" - hash-sum "^1.0.2" - lru-cache "^4.1.2" - merge-source-map "^1.1.0" - postcss "^7.0.36" - postcss-selector-parser "^6.0.2" - source-map "~0.6.1" - vue-template-es2015-compiler "^1.9.0" - optionalDependencies: - prettier "^1.18.2 || ^2.0.0" - -"@vue/eslint-config-standard@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@vue/eslint-config-standard/-/eslint-config-standard-4.0.0.tgz" - integrity sha512-bQghq1cw1BuMRHNhr3tRpAJx1tpGy0QtajQX873kLtA9YVuOIoXR7nAWnTN09bBHnSUh2N288vMsqPi2fI4Hzg== - dependencies: - eslint-config-standard "^12.0.0" - eslint-plugin-import "^2.14.0" - eslint-plugin-node "^8.0.0" - eslint-plugin-promise "^4.0.1" - eslint-plugin-standard "^4.0.0" - -"@vue/shared@^3.5.18", "@vue/shared@3.5.18": - version "3.5.18" - resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz" - integrity sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA== - -"@vue/test-utils@^1.3.0": - version "1.3.6" - resolved "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.3.6.tgz" - integrity sha512-udMmmF1ts3zwxUJEIAj5ziioR900reDrt6C9H3XpWPsLBx2lpHKoA4BTdd9HNIYbkGltWw+JjWJ+5O6QBwiyEw== - dependencies: - dom-event-types "^1.0.0" - lodash "^4.17.15" - pretty "^2.0.0" - -"@vue/vue-loader-v15@npm:vue-loader@^15.9.7": - version "15.11.1" - resolved "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz" - integrity sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q== - dependencies: - "@vue/component-compiler-utils" "^3.1.0" - hash-sum "^1.0.2" - loader-utils "^1.1.0" - vue-hot-reload-api "^2.3.0" - vue-style-loader "^4.1.0" - -"@vue/web-component-wrapper@^1.3.0": - version "1.3.0" - resolved "https://registry.npmjs.org/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz" - integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA== - -"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" - integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== - dependencies: - "@webassemblyjs/helper-numbers" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - -"@webassemblyjs/floating-point-hex-parser@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz" - integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== - -"@webassemblyjs/helper-api-error@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz" - integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== - -"@webassemblyjs/helper-buffer@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz" - integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== - -"@webassemblyjs/helper-numbers@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz" - integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.13.2" - "@webassemblyjs/helper-api-error" "1.13.2" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz" - integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== - -"@webassemblyjs/helper-wasm-section@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz" - integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/wasm-gen" "1.14.1" - -"@webassemblyjs/ieee754@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz" - integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz" - integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.13.2": - version "1.13.2" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz" - integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== - -"@webassemblyjs/wasm-edit@^1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz" - integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/helper-wasm-section" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-opt" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - "@webassemblyjs/wast-printer" "1.14.1" - -"@webassemblyjs/wasm-gen@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz" - integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wasm-opt@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz" - integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-buffer" "1.14.1" - "@webassemblyjs/wasm-gen" "1.14.1" - "@webassemblyjs/wasm-parser" "1.14.1" - -"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" - integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@webassemblyjs/helper-api-error" "1.13.2" - "@webassemblyjs/helper-wasm-bytecode" "1.13.2" - "@webassemblyjs/ieee754" "1.13.2" - "@webassemblyjs/leb128" "1.13.2" - "@webassemblyjs/utf8" "1.13.2" - -"@webassemblyjs/wast-printer@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz" - integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== - dependencies: - "@webassemblyjs/ast" "1.14.1" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abab@^2.0.3, abab@^2.0.5: - version "2.0.6" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" - integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== - -abbrev@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz" - integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== - -abs-svg-path@~0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz" - integrity sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA== - -accepts@~1.3.4, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - -acorn-jsx@^5.0.0, acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^7.1.1: - version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^8.0.0, acorn-walk@^8.0.2: - version "8.3.4" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== - dependencies: - acorn "^8.11.0" - -acorn@^6.0.2: - version "6.4.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - -acorn@^7.1.1: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.0.4, acorn@^8.0.5, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0, acorn@^8.2.4: - version "8.15.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== - -add-dom-event-listener@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/add-dom-event-listener/-/add-dom-event-listener-1.1.0.tgz" - integrity sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw== - dependencies: - object-assign "4.x" - -address@^1.1.2: - version "1.2.2" - resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -agent-base@6: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@^8.0.1: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - -align-text@^0.1.1, align-text@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" - integrity sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg== - dependencies: - kind-of "^3.0.2" - longest "^1.0.1" - repeat-string "^1.5.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0, ansi-escapes@^4.3.1: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ant-design-vue@^1.6.2, ant-design-vue@^1.7.8: - version "1.7.8" - resolved "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-1.7.8.tgz" - integrity sha512-F1hmiS9vwbyfuFvlamdW5l9bHKqRlj9wHaGDIE41NZMWXyWy8qL0UFa/+I0Wl8gQWZCqODW5pN6Yfoyn85At3A== - dependencies: - "@ant-design/icons" "^2.1.1" - "@ant-design/icons-vue" "^2.0.0" - "@simonwep/pickr" "~1.7.0" - add-dom-event-listener "^1.0.2" - array-tree-filter "^2.1.0" - async-validator "^3.0.3" - babel-helper-vue-jsx-merge-props "^2.0.3" - babel-runtime "6.x" - classnames "^2.2.5" - component-classes "^1.2.6" - dom-align "^1.10.4" - dom-closest "^0.2.0" - dom-scroll-into-view "^2.0.0" - enquire.js "^2.1.6" - intersperse "^1.0.0" - is-mobile "^2.2.1" - is-negative-zero "^2.0.0" - ismobilejs "^1.0.0" - json2mq "^0.2.0" - lodash "^4.17.5" - moment "^2.21.0" - mutationobserver-shim "^0.3.2" - node-emoji "^1.10.0" - omit.js "^1.0.0" - raf "^3.4.0" - resize-observer-polyfill "^1.5.1" - shallow-equal "^1.0.0" - shallowequal "^1.0.2" - vue-ref "^2.0.0" - warning "^4.0.0" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arch@^2.1.1: - version "2.2.0" - resolved "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz" - integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== - dependencies: - call-bound "^1.0.3" - is-array-buffer "^3.0.5" - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" - integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== - -array-includes@^3.1.9: - version "3.1.9" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz" - integrity sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.24.0" - es-object-atoms "^1.1.1" - get-intrinsic "^1.3.0" - is-string "^1.1.1" - math-intrinsics "^1.1.0" - -array-tree-filter@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz" - integrity sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz" - integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-shim-unscopables "^1.1.0" - -array.prototype.flat@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz" - integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.flatmap@^1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz" - integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-shim-unscopables "^1.0.2" - -array.prototype.reduce@^1.0.6: - version "1.0.8" - resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.8.tgz" - integrity sha512-DwuEqgXFBwbmZSRqt3BpQigWNUoqw9Ml2dTWdF3B2zQlQX4OeUE0zyuzX0fX0IbTvjdkZbcBTU3idgpO78qkTw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.4" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-array-method-boxes-properly "^1.0.0" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - is-string "^1.1.1" - -arraybuffer.prototype.slice@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz" - integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== - dependencies: - array-buffer-byte-length "^1.0.1" - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - is-array-buffer "^3.0.4" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-function@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" - integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== - -async-validator@^3.0.3: - version "3.5.2" - resolved "https://registry.npmjs.org/async-validator/-/async-validator-3.5.2.tgz" - integrity sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ== - -async@^3.2.6: - version "3.2.6" - resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" - integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.2.4: - version "10.4.21" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz" - integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== - dependencies: - browserslist "^4.24.4" - caniuse-lite "^1.0.30001702" - fraction.js "^4.3.7" - normalize-range "^0.1.2" - picocolors "^1.1.1" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" - integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== - dependencies: - possible-typed-array-names "^1.0.0" - -axios@^0.26.1: - version "0.26.1" - resolved "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - -babel-eslint@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz" - integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.7.0" - "@babel/traverse" "^7.7.0" - "@babel/types" "^7.7.0" - eslint-visitor-keys "^1.0.0" - resolve "^1.12.0" - -babel-helper-vue-jsx-merge-props@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz" - integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== - -babel-jest@^27.1.0, babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-loader@^8.2.2, babel-loader@8: - version "8.4.1" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.4.1.tgz" - integrity sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.4" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-import@^1.13.3: - version "1.13.8" - resolved "https://registry.npmjs.org/babel-plugin-import/-/babel-plugin-import-1.13.8.tgz" - integrity sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-polyfill-corejs2@^0.4.14: - version "0.4.14" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz" - integrity sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg== - dependencies: - "@babel/compat-data" "^7.27.7" - "@babel/helper-define-polyfill-provider" "^0.6.5" - semver "^6.3.1" - -babel-plugin-polyfill-corejs3@^0.13.0: - version "0.13.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz" - integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.5" - core-js-compat "^3.43.0" - -babel-plugin-polyfill-regenerator@^0.6.5: - version "0.6.5" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz" - integrity sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.5" - -babel-plugin-transform-remove-console@^6.9.4: - version "6.9.4" - resolved "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz" - integrity sha512-88blrUrMX3SPiGkT1GnvVY8E/7A+k6oj3MNvUtTIxJflFzXTw1bHkuJ/y039ouhFMp2prRn5cQGzokViYi1dsg== - -babel-preset-current-node-syntax@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz" - integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-import-attributes" "^7.24.7" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== - dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" - -babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@6.x: - version "6.26.0" - resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" - integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g== - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -balanced-match@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz" - integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -batch-processor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz" - integrity sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -bl@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@^3.1.1: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== - dependencies: - bytes "3.1.2" - content-type "~1.0.5" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.3.0" - resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.3.0.tgz" - integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== - dependencies: - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0, boolbase@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz" - integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.0.0, browserslist@^4.16.3, browserslist@^4.21.4, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.1: - version "4.25.2" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz" - integrity sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA== - dependencies: - caniuse-lite "^1.0.30001733" - electron-to-chromium "^1.5.199" - node-releases "^2.0.19" - update-browserslist-db "^1.1.3" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cachedir@2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" - integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== - -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz" - integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - -call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8, call-bind@~1.0.2: - version "1.0.8" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== - dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" - set-function-length "^1.2.2" - -call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz" - integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== - dependencies: - call-bind-apply-helpers "^1.0.2" - get-intrinsic "^1.3.0" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^1.0.2: - version "1.2.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" - integrity sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001733: - version "1.0.30001734" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001734.tgz" - integrity sha512-uhE1Ye5vgqju6OI71HTQqcBCZrvHugk0MjLak7Q+HfoBgoq5Bi+5YnwjP4fjDgrtYr/l8MVRBvzz9dPD4KyK0A== - -case-sensitive-paths-webpack-plugin@^2.3.0: - version "2.4.0" - resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" - integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== - -center-align@^0.1.1: - version "0.1.3" - resolved "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz" - integrity sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ== - dependencies: - align-text "^0.1.3" - lazy-cache "^1.0.3" - -chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -chalk@^2.1.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.4.1: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -char-regex@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz" - integrity sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -charenc@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -chokidar@^3.5.3: - version "3.6.0" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz" - integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== - -ci-info@^1.5.0: - version "1.6.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz" - integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== - -ci-info@^3.2.0: - version "3.9.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" - integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== - -cjs-module-lexer@^1.0.0: - version "1.4.3" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz" - integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q== - -classnames@^2.2.5, classnames@^2.2.6: - version "2.5.1" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz" - integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== - -clean-css@^5.2.2: - version "5.3.3" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz" - integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-cursor@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz" - integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== - dependencies: - restore-cursor "^2.0.0" - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-highlight@^2.1.10: - version "2.1.11" - resolved "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== - dependencies: - chalk "^4.0.0" - highlight.js "^10.7.1" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - -cli-spinners@^2.5.0: - version "2.9.2" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" - integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -clipboard@^2.0.0: - version "2.0.11" - resolved "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz" - integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== - dependencies: - good-listener "^1.2.2" - select "^1.1.2" - tiny-emitter "^2.0.0" - -clipboardy@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz" - integrity sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ== - dependencies: - arch "^2.1.1" - execa "^1.0.0" - is-wsl "^2.1.1" - -cliui@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz" - integrity sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA== - dependencies: - center-align "^0.1.1" - right-align "^0.1.1" - wordwrap "0.0.2" - -cliui@^7.0.2, cliui@^7.0.4: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" - integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== - -clone@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz" - integrity sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" - integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== - -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - -codemirror@^5.65.16: - version "5.65.16" - resolved "https://registry.npmjs.org/codemirror/-/codemirror-5.65.16.tgz" - integrity sha512-br21LjYmSlVL0vFCPWPfhzUCT34FM/pAdK7rRIZwa0rrtrIdotvP4Oh4GUHsu2E3IrQMCfRkL/fN3ytMNxVQvg== - -collect-v8-coverage@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" - integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -colord@^2.9.1, colord@^2.9.3: - version "2.9.3" - resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.10, colorette@^2.0.16: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -commander@*, commander@^2.20.0, commander@2: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^10.0.0: - version "10.0.1" - resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commander@^9.3.0: - version "9.5.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz" - integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== - -commitizen@^4.0.3, commitizen@^4.2.4: - version "4.3.1" - resolved "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz" - integrity sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw== - dependencies: - cachedir "2.3.0" - cz-conventional-changelog "3.3.0" - dedent "0.7.0" - detect-indent "6.1.0" - find-node-modules "^2.1.2" - find-root "1.1.0" - fs-extra "9.1.0" - glob "7.2.3" - inquirer "8.2.5" - is-utf8 "^0.2.1" - lodash "4.17.21" - minimist "1.2.7" - strip-bom "4.0.0" - strip-json-comments "3.1.1" - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -component-classes@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/component-classes/-/component-classes-1.2.6.tgz" - integrity sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA== - dependencies: - component-indexof "0.0.3" - -component-indexof@0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/component-indexof/-/component-indexof-0.0.3.tgz" - integrity sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw== - -compressible@~2.0.18: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.8.1" - resolved "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz" - integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== - dependencies: - bytes "3.1.2" - compressible "~2.0.18" - debug "2.6.9" - negotiator "~0.6.4" - on-headers "~1.1.0" - safe-buffer "5.2.1" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -condense-newlines@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/condense-newlines/-/condense-newlines-0.2.1.tgz" - integrity sha512-P7X+QL9Hb9B/c8HI5BFFKmjgBu2XpQuF98WZ9XkO+dBGgk5XgwiQz7o1SmpglNWId3581UcS0SFAWfoIhMHPfg== - dependencies: - extend-shallow "^2.0.1" - is-whitespace "^0.3.0" - kind-of "^3.0.2" - -config-chain@^1.1.13: - version "1.1.13" - resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" - integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -consolidate@^0.15.1: - version "0.15.1" - resolved "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz" - integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw== - dependencies: - bluebird "^3.1.1" - -container-query-toolkit@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/container-query-toolkit/-/container-query-toolkit-0.1.3.tgz" - integrity sha512-B1EvYaLzFKz81vgWDm+zL0X7fzFUjlN6lF/RivDeNT4xW9mFsTh1oiC9rtvFFiwG52e3JUmYLXwPpqNBf2AXHA== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4, content-type@~1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -contour_plot@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/contour_plot/-/contour_plot-0.0.1.tgz" - integrity sha512-Nil2HI76Xux6sVGORvhSS8v66m+/h5CwFkBJDO+U5vWaMdNC0yXNCsGDPbzPhvqOEU5koebhdEvD372LI+IyLw== - -conventional-changelog-angular@^5.0.11: - version "5.0.13" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz" - integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== - dependencies: - compare-func "^2.0.0" - q "^1.5.1" - -conventional-changelog-conventionalcommits@^4.3.1: - version "4.6.3" - resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz" - integrity sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g== - dependencies: - compare-func "^2.0.0" - lodash "^4.17.15" - q "^1.5.1" - -conventional-commit-types@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz" - integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== - -conventional-commits-parser@^3.0.0: - version "3.2.4" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== - dependencies: - is-text-path "^1.0.1" - JSONStream "^1.0.4" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -convert-source-map@^1.4.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^1.6.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== - -copy-anything@^2.0.1: - version "2.0.6" - resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" - integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== - dependencies: - is-what "^3.14.1" - -copy-to-clipboard@^3.3.1: - version "3.3.3" - resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" - integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== - dependencies: - toggle-selection "^1.0.6" - -copy-webpack-plugin@^9.0.1: - version "9.1.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz" - integrity sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA== - dependencies: - fast-glob "^3.2.7" - glob-parent "^6.0.1" - globby "^11.0.3" - normalize-path "^3.0.0" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - -core-js-compat@^3.43.0, core-js-compat@^3.8.3: - version "3.45.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.0.tgz" - integrity sha512-gRoVMBawZg0OnxaVv3zpqLLxaHmsubEGyTnqdpI/CEBvX4JadI1dMSHxagThprYRtSVbuQxvi6iUatdPxohHpA== - dependencies: - browserslist "^4.25.1" - -core-js@^2.4.0: - version "2.6.12" - resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-js@^3.21.1, core-js@^3.6.5, core-js@^3.8.3: - version "3.45.0" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.45.0.tgz" - integrity sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA== - -core-js@2: - version "2.6.12" - resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" - integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^7.0.0, cosmiconfig@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.0: - version "6.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz" - integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: - version "7.0.6" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" - integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypt@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -crypto-js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz" - integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== - -css-declaration-sorter@^6.3.1: - version "6.4.1" - resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz" - integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== - -css-functions-list@^3.1.0: - version "3.2.3" - resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz" - integrity sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA== - -css-loader@^6.5.0: - version "6.11.0" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz" - integrity sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.33" - postcss-modules-extract-imports "^3.1.0" - postcss-modules-local-by-default "^4.0.5" - postcss-modules-scope "^3.2.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.5.4" - -css-minimizer-webpack-plugin@^3.0.2: - version "3.4.1" - resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz" - integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== - dependencies: - cssnano "^5.0.6" - jest-worker "^27.0.2" - postcss "^8.3.5" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-tree@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz" - integrity sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== - dependencies: - mdn-data "2.12.2" - source-map-js "^1.0.1" - -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== - -css-what@^6.0.1: - version "6.2.2" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz" - integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.0.0, cssnano@^5.0.6: - version "5.1.15" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.0.2, csso@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.1.0: - version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -cz-conventional-changelog@^3.3.0, cz-conventional-changelog@3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz" - integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== - dependencies: - chalk "^2.4.1" - commitizen "^4.0.3" - conventional-commit-types "^3.0.0" - lodash.map "^4.5.1" - longest "^2.0.1" - word-wrap "^1.0.3" - optionalDependencies: - "@commitlint/load" ">6.1.1" - -d3-array@~1.2.0, d3-array@1: - version "1.2.4" - resolved "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== - -d3-collection@1: - version "1.0.7" - resolved "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz" - integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== - -d3-color@1: - version "1.4.1" - resolved "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -d3-composite-projections@~1.2.0: - version "1.2.3" - resolved "https://registry.npmjs.org/d3-composite-projections/-/d3-composite-projections-1.2.3.tgz" - integrity sha512-RxNBoRGf3epTnQBUKeEpaXpD8BA/Ud0xRuLwWxyI7dWfuuYgJZMKw6ZsZOwfDNC0ZbMWaU0eBFlL05A2jlcsWg== - dependencies: - d3-geo "^1.11.6" - d3-path "^1.0.7" - -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== - -d3-dsv@~1.0.5: - version "1.0.10" - resolved "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.10.tgz" - integrity sha512-vqklfpxmtO2ZER3fq/B33R/BIz3A1PV0FaZRuFM8w6jLo7sUX1BZDh73fPlr0s327rzq4H6EN1q9U+eCBCSN8g== - dependencies: - commander "2" - iconv-lite "0.4" - rw "1" - -d3-ease@~1.0.3, d3-ease@1: - version "1.0.7" - resolved "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz" - integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== - -d3-format@^1.3.0: - version "1.4.5" - resolved "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz" - integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== - -d3-geo-projection@~2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.1.2.tgz" - integrity sha512-zft6RRvPaB1qplTodBVcSH5Ftvmvvg0qoDiqpt+fyNthGr/qr+DD30cizNDluXjW7jmo7EKUTjvFCAHofv08Ow== - dependencies: - commander "2" - d3-array "1" - d3-geo "^1.1.0" - -d3-geo@^1.1.0, d3-geo@~1.6.4: - version "1.6.4" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-1.6.4.tgz" - integrity sha512-O5Q3iftLc6/EdU1MHUm+O29NoKKN/cyQtySnD9/yEEcinN+q4ng+H56e2Yn1YWdfZBoiaRVtR2NoJ3ivKX5ptQ== - dependencies: - d3-array "1" - -d3-geo@^1.11.6: - version "1.12.1" - resolved "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz" - integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== - dependencies: - d3-array "1" - -d3-hexjson@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/d3-hexjson/-/d3-hexjson-1.0.1.tgz" - integrity sha512-TeH4T0PSbDazMm3gHgc4ulO0PfrZpz0Uk3y5tCGz+NgC7HnX7KBdem7uAN+j9x3ZshTh7raN3V/bFhaLB2C8DA== - dependencies: - d3-array "1" - -d3-hierarchy@~1.1.5: - version "1.1.9" - resolved "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== - -d3-interpolate@~1.1.5, d3-interpolate@1: - version "1.1.6" - resolved "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz" - integrity sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A== - dependencies: - d3-color "1" - -d3-path@^1.0.7, d3-path@1: - version "1.0.9" - resolved "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== - -d3-sankey@~0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.7.1.tgz" - integrity sha512-KAyowBWtTLQxyXq1UhXcdCXKbuCQvL51FgqOS+fKlNTQ/4FfSWabRlWs2DezzwKyredAsOhBSQZN/i0XdeE2tQ== - dependencies: - d3-array "1" - d3-collection "1" - d3-shape "^1.2.0" - -d3-selection@^1.0.2, d3-selection@^1.1.0: - version "1.4.2" - resolved "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz" - integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== - -d3-shape@^1.2.0: - version "1.3.7" - resolved "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - -d3-timer@~1.0.6, d3-timer@1: - version "1.0.10" - resolved "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - -d3-transition@^1.0.1: - version "1.3.2" - resolved "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz" - integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== - dependencies: - d3-color "1" - d3-dispatch "1" - d3-ease "1" - d3-interpolate "1" - d3-selection "^1.1.0" - d3-timer "1" - -d3-voronoi@~1.1.2: - version "1.1.4" - resolved "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz" - integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== - -dagre@~0.8.2: - version "0.8.5" - resolved "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz" - integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== - dependencies: - graphlib "^2.1.8" - lodash "^4.17.15" - -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -data-view-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz" - integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-length@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz" - integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-data-view "^1.0.2" - -data-view-byte-offset@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz" - integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-data-view "^1.0.1" - -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" - integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== - -debounce@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" - integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.4, debug@^4.3.6, debug@^4.4.1, debug@4: - version "4.4.1" - resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" - integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== - dependencies: - ms "^2.1.3" - -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.0.0, decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decimal.js@^10.2.1: - version "10.6.0" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz" - integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== - -dedent@^0.7.0, dedent@0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" - integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== - -deep-equal@^1.0.1, deep-equal@~1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz" - integrity sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg== - dependencies: - is-arguments "^1.1.1" - is-date-object "^1.0.5" - is-regex "^1.1.4" - object-is "^1.1.5" - object-keys "^1.1.1" - regexp.prototype.flags "^1.5.1" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -deepmerge@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-1.5.2.tgz" - integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defaults@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" - integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== - dependencies: - clone "^1.0.2" - -define-data-property@^1.0.1, define-data-property@^1.1.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -defined@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz" - integrity sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q== - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -delegate@^3.1.2: - version "3.2.0" - resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz" - integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-browser@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz" - integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" - integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== - -detect-indent@6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" - integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-packet@^5.2.2: - version "5.6.1" - resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" - integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-align@^1.10.4: - version "1.12.4" - resolved "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz" - integrity sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw== - -dom-closest@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/dom-closest/-/dom-closest-0.2.0.tgz" - integrity sha512-6neTn1BtJlTSt+XSISXpnOsF1uni1CHsP/tmzZMGWxasYFHsBOqrHPnzmneqEgKhpagnfnfSfbvRRW0xFsBHAA== - dependencies: - dom-matches ">=1.0.1" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-event-types@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.1.0.tgz" - integrity sha512-jNCX+uNJ3v38BKvPbpki6j5ItVlnSqVV6vDWGS6rExzCMjsc39frLjm1n91o6YaKK6AZl0wLloItW6C6mr61BQ== - -dom-matches@>=1.0.1: - version "2.0.0" - resolved "https://registry.npmjs.org/dom-matches/-/dom-matches-2.0.0.tgz" - integrity sha512-2VI856xEDCLXi19W+4BechR5/oIS6bKCKqcf16GR8Pg7dGLJ/eBOWVbCmQx2ISvYH6wTNx5Ef7JTOw1dRGRx6A== - -dom-scroll-into-view@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz" - integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w== - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -domelementtype@^1.3.1, domelementtype@1: - version "1.3.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^1.5.1, domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -domutils@^2.5.2: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv-expand@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" - integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== - -dotenv@^10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -dotignore@~0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz" - integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== - dependencies: - minimatch "^3.0.4" - -dunder-proto@^1.0.0, dunder-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" - integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== - dependencies: - call-bind-apply-helpers "^1.0.1" - es-errors "^1.3.0" - gopd "^1.2.0" - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -easy-stack@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/easy-stack/-/easy-stack-1.0.1.tgz" - integrity sha512-wK2sCs4feiiJeFXn3zvY0p41mdU5VUgbgs1rNsc/y5ngFUijdWd+iIN8eoyuZHKB8xN6BL4PdWmzqFmxNg6V2w== - -echarts@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz" - integrity sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ== - dependencies: - tslib "2.3.0" - zrender "6.0.0" - -editorconfig@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/editorconfig/-/editorconfig-1.0.4.tgz" - integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q== - dependencies: - "@one-ini/wasm" "0.1.1" - commander "^10.0.0" - minimatch "9.0.1" - semver "^7.5.3" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.5.199: - version "1.5.200" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.200.tgz" - integrity sha512-rFCxROw7aOe4uPTfIAx+rXv9cEcGx+buAF4npnhtTqCJk5KDFRnh3+KYj7rdVh6lsFt5/aPs+Irj9rZ33WMA7w== - -element-resize-detector@1.1.13: - version "1.1.13" - resolved "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.1.13.tgz" - integrity sha512-QzMTvOM+hSXzPGxO4XeHq8OJAJZ/0kZQRbIBVGlR4GRVWHdfv/I/udYzIcQCZtzN1LdwkrGsNPWTIDbC8Tj7PA== - dependencies: - batch-processor "^1.0.0" - -emittery@^0.10.2: - version "0.10.2" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" - integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" - integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -encodeurl@~2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" - integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== - -encoding@^0.1.11: - version "0.1.13" - resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.1.0: - version "1.4.5" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz" - integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.17.2: - version "5.18.3" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enquire.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz" - integrity sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw== - -enquirer@^2.3.5: - version "2.4.1" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz" - integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== - dependencies: - ansi-colors "^4.1.1" - strip-ansi "^6.0.1" - -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -errno@^0.1.1: - version "0.1.8" - resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error-stack-parser@^2.0.6: - version "2.1.4" - resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz" - integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== - dependencies: - stackframe "^1.3.4" - -es-abstract@^1.17.2, es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.0: - version "1.24.0" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz" - integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== - dependencies: - array-buffer-byte-length "^1.0.2" - arraybuffer.prototype.slice "^1.0.4" - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - data-view-buffer "^1.0.2" - data-view-byte-length "^1.0.2" - data-view-byte-offset "^1.0.1" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - es-set-tostringtag "^2.1.0" - es-to-primitive "^1.3.0" - function.prototype.name "^1.1.8" - get-intrinsic "^1.3.0" - get-proto "^1.0.1" - get-symbol-description "^1.1.0" - globalthis "^1.0.4" - gopd "^1.2.0" - has-property-descriptors "^1.0.2" - has-proto "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - internal-slot "^1.1.0" - is-array-buffer "^3.0.5" - is-callable "^1.2.7" - is-data-view "^1.0.2" - is-negative-zero "^2.0.3" - is-regex "^1.2.1" - is-set "^2.0.3" - is-shared-array-buffer "^1.0.4" - is-string "^1.1.1" - is-typed-array "^1.1.15" - is-weakref "^1.1.1" - math-intrinsics "^1.1.0" - object-inspect "^1.13.4" - object-keys "^1.1.1" - object.assign "^4.1.7" - own-keys "^1.0.1" - regexp.prototype.flags "^1.5.4" - safe-array-concat "^1.1.3" - safe-push-apply "^1.0.0" - safe-regex-test "^1.1.0" - set-proto "^1.0.0" - stop-iteration-iterator "^1.1.0" - string.prototype.trim "^1.2.10" - string.prototype.trimend "^1.0.9" - string.prototype.trimstart "^1.0.8" - typed-array-buffer "^1.0.3" - typed-array-byte-length "^1.0.3" - typed-array-byte-offset "^1.0.4" - typed-array-length "^1.0.7" - unbox-primitive "^1.1.0" - which-typed-array "^1.1.19" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-define-property@^1.0.0, es-define-property@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" - integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.2.1: - version "1.7.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== - -es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== - dependencies: - es-errors "^1.3.0" - -es-set-tostringtag@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz" - integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== - dependencies: - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -es-shim-unscopables@^1.0.2, es-shim-unscopables@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz" - integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== - dependencies: - hasown "^2.0.2" - -es-to-primitive@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz" - integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== - dependencies: - is-callable "^1.2.7" - is-date-object "^1.0.5" - is-symbol "^1.0.4" - -escalade@^3.1.1, escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.2: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" - integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-standard@^12.0.0: - version "12.0.0" - resolved "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz" - integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ== - -eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-module-utils@^2.12.1: - version "2.12.1" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz" - integrity sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== - dependencies: - debug "^3.2.7" - -eslint-plugin-es@^1.3.1: - version "1.4.1" - resolved "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz" - integrity sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA== - dependencies: - eslint-utils "^1.4.2" - regexpp "^2.0.1" - -eslint-plugin-html@^5.0.5: - version "5.0.5" - resolved "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-5.0.5.tgz" - integrity sha512-v/33i3OD0fuXcRXexVyXXBOe4mLBLBQoF1UO1Uy9D+XLq4MC8K45GcQKfqjC/FnHAHp3pYUjpHHktYNCtShGmg== - dependencies: - htmlparser2 "^3.10.0" - -eslint-plugin-import@^2.14.0: - version "2.32.0" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" - integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== - dependencies: - "@rtsao/scc" "^1.1.0" - array-includes "^3.1.9" - array.prototype.findlastindex "^1.2.6" - array.prototype.flat "^1.3.3" - array.prototype.flatmap "^1.3.3" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.12.1" - hasown "^2.0.2" - is-core-module "^2.16.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.8" - object.groupby "^1.0.3" - object.values "^1.2.1" - semver "^6.3.1" - string.prototype.trimend "^1.0.9" - tsconfig-paths "^3.15.0" - -eslint-plugin-node@^8.0.0: - version "8.0.1" - resolved "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-8.0.1.tgz" - integrity sha512-ZjOjbjEi6jd82rIpFSgagv4CHWzG9xsQAVp1ZPlhRnnYxcTgENUVBvhYmkQ7GvT1QFijUSo69RaiOJKhMu6i8w== - dependencies: - eslint-plugin-es "^1.3.1" - eslint-utils "^1.3.1" - ignore "^5.0.2" - minimatch "^3.0.4" - resolve "^1.8.1" - semver "^5.5.0" - -eslint-plugin-promise@^4.0.1: - version "4.3.1" - resolved "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.3.1.tgz" - integrity sha512-bY2sGqyptzFBDLh/GMbAxfdJC+b0f23ME63FOE4+Jao0oZ3E1LEwFtWJX/1pGMJLiTtrSSern2CRM/g+dfc0eQ== - -eslint-plugin-standard@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.1.0.tgz" - integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ== - -eslint-plugin-vue@^5.2.3: - version "5.2.3" - resolved "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz" - integrity sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw== - dependencies: - vue-eslint-parser "^5.0.0" - -eslint-scope@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -eslint-scope@^5.1.1, eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^1.3.1: - version "1.4.3" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^1.4.2: - version "1.4.3" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-webpack-plugin@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz" - integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== - dependencies: - "@types/eslint" "^7.29.0 || ^8.4.1" - jest-worker "^28.0.2" - micromatch "^4.0.5" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - -eslint@^7.0.0: - version "7.32.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/espree/-/espree-4.1.0.tgz" - integrity sha512-I5BycZW6FCVIub93TeVY1s7vjhP9CY6cXCznIRfiig7nRviKZYdRnj/sHEWC6A7WE9RDWOFq9+7OsWSYz8qv2w== - dependencies: - acorn "^6.0.2" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1, esquery@^1.4.0: - version "1.6.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" - integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.1.0, esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -estree-walker@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -event-pubsub@4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/event-pubsub/-/event-pubsub-4.3.0.tgz" - integrity sha512-z7IyloorXvKbFx9Bpie2+vMJKKx1fH1EN5yiTfp8CiLOTptSYy1g8H4yDpGlEdshL1PBiFtBHepF2cNsqeEeFQ== - -eventemitter3@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz" - integrity sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg== - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz" - integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" - integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== - dependencies: - homedir-polyfill "^1.0.1" - -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -express@^4.17.3: - version "4.21.2" - resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.12" - proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -fancy-canvas@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fancy-canvas/-/fancy-canvas-2.1.0.tgz" - integrity sha512-nifxXJ95JNLFR2NgRV4/MxVP45G9909wJTEKz5fg/TZS20JJZA6hfgRVh/bC9bwl2zBtBNcYPjiBE4njQHVBwQ== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz" - integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig== - -fast-glob@^3.2.12, fast-glob@^3.2.7, fast-glob@^3.2.9: - version "3.3.3" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-uri@^3.0.1: - version "3.0.6" - resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz" - integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== - -fastest-levenshtein@^1.0.16: - version "1.0.16" - resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fb-watchman@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" - integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== - dependencies: - bser "2.1.1" - -fecha@~2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/fecha/-/fecha-2.3.3.tgz" - integrity sha512-lUGBnIamTAwk4znq5BcqsDaxSmZ9nDVJaij6NvRt/Tg4R69gERA+otPKbS86ROw9nxVMw2/mp1fnaiWqbs6Sdg== - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz" - integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== - dependencies: - debug "2.6.9" - encodeurl "~2.0.0" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-node-modules@^2.1.2: - version "2.1.3" - resolved "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz" - integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== - dependencies: - findup-sync "^4.0.0" - merge "^2.1.1" - -find-root@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -findup-sync@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz" - integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^4.0.2" - resolve-dir "^1.0.1" - -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.2.9: - version "3.3.3" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz" - integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== - -fmin@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/fmin/-/fmin-0.0.2.tgz" - integrity sha512-sSi6DzInhl9d8yqssDfGZejChO8d2bAGIpysPsvYsxFe898z89XhCZg6CPNV3nhUhFefeC/AXZK2bAJxlBjN6A== - dependencies: - contour_plot "^0.0.1" - json2module "^0.0.3" - rollup "^0.25.8" - tape "^4.5.1" - uglify-js "^2.6.2" - -follow-redirects@^1.0.0, follow-redirects@^1.14.8: - version "1.15.11" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== - -for-each@^0.3.3, for-each@^0.3.5, for-each@~0.3.3: - version "0.3.5" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz" - integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== - dependencies: - is-callable "^1.2.7" - -foreground-child@^3.1.0: - version "3.3.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz" - integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== - dependencies: - cross-spawn "^7.0.6" - signal-exit "^4.0.1" - -form-data@^3.0.0: - version "3.0.4" - resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz" - integrity sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.35" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^9.0.0, fs-extra@^9.1.0, fs-extra@9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.4: - version "1.1.0" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.1.0.tgz" - integrity sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.6, function.prototype.name@^1.1.8: - version "1.1.8" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz" - integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - functions-have-names "^1.2.3" - hasown "^2.0.2" - is-callable "^1.2.7" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" - integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== - dependencies: - call-bind-apply-helpers "^1.0.2" - es-define-property "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.1.1" - function-bind "^1.1.2" - get-proto "^1.0.1" - gopd "^1.2.0" - has-symbols "^1.1.0" - hasown "^2.0.2" - math-intrinsics "^1.1.0" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-proto@^1.0.0, get-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz" - integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== - dependencies: - dunder-proto "^1.0.1" - es-object-atoms "^1.0.0" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz" - integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - get-intrinsic "^1.2.6" - -git-raw-commits@^2.0.0: - version "2.0.11" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== - dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -git-revision-webpack-plugin@^3.0.6: - version "3.0.6" - resolved "https://registry.npmjs.org/git-revision-webpack-plugin/-/git-revision-webpack-plugin-3.0.6.tgz" - integrity sha512-vW/9dBahGbpKPcccy3xKkHgdWoH/cAPPc3lQw+3edl7b4j29JfNGVrja0a1d8ZoRe4nTN8GCPrF9aBErDnzx5Q== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^10.4.2: - version "10.4.5" - resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.2.3, glob@7.2.3: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz" - integrity sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg== - dependencies: - ini "^1.3.4" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" - integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^13.6.0, globals@^13.9.0: - version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" - integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== - dependencies: - define-properties "^1.2.1" - gopd "^1.0.1" - -globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globjoin@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz" - integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== - -good-listener@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz" - integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== - dependencies: - delegate "^3.1.2" - -gopd@^1.0.1, gopd@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" - integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphlib@^2.1.8: - version "2.1.8" - resolved "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz" - integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== - dependencies: - lodash "^4.17.15" - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - -has-bigints@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz" - integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz" - integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== - dependencies: - dunder-proto "^1.0.0" - -has-symbols@^1.0.1, has-symbols@^1.0.3, has-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" - integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== - -has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" - integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== - dependencies: - has-symbols "^1.0.3" - -has@~1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -hash-sum@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz" - integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA== - -hash-sum@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz" - integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg== - -hasown@^2.0.0, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-entities@^2.3.2: - version "2.6.0" - resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz" - integrity sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== - -html-escaper@^2.0.0, html-escaper@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz" - integrity sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g== - -html-tags@^3.2.0: - version "3.3.1" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -html-webpack-plugin@^5.1.0: - version "5.6.3" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.3.tgz" - integrity sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^3.10.0: - version "3.10.1" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-parser-js@>=0.5.1: - version "0.5.10" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz" - integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-proxy-middleware@^2.0.3: - version "2.0.9" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz" - integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -husky@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz" - integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ== - -iconv-lite@^0.4.24, iconv-lite@0.4, iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.0.2: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^5.2.0: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -ignore@^5.2.1: - version "5.3.2" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" - integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== - -image-size@~0.5.0: - version "0.5.5" - resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" - integrity sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.1" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz" - integrity sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - -import-local@^3.0.2: - version "3.2.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz" - integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4, inherits@2, inherits@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@^1.3.4, ini@^1.3.5: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@8.2.5: - version "8.2.5" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - -insert-css@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/insert-css/-/insert-css-2.0.0.tgz" - integrity sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA== - -internal-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" - integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== - dependencies: - es-errors "^1.3.0" - hasown "^2.0.2" - side-channel "^1.1.0" - -intersperse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/intersperse/-/intersperse-1.0.0.tgz" - integrity sha512-LGcfug7OTeWkaQ8PEq8XbTy9Jl6uCNg8DrPnQUmwxSY8UETj1Y+LLmpdD0qHdEj6KVchuH3BE3ZzIXQ1t3oFUw== - -ipaddr.js@^2.0.1: - version "2.2.0" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" - integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arguments@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz" - integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-array-buffer@^3.0.4, is-array-buffer@^3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz" - integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-async-function@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz" - integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== - dependencies: - async-function "^1.0.0" - call-bound "^1.0.3" - get-proto "^1.0.1" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-bigint@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz" - integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== - dependencies: - has-bigints "^1.0.2" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz" - integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-buffer@^1.1.5, is-buffer@~1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-ci@^1.0.10: - version "1.2.1" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz" - integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg== - dependencies: - ci-info "^1.5.0" - -is-core-module@^2.13.0, is-core-module@^2.16.0, is-core-module@^2.16.1, is-core-module@^2.5.0: - version "2.16.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-data-view@^1.0.1, is-data-view@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz" - integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== - dependencies: - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - is-typed-array "^1.1.13" - -is-date-object@^1.0.5, is-date-object@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz" - integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== - dependencies: - call-bound "^1.0.2" - has-tostringtag "^1.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-file-esm@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-file-esm/-/is-file-esm-1.0.0.tgz" - integrity sha512-rZlaNKb4Mr8WlRu2A9XdeoKgnO5aA53XdPHgCKVyCrQ/rWi89RET1+bq37Ru46obaQXeiX4vmFIm1vks41hoSA== - dependencies: - read-pkg-up "^7.0.1" - -is-finalizationregistry@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz" - integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== - dependencies: - call-bound "^1.0.3" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-generator-function@^1.0.10: - version "1.1.0" - resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz" - integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== - dependencies: - call-bound "^1.0.3" - get-proto "^1.0.0" - has-tostringtag "^1.0.2" - safe-regex-test "^1.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-map@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" - integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== - -is-mobile@^2.2.1: - version "2.2.2" - resolved "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz" - integrity sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg== - -is-negative-zero@^2.0.0, is-negative-zero@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz" - integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== - -is-number-object@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz" - integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-regex@^1.1.4, is-regex@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz" - integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== - dependencies: - call-bound "^1.0.2" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - hasown "^2.0.2" - -is-regex@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz" - integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== - -is-shared-array-buffer@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz" - integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== - dependencies: - call-bound "^1.0.3" - -is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz" - integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== - dependencies: - call-bound "^1.0.3" - has-tostringtag "^1.0.2" - -is-symbol@^1.0.4, is-symbol@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz" - integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== - dependencies: - call-bound "^1.0.2" - has-symbols "^1.1.0" - safe-regex-test "^1.1.0" - -is-text-path@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz" - integrity sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== - dependencies: - text-extensions "^1.0.0" - -is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15: - version "1.1.15" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" - integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== - dependencies: - which-typed-array "^1.1.16" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-weakmap@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz" - integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== - -is-weakref@^1.0.2, is-weakref@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz" - integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== - dependencies: - call-bound "^1.0.3" - -is-weakset@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz" - integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== - dependencies: - call-bound "^1.0.3" - get-intrinsic "^1.2.6" - -is-what@^3.14.1: - version "3.14.1" - resolved "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz" - integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== - -is-whitespace@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/is-whitespace/-/is-whitespace-0.3.0.tgz" - integrity sha512-RydPhl4S6JwAyj0JJjshWJEFG6hNye3pZFBRZaTUfZFwGHxzppNaNOVgQuS/E/SlhrApuMXrpnK1EEIXfdo3Dg== - -is-windows@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isarray@~0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -ismobilejs@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz" - integrity sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isomorphic-fetch@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz" - integrity sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA== - dependencies: - node-fetch "^1.0.1" - whatwg-fetch ">=0.10.0" - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" - integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" - integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" - integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^4.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.7" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" - integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jackspeak@^3.1.2: - version "3.4.3" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" - integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -javascript-stringify@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/javascript-stringify/-/javascript-stringify-2.1.0.tgz" - integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== - -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^27.0.0, jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" - integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-regex-util@^28.0.0: - version "28.0.2" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer-vue@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/jest-serializer-vue/-/jest-serializer-vue-2.0.2.tgz" - integrity sha512-nK/YIFo6qe3i9Ge+hr3h4PpRehuPPGZFt8LDBdTHYldMb7ZWlkanZS8Ls7D8h6qmQP2lBQVDLP0DKn5bJ9QApQ== - dependencies: - pretty "2.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-transform-stub@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/jest-transform-stub/-/jest-transform-stub-2.0.0.tgz" - integrity sha512-lspHaCRx/mBbnm3h4uMMS3R5aZzMwyNpNIJLXj4cEsV0mIUtS4IjYJLSoyjRCtnxb6RIGJ4NL2quZzfIeNhbkg== - -jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-watch-typeahead@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz" - integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== - dependencies: - ansi-escapes "^4.3.1" - chalk "^4.0.0" - jest-regex-util "^28.0.0" - jest-watcher "^28.0.0" - slash "^4.0.0" - string-length "^5.0.1" - strip-ansi "^7.0.1" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-watcher@^28.0.0: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== - dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" - string-length "^4.0.1" - -jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^28.0.2: - version "28.1.3" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.1.0: - version "27.5.1" - resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz" - integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== - dependencies: - "@jest/core" "^27.5.1" - import-local "^3.0.2" - jest-cli "^27.5.1" - -joi@^17.4.0: - version "17.13.3" - resolved "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz" - integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== - dependencies: - "@hapi/hoek" "^9.3.0" - "@hapi/topo" "^5.1.0" - "@sideway/address" "^4.1.5" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -js-beautify@^1.6.12: - version "1.15.4" - resolved "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.4.tgz" - integrity sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA== - dependencies: - config-chain "^1.1.13" - editorconfig "^1.0.4" - glob "^10.4.2" - js-cookie "^3.0.5" - nopt "^7.2.1" - -js-cookie@^3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz" - integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== - -js-message@1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz" - integrity sha512-efJLHhLjIyKRewNS9EGZ4UpI8NguuL6fKkhRxVuMmrGV2xN/0APGdQYwLFky5w9naebSZ0OwAGp0G6/2Cg90rA== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsdom@^16.6.0: - version "16.7.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" - integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.6" - xml-name-validator "^3.0.0" - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -jsesc@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json2module@^0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/json2module/-/json2module-0.0.3.tgz" - integrity sha512-qYGxqrRrt4GbB8IEOy1jJGypkNsjWoIMlZt4bAsmUScCA507Hbc2p1JOhBzqn45u3PWafUgH2OnzyNU7udO/GA== - dependencies: - rw "^1.3.2" - -json2mq@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz" - integrity sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== - dependencies: - string-convert "^0.2.0" - -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" - integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw== - -json5@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2, json5@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonparse@^1.2.0: - version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" - integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== - -JSONStream@^1.0.4: - version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klinecharts@^9.8.0: - version "9.8.0" - resolved "https://registry.npmjs.org/klinecharts/-/klinecharts-9.8.0.tgz" - integrity sha512-3UAxDNU11H4RqAHeFCfNrAeJZMI/mBb0vUiJja3xTel074oSNB7o3J28Ex4CdMQp+6yqOzZ0nHsHKQgqOEXMnw== - -klona@^2.0.5: - version "2.0.6" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -known-css-properties@^0.26.0: - version "0.26.0" - resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz" - integrity sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg== - -known-css-properties@^0.36.0: - version "0.36.0" - resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.36.0.tgz" - integrity sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA== - -launch-editor-middleware@^2.2.1: - version "2.11.1" - resolved "https://registry.npmjs.org/launch-editor-middleware/-/launch-editor-middleware-2.11.1.tgz" - integrity sha512-6xpn4pJz5mDg2kUH7L6gK5BuZcZPdVwoSs/DhfebefwLyszNXqFFjksGup/w4CTRzzrr8FSEufDzb/gKFLle6w== - dependencies: - launch-editor "^2.11.1" - -launch-editor@^2.11.1, launch-editor@^2.2.1, launch-editor@^2.6.0: - version "2.11.1" - resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.11.1.tgz" - integrity sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg== - dependencies: - picocolors "^1.1.1" - shell-quote "^1.8.3" - -lazy-cache@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" - integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== - -less-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz" - integrity sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg== - dependencies: - clone "^2.1.1" - loader-utils "^1.1.0" - pify "^4.0.1" - -less@^3.13.1: - version "3.13.1" - resolved "https://registry.npmjs.org/less/-/less-3.13.1.tgz" - integrity sha512-SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw== - dependencies: - copy-anything "^2.0.1" - tslib "^1.10.0" - optionalDependencies: - errno "^0.1.1" - graceful-fs "^4.1.2" - image-size "~0.5.0" - make-dir "^2.1.0" - mime "^1.4.1" - native-request "^1.0.5" - source-map "~0.6.0" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lightweight-charts@^5.0.8: - version "5.0.8" - resolved "https://registry.npmjs.org/lightweight-charts/-/lightweight-charts-5.0.8.tgz" - integrity sha512-dNBK5TlNcG78RUnxYRAZP4XpY5bkp3EE0PPjFFPkdIZ8RvnvL2JLgTb1BLh40trHhgJl51b1bCz8678GpnKvIw== - dependencies: - fancy-canvas "2.1.0" - -lilconfig@^2.0.3: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lilconfig@2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz" - integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lint-staged@^12.5.0: - version "12.5.0" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-12.5.0.tgz" - integrity sha512-BKLUjWDsKquV/JuIcoQW4MSAI3ggwEImF1+sB4zaKvyVx1wBk3FsG7UK9bpnmBTN1pm7EH2BBcMwINJzCRv12g== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.16" - commander "^9.3.0" - debug "^4.3.4" - execa "^5.1.1" - lilconfig "2.0.5" - listr2 "^4.0.5" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-inspect "^1.12.2" - pidtree "^0.5.0" - string-argv "^0.3.1" - supports-color "^9.2.2" - yaml "^1.10.2" - -listr2@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz" - integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.5" - through "^2.3.8" - wrap-ansi "^7.0.0" - -loader-runner@^4.1.0, loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^1.0.2: - version "1.4.2" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^1.1.0: - version "1.4.2" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^1.2.3: - version "1.4.2" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz" - integrity sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^1.0.1" - -loader-utils@^2.0.0, loader-utils@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" - integrity sha512-gkD9aSEG9UGglyPcDJqY9YBTUtCLKaBK6ihD2VP1d1X60lTfFspNZNulGBBbUZLkPygy4LySYHyxBpq+VhjObQ== - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" - integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.defaultsdeep@^4.6.1: - version "4.6.1" - resolved "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz" - integrity sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA== - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.kebabcase@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" - integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== - -lodash.map@^4.5.1: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" - integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== - -lodash.mapvalues@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz" - integrity sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz" - integrity sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.7.0, lodash@4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz" - integrity sha512-vlP11XfFGyeNQlmEn9tJ66rEW1coA/79m5z6BCkudjbAGE83uhAcGYrBFwfs3AdLiLzGRusRPAbSPK9xZteCmg== - dependencies: - ansi-escapes "^3.0.0" - cli-cursor "^2.0.0" - wrap-ansi "^3.0.1" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -longest@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" - integrity sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg== - -longest@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz" - integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== - -loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^10.2.0: - version "10.4.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" - integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^4.1.2: - version "4.1.5" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -magic-string@^0.30.17: - version "0.30.17" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" - integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-dir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" - integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== - dependencies: - semver "^7.5.3" - -makeerror@1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" - integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== - dependencies: - tmpl "1.0.5" - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -math-intrinsics@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" - integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== - -mathml-tag-names@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz" - integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== - -md5@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" - integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - -mdn-data@^2.21.0: - version "2.23.0" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.23.0.tgz" - integrity sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - -mdn-data@2.12.2: - version "2.12.2" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz" - integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" - -meow@^8.0.0: - version "8.1.2" - resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz" - integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-descriptors@1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" - integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== - -merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz" - integrity sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw== - dependencies: - source-map "^0.6.1" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz" - integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@^2.1.35, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@^1.4.1, mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-css-extract-plugin@^2.5.3: - version "2.9.4" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz" - integrity sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ== - dependencies: - schema-utils "^4.0.0" - tapable "^2.2.1" - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^9.0.4: - version "9.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" - integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== - dependencies: - brace-expansion "^2.0.1" - -minimatch@9.0.1: - version "9.0.1" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz" - integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w== - dependencies: - brace-expansion "^2.0.1" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@~1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minimist@1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minipass@^3.1.1: - version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - -mkdirp@~0.5.1: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mock-property@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/mock-property/-/mock-property-1.0.3.tgz" - integrity sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ== - dependencies: - define-data-property "^1.1.1" - functions-have-names "^1.2.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - hasown "^2.0.0" - isarray "^2.0.5" - -mockjs2@1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/mockjs2/-/mockjs2-1.0.8.tgz" - integrity sha512-IXY9wzq3Pr2tybkJnT+dzrTz0GBRTtgXc7Cke/UUQyyWtbjDrck8uZ3NmMF4LaWgAD8vm8EMGcBk4Itc6nzpRg== - dependencies: - commander "*" - -module-alias@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz" - integrity sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q== - -moment@^2.21.0, moment@^2.29.2: - version "2.30.1" - resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" - integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== - -mrmime@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz" - integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== - -ms@^2.1.1, ms@^2.1.3, ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -mutationobserver-shim@^0.3.2: - version "0.3.7" - resolved "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz" - integrity sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.11: - version "3.3.11" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -nanopop@^2.1.0: - version "2.4.2" - resolved "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz" - integrity sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw== - -native-request@^1.0.5: - version "1.1.2" - resolved "https://registry.npmjs.org/native-request/-/native-request-1.1.2.tgz" - integrity sha512-/etjwrK0J4Ebbcnt35VMWnfiUX/B04uwGJxyJInagxDqf2z5drSt/lsOvEMWGYunz1kaLZAFrV4NDAbOoDKvAQ== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch@^1.0.1: - version "1.7.3" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz" - integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== - dependencies: - encoding "^0.1.11" - is-stream "^1.0.1" - -node-fetch@^2.6.7: - version "2.7.0" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" - integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" - integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== - -node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== - -nopt@^7.2.1: - version "7.2.1" - resolved "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz" - integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== - dependencies: - abbrev "^2.0.0" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz" - integrity sha512-7WyT0w8jhpDStXRq5836AMmihQwq2nrUVQrgjvUo/p/NZf9uy/MeJ246lBJVmWuYXMlJuG9BNZHF0hWjfTbQUA== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -nth-check@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -nwsapi@^2.2.0: - version "2.2.21" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.21.tgz" - integrity sha512-o6nIY3qwiSXl7/LuOU0Dmuctd34Yay0yeuZRLFmDPrrdHpXKFndPj3hM+YEPVHYC5fx2otBx4Ilc/gyYSAUaIA== - -object-assign@^4.0.1, object-assign@^4.1.1, object-assign@4.x: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.12.2, object-inspect@^1.13.3, object-inspect@^1.13.4: - version "1.13.4" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz" - integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== - -object-inspect@~1.12.3: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-is@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz" - integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0, object.assign@^4.1.7: - version "4.1.7" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz" - integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - has-symbols "^1.1.0" - object-keys "^1.1.1" - -object.fromentries@^2.0.8: - version "2.0.8" - resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" - integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - -object.getownpropertydescriptors@^2.1.0: - version "2.1.8" - resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.8.tgz" - integrity sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A== - dependencies: - array.prototype.reduce "^1.0.6" - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - es-object-atoms "^1.0.0" - gopd "^1.0.1" - safe-array-concat "^1.1.2" - -object.groupby@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" - integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-abstract "^1.23.2" - -object.values@^1.1.0, object.values@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz" - integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.3" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -omit.js@^1.0.0, omit.js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/omit.js/-/omit.js-1.0.2.tgz" - integrity sha512-/QPc6G2NS+8d4L/cQhbk6Yit1WTB6Us2g84A7A/1+w9d/eRGHyEqC5kkQtHVoHZ5NFWGG7tUGgrhVZwgZanKrQ== - dependencies: - babel-runtime "^6.23.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz" - integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz" - integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== - dependencies: - mimic-fn "^1.0.0" - -onetime@^5.1.0, onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.2, open@^8.0.9: - version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -optionator@^0.9.1: - version "0.9.4" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" - integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.5" - -ora@^5.3.0, ora@^5.4.1: - version "5.4.1" - resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -own-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz" - integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== - dependencies: - get-intrinsic "^1.2.6" - object-keys "^1.1.1" - safe-push-apply "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json-from-dist@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" - integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parchment@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz" - integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg== - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-json@^5.0.0, parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" - integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== - -parse-svg-path@~0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz" - integrity sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ== - -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.11.1: - version "1.11.1" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" - integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== - dependencies: - lru-cache "^10.2.0" - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" - -path-to-regexp@0.1.12: - version "0.1.12" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picocolors@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" - integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== - -picocolors@^1.0.0, picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pidtree@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz" - integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.4: - version "4.0.7" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - -pkg-dir@^4.1.0, pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -point-at-length@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/point-at-length/-/point-at-length-1.0.2.tgz" - integrity sha512-DSGca2Q7A/4rGS6324Z+0hCVAPT729RFjsISPc6N11D6+r1TpP6KjktGL7HxN8XRYY0Z7EG8n9dBJ5dbrEP4SQ== - dependencies: - abs-svg-path "~0.1.1" - isarray "~0.0.1" - parse-svg-path "~0.1.1" - -portfinder@^1.0.26: - version "1.0.37" - resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.37.tgz" - integrity sha512-yuGIEjDAYnnOex9ddMnKZEMFE0CcGo6zbfzDklkmT1m5z734ss6JMzN9rNB3+RR7iS+F10D4/BVIaXOyh8PQKw== - dependencies: - async "^3.2.6" - debug "^4.3.6" - -possible-typed-array-names@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz" - integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-less@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/postcss-less/-/postcss-less-6.0.0.tgz" - integrity sha512-FPX16mQLyEjLzEuuJtxA8X3ejDLNGGEG503d2YGZR5Ask1SpDN8KmZUMpzCvyalWRywAn1n1VOA5dcqfCLo5rg== - -postcss-loader@^6.1.1: - version "6.2.1" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" - integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== - dependencies: - cosmiconfig "^7.0.0" - klona "^2.0.5" - semver "^7.3.5" - -postcss-media-query-parser@^0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz" - integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz" - integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== - -postcss-modules-local-by-default@^4.0.5: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz" - integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^7.0.0" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz" - integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== - dependencies: - postcss-selector-parser "^7.0.0" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-resolve-nested-selector@^0.1.1, postcss-resolve-nested-selector@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz" - integrity sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw== - -postcss-safe-parser@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz" - integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== - -postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.1.2" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^7.0.0: - version "7.1.0" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-sorting@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-7.0.1.tgz" - integrity sha512-iLBFYz6VRYyLJEJsBJ8M3TCqNcckVzz4wFounSc5Oez35ogE/X+aoC5fFu103Ot7NyvjU3/xqIXn93Gp3kJk4g== - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^7.0.36: - version "7.0.39" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" - integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== - dependencies: - picocolors "^0.2.1" - source-map "^0.6.1" - -postcss@^8.2.6, postcss@^8.3.11, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.19, postcss@^8.4.33, postcss@^8.5.6: - version "8.5.6" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -"prettier@^1.18.2 || ^2.0.0": - version "2.8.8" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-format@^27.0.0, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== - dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty@^2.0.0, pretty@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/pretty/-/pretty-2.0.0.tgz" - integrity sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w== - dependencies: - condense-newlines "^0.2.1" - extend-shallow "^2.0.1" - js-beautify "^1.6.12" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -progress-webpack-plugin@^1.0.12: - version "1.0.16" - resolved "https://registry.npmjs.org/progress-webpack-plugin/-/progress-webpack-plugin-1.0.16.tgz" - integrity sha512-sdiHuuKOzELcBANHfrupYo+r99iPRyOnw15qX+rNlVUqXGfjXdH4IgxriKwG1kNJwVswKQHMdj1hYZMcb9jFaA== - dependencies: - chalk "^2.1.0" - figures "^2.0.0" - log-update "^2.3.0" - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -prompts@^2.0.1: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" - integrity sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA== - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -psl@^1.1.33: - version "1.15.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz" - integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== - dependencies: - punycode "^2.3.1" - -pump@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz" - integrity sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -q@^1.1.2, q@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" - integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== - -qs@^6.9.1: - version "6.14.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz" - integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== - dependencies: - side-channel "^1.1.0" - -qs@6.13.0: - version "6.13.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== - dependencies: - side-channel "^1.0.6" - -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -quill-delta@^3.6.2: - version "3.6.3" - resolved "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz" - integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg== - dependencies: - deep-equal "^1.0.1" - extend "^3.0.2" - fast-diff "1.1.2" - -quill@^1.3.4: - version "1.3.7" - resolved "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz" - integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g== - dependencies: - clone "^2.1.1" - deep-equal "^1.0.1" - eventemitter3 "^2.0.3" - extend "^3.0.2" - parchment "^1.1.4" - quill-delta "^3.6.2" - -raf@^3.4.0: - version "3.4.1" - resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" - integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== - dependencies: - performance-now "^2.1.0" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.0.0: - version "18.3.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" - integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.1.1, read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@3: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: - version "1.0.10" - resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz" - integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-abstract "^1.23.9" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - get-intrinsic "^1.2.7" - get-proto "^1.0.1" - which-builtin-type "^1.2.1" - -regenerate-unicode-properties@^10.2.0: - version "10.2.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz" - integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - -regenerator-runtime@^0.13.9: - version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.4: - version "1.5.4" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" - integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== - dependencies: - call-bind "^1.0.8" - define-properties "^1.2.1" - es-errors "^1.3.0" - get-proto "^1.0.1" - gopd "^1.2.0" - set-function-name "^2.0.2" - -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz" - integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.2.0" - regjsgen "^0.8.0" - regjsparser "^0.12.0" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -regjsgen@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" - integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== - -regjsparser@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" - integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== - dependencies: - jsesc "~3.0.2" - -regression@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz" - integrity sha512-A4XYsc37dsBaNOgEjkJKzfJlE394IMmUPlI/p3TTI9u3T+2a+eox5Pr/CPUqF0eszeWZJPAc6QkroAhuUpWDJQ== - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resize-observer-lite@^0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/resize-observer-lite/-/resize-observer-lite-0.2.3.tgz" - integrity sha512-k/p+pjCTQkQ7x94bWsxcVwEJI5SrcO95j7czrCKMpHjXFQ+HmKRGLTdAkZoL3+wG1Pe/4L9Sl652zy9lU54dFg== - dependencies: - element-resize-detector "1.1.13" - -resize-observer-polyfill@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" - integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0, resolve-from@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-global@^1.0.0, resolve-global@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz" - integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== - dependencies: - global-dirs "^0.1.1" - -resolve.exports@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz" - integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== - -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.20.0, resolve@^1.22.10, resolve@^1.22.4, resolve@^1.8.1, resolve@~1.22.6: - version "1.22.10" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" - integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rfdc@^1.3.0: - version "1.4.1" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" - integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== - -right-align@^0.1.1: - version "0.1.3" - resolved "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz" - integrity sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg== - dependencies: - align-text "^0.1.1" - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rollup@^0.25.8: - version "0.25.8" - resolved "https://registry.npmjs.org/rollup/-/rollup-0.25.8.tgz" - integrity sha512-a2S4Bh3bgrdO4BhKr2E4nZkjTvrJ2m2bWjMTzVYtoqSCn0HnuxosXnaJUHrMEziOWr3CzL9GjilQQKcyCQpJoA== - dependencies: - chalk "^1.1.1" - minimist "^1.2.0" - source-map-support "^0.3.2" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rw@^1.3.2, rw@1: - version "1.3.3" - resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - -rxjs@^7.5.5: - version "7.8.2" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz" - integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.1.2, safe-array-concat@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz" - integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - get-intrinsic "^1.2.6" - has-symbols "^1.1.0" - isarray "^2.0.5" - -safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-push-apply@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz" - integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== - dependencies: - es-errors "^1.3.0" - isarray "^2.0.5" - -safe-regex-test@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz" - integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - is-regex "^1.2.1" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@~1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.1: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0, schema-utils@^4.3.0, schema-utils@^4.3.2: - version "4.3.2" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz" - integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -select@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz" - integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== - -selfsigned@^2.1.1: - version "2.4.1" - resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== - dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" - -semver@^5.5.0: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^5.6.0: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.2.1: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -semver@^7.3.2: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -semver@^7.3.4: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -semver@^7.3.5, semver@^7.5.4: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -semver@^7.5.3: - version "7.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== - -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@7.3.5: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -send@0.19.0: - version "0.19.0" - resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz" - integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== - dependencies: - randombytes "^2.1.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== - dependencies: - encodeurl "~2.0.0" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" - -set-function-length@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -set-function-name@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz" - integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.2" - -set-proto@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz" - integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== - dependencies: - dunder-proto "^1.0.1" - es-errors "^1.3.0" - es-object-atoms "^1.0.0" - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallow-equal@^1.0.0: - version "1.2.1" - resolved "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz" - integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== - -shallowequal@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.8.3: - version "1.8.3" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz" - integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== - -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - -side-channel-map@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" - integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - -side-channel-weakmap@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" - integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== - dependencies: - call-bound "^1.0.2" - es-errors "^1.3.0" - get-intrinsic "^1.2.5" - object-inspect "^1.13.3" - side-channel-map "^1.0.1" - -side-channel@^1.0.6, side-channel@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== - dependencies: - es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" - side-channel-map "^1.0.1" - side-channel-weakmap "^1.0.2" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -simple-statistics@~6.1.0: - version "6.1.1" - resolved "https://registry.npmjs.org/simple-statistics/-/simple-statistics-6.1.1.tgz" - integrity sha512-zGwn0DDRa9Zel4H4n2pjTFIyGoAGpnpjrGIctreCxj5XWrcx9v7Xy7270FkC967WMmcvuc8ZU7m0ZG+hGN7gAA== - -sirv@^2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz" - integrity sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== - dependencies: - "@polka/url" "^1.0.0-next.24" - mrmime "^2.0.0" - totalist "^3.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -source-map-js@^1.0.1, source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -source-map-support@^0.3.2: - version "0.3.3" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.3.tgz" - integrity sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg== - dependencies: - source-map "0.1.32" - -source-map-support@^0.5.6, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.6" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz" - integrity sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ== - -source-map@~0.5.1: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@0.1.32: - version "0.1.32" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz" - integrity sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ== - dependencies: - amdefine ">=0.0.4" - -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.5.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" - integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.22" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz" - integrity sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -split2@^3.0.0: - version "3.2.2" - resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stack-utils@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stackframe@^1.3.4: - version "1.3.4" - resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" - integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -stop-iteration-iterator@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz" - integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== - dependencies: - es-errors "^1.3.0" - internal-slot "^1.1.0" - -store@^2.0.12: - version "2.0.12" - resolved "https://registry.npmjs.org/store/-/store-2.0.12.tgz" - integrity sha512-eO9xlzDpXLiMr9W1nQ3Nfp9EzZieIQc10zPPMP5jsVV7bLOziSFFBP0XoDXACEIFtdI+rIz0NwWVA/QVJ8zJtw== - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -string-argv@^0.3.1: - version "0.3.2" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" - integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== - -string-convert@^0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz" - integrity sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== - -string-length@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" - integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -string-length@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz" - integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== - dependencies: - char-regex "^2.0.0" - strip-ansi "^7.0.1" - -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.0: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.trim@^1.2.10, string.prototype.trim@~1.2.8: - version "1.2.10" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz" - integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-data-property "^1.1.4" - define-properties "^1.2.1" - es-abstract "^1.23.5" - es-object-atoms "^1.0.0" - has-property-descriptors "^1.0.2" - -string.prototype.trimend@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz" - integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== - dependencies: - call-bind "^1.0.8" - call-bound "^1.0.2" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -string.prototype.trimstart@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz" - integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== - dependencies: - call-bind "^1.0.7" - define-properties "^1.2.1" - es-object-atoms "^1.0.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0, strip-bom@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz" - integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -style-search@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz" - integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -stylelint-config-css-modules@^4.1.0: - version "4.5.1" - resolved "https://registry.npmjs.org/stylelint-config-css-modules/-/stylelint-config-css-modules-4.5.1.tgz" - integrity sha512-xRMvAOVWa8h3Dw2NmanJHuPqMUInmMoBy14kkJDT2xs2xevxl7WnQOe/nDAMvgf9NkodzKrhKZ97E61yQOKkDA== - optionalDependencies: - stylelint-scss "^6.12.1" - -stylelint-config-recess-order@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/stylelint-config-recess-order/-/stylelint-config-recess-order-3.1.0.tgz" - integrity sha512-LXR6zD5O9cS1a9gbLbuKvWLs7qmHj4xm5MQ5KhhwZPMhtQP9da3F6Jsp/NAUdsAwDQEnT1ShU16YVdgN6p4a/w== - dependencies: - stylelint-order "5.x" - -stylelint-config-recommended@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-7.0.0.tgz" - integrity sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q== - -stylelint-config-standard@^25.0.0: - version "25.0.0" - resolved "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-25.0.0.tgz" - integrity sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA== - dependencies: - stylelint-config-recommended "^7.0.0" - -stylelint-order@^5.0.0, stylelint-order@5.x: - version "5.0.0" - resolved "https://registry.npmjs.org/stylelint-order/-/stylelint-order-5.0.0.tgz" - integrity sha512-OWQ7pmicXufDw5BlRqzdz3fkGKJPgLyDwD1rFY3AIEfIH/LQY38Vu/85v8/up0I+VPiuGRwbc2Hg3zLAsJaiyw== - dependencies: - postcss "^8.3.11" - postcss-sorting "^7.0.1" - -stylelint-scss@^6.12.1: - version "6.12.1" - resolved "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.12.1.tgz" - integrity sha512-UJUfBFIvXfly8WKIgmqfmkGKPilKB4L5j38JfsDd+OCg2GBdU0vGUV08Uw82tsRZzd4TbsUURVVNGeOhJVF7pA== - dependencies: - css-tree "^3.0.1" - is-plain-object "^5.0.0" - known-css-properties "^0.36.0" - mdn-data "^2.21.0" - postcss-media-query-parser "^0.2.3" - postcss-resolve-nested-selector "^0.1.6" - postcss-selector-parser "^7.1.0" - postcss-value-parser "^4.2.0" - -stylelint@^14.8.5: - version "14.16.1" - resolved "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz" - integrity sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A== - dependencies: - "@csstools/selector-specificity" "^2.0.2" - balanced-match "^2.0.0" - colord "^2.9.3" - cosmiconfig "^7.1.0" - css-functions-list "^3.1.0" - debug "^4.3.4" - fast-glob "^3.2.12" - fastest-levenshtein "^1.0.16" - file-entry-cache "^6.0.1" - global-modules "^2.0.0" - globby "^11.1.0" - globjoin "^0.1.4" - html-tags "^3.2.0" - ignore "^5.2.1" - import-lazy "^4.0.0" - imurmurhash "^0.1.4" - is-plain-object "^5.0.0" - known-css-properties "^0.26.0" - mathml-tag-names "^2.1.3" - meow "^9.0.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.19" - postcss-media-query-parser "^0.2.3" - postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^6.0.0" - postcss-selector-parser "^6.0.11" - postcss-value-parser "^4.2.0" - resolve-from "^5.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - style-search "^0.1.0" - supports-hyperlinks "^2.3.0" - svg-tags "^1.0.0" - table "^6.8.1" - v8-compile-cache "^2.3.0" - write-file-atomic "^4.0.2" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^9.2.2: - version "9.4.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz" - integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== - -supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" - integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== - -svg-to-vue@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/svg-to-vue/-/svg-to-vue-0.7.0.tgz" - integrity sha512-Tg2nMmf3BQorYCAjxbtTkYyWPVSeox5AZUFvfy4MoWK/5tuQlnA/h3LAlTjV3sEvOC5FtUNovRSj3p784l4KOA== - dependencies: - svgo "^1.3.2" - -svgo@^1.3.2: - version "1.3.2" - resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== - dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" - stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" - -svgo@^2.7.0: - version "2.8.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -table@^6.0.9, table@^6.8.1: - version "6.9.0" - resolved "https://registry.npmjs.org/table/-/table-6.9.0.tgz" - integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: - version "2.2.2" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz" - integrity sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg== - -tape@^4.5.1: - version "4.17.0" - resolved "https://registry.npmjs.org/tape/-/tape-4.17.0.tgz" - integrity sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw== - dependencies: - "@ljharb/resumer" "~0.0.1" - "@ljharb/through" "~2.3.9" - call-bind "~1.0.2" - deep-equal "~1.1.1" - defined "~1.0.1" - dotignore "~0.1.2" - for-each "~0.3.3" - glob "~7.2.3" - has "~1.0.3" - inherits "~2.0.4" - is-regex "~1.1.4" - minimist "~1.2.8" - mock-property "~1.0.0" - object-inspect "~1.12.3" - resolve "~1.22.6" - string.prototype.trim "~1.2.8" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.3.11: - version "5.3.14" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== - dependencies: - "@jridgewell/trace-mapping" "^0.3.25" - jest-worker "^27.4.5" - schema-utils "^4.3.0" - serialize-javascript "^6.0.2" - terser "^5.31.1" - -terser@^5.10.0: - version "5.43.1" - resolved "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz" - integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.14.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -terser@^5.31.1: - version "5.43.1" - resolved "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz" - integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.14.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-extensions@^1.0.0: - version "1.9.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz" - integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -thread-loader@^3.0.0: - version "3.0.4" - resolved "https://registry.npmjs.org/thread-loader/-/thread-loader-3.0.4.tgz" - integrity sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA== - dependencies: - json-parse-better-errors "^1.0.2" - loader-runner "^4.1.0" - loader-utils "^2.0.0" - neo-async "^2.6.2" - schema-utils "^3.0.0" - -throat@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz" - integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== - -through@^2.3.6, through@^2.3.8, "through@>=2.2.7 <3": - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tiny-emitter@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz" - integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== - -tinycolor2@^1.4.1: - version "1.6.0" - resolved "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz" - integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmpl@1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toggle-selection@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" - integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -topojson-client@~3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/topojson-client/-/topojson-client-3.0.1.tgz" - integrity sha512-rfGGzyqefpxOaxvV9OTF9t+1g+WhjGEbAIuCcmKYrQkxr0nttjMMyzZsK+NhLW4cTl2g1bz2jQczPUtEshpbVQ== - dependencies: - commander "2" - -totalist@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" - integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== - -tough-cookie@^4.0.0: - version "4.1.4" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" - integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.2.0" - url-parse "^1.5.3" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -tsconfig-paths@^3.15.0: - version "3.15.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" - integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.10.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.1.0, tslib@2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz" - integrity sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typed-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz" - integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== - dependencies: - call-bound "^1.0.3" - es-errors "^1.3.0" - is-typed-array "^1.1.14" - -typed-array-byte-length@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz" - integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== - dependencies: - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.14" - -typed-array-byte-offset@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz" - integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - for-each "^0.3.3" - gopd "^1.2.0" - has-proto "^1.2.0" - is-typed-array "^1.1.15" - reflect.getprototypeof "^1.0.9" - -typed-array-length@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz" - integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== - dependencies: - call-bind "^1.0.7" - for-each "^0.3.3" - gopd "^1.0.1" - is-typed-array "^1.1.13" - possible-typed-array-names "^1.0.0" - reflect.getprototypeof "^1.0.6" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -uglify-js@^2.6.2: - version "2.8.29" - resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz" - integrity sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w== - dependencies: - source-map "~0.5.1" - yargs "~3.10.0" - optionalDependencies: - uglify-to-browserify "~1.0.0" - -uglify-to-browserify@~1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" - integrity sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q== - -umi-request@^1.2.11: - version "1.4.0" - resolved "https://registry.npmjs.org/umi-request/-/umi-request-1.4.0.tgz" - integrity sha512-OknwtQZddZHi0Ggi+Vr/olJ7HNMx4AzlywyK0W3NZBT7B0stjeZ9lcztA85dBgdAj3KVk8uPJPZSnGaDjELhrA== - dependencies: - isomorphic-fetch "^2.2.1" - qs "^6.9.1" - -unbox-primitive@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz" - integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== - dependencies: - call-bound "^1.0.3" - has-bigints "^1.0.2" - has-symbols "^1.1.0" - which-boxed-primitive "^1.1.1" - -undici-types@~7.10.0: - version "7.10.0" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz" - integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz" - integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz" - integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -universalify@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" - integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== - -universalify@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" - integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== - -unpipe@~1.0.0, unpipe@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz" - integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== - -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse@^1.5.3: - version "1.5.10" - resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" - integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util.promisify@~1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.2" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: - version "2.4.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz" - integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== - -v8-to-istanbul@^8.1.0: - version "8.1.1" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" - integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -venn.js@~0.2.20: - version "0.2.20" - resolved "https://registry.npmjs.org/venn.js/-/venn.js-0.2.20.tgz" - integrity sha512-bb5SYq/wamY9fvcuErb9a0FJkgIFHJjkLZWonQ+DoKKuDX3WPH2B4ouI1ce4K2iejBklQy6r1ly8nOGIyOCO6w== - dependencies: - d3-selection "^1.0.2" - d3-transition "^1.0.1" - fmin "0.0.2" - -viser-vue@^2.4.8: - version "2.4.8" - resolved "https://registry.npmjs.org/viser-vue/-/viser-vue-2.4.8.tgz" - integrity sha512-ERAREN+6k/ywrwT+swcMo4CDIAq6dBjnB0+lhmsSfaip06BGHSBfNKg6yl7/4GJ9Nk2kioUw3llNhEboJuIKmQ== - dependencies: - "@types/node" "*" - viser "^2.0.0" - vue "^2.5.3" - -viser@^2.0.0: - version "2.4.9" - resolved "https://registry.npmjs.org/viser/-/viser-2.4.9.tgz" - integrity sha512-DKsqtMa3TZYQHEZ7jp4kpNp1Iqomda7d+3IkkIjIdKQvfL8OeksXfy/ECZUY1hTrGoOe7cq85+6PMS+MPn4mgQ== - dependencies: - "@antv/g2" "~3.5.3" - "@antv/g2-brush" "^0.0.2" - "@antv/g2-plugin-slider" "^2.1.0" - "@types/d3-format" "*" - "@types/lodash" "*" - "@types/node" "^8.0.53" - d3-format "^1.3.0" - lodash "^4.17.4" - -vue-clipboard2@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/vue-clipboard2/-/vue-clipboard2-0.2.1.tgz" - integrity sha512-n6ie/0g0bKohmLlC/5ja1esq2Q0jQ5hWmhNSZcvCsWfDeDnVARjl6cBB9p72XV1nlVfuqsZcfV8HTjjZAIlLBA== - dependencies: - clipboard "^2.0.0" - -vue-container-query@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/vue-container-query/-/vue-container-query-0.1.0.tgz" - integrity sha512-WPXn/x1xE5NoCJIHDL919ELln6ZUpsJJBgxuR5tJWfvfxy6zT4Tm4iOhaVmSomtdPzdo9edeMrPXl4e/9MUhfA== - dependencies: - container-query-toolkit "^0.1.3" - resize-observer-lite "^0.2.3" - vue "^2.5.17" - -vue-copy-to-clipboard@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/vue-copy-to-clipboard/-/vue-copy-to-clipboard-1.0.3.tgz" - integrity sha512-FSgewqG+2NwNsAnKOZqZ6GZqNvrbauVh/Y5z+xkbu9AmFqiWlQLKaFc+7BcsYCVZ2TaQnhjcHbDycVRVGFJypQ== - dependencies: - copy-to-clipboard "^3.3.1" - -vue-cropper@0.4.9: - version "0.4.9" - resolved "https://registry.npmjs.org/vue-cropper/-/vue-cropper-0.4.9.tgz" - integrity sha512-Uf1i/sCh+ZqSM9hb2YTGRENzJFH+mvDuv8N2brGLjK7UBuF7XDP7zbis8g/dcqZiMojAcBDtObFCn4ERFbRMxQ== - -vue-eslint-parser@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz" - integrity sha512-JlHVZwBBTNVvzmifwjpZYn0oPWH2SgWv5dojlZBsrhablDu95VFD+hriB1rQGwbD+bms6g+rAFhQHk6+NyiS6g== - dependencies: - debug "^4.1.0" - eslint-scope "^4.0.0" - eslint-visitor-keys "^1.0.0" - espree "^4.1.0" - esquery "^1.0.1" - lodash "^4.17.11" - -vue-hot-reload-api@^2.3.0: - version "2.3.4" - resolved "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz" - integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== - -vue-i18n@^8.27.1: - version "8.28.2" - resolved "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.28.2.tgz" - integrity sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA== - -vue-loader@^17.0.0: - version "17.4.2" - resolved "https://registry.npmjs.org/vue-loader/-/vue-loader-17.4.2.tgz" - integrity sha512-yTKOA4R/VN4jqjw4y5HrynFL8AK0Z3/Jt7eOJXEitsm0GMRHDBjCfCiuTiLP7OESvsZYo2pATCWhDqxC5ZrM6w== - dependencies: - chalk "^4.1.0" - hash-sum "^2.0.0" - watchpack "^2.4.0" - -vue-quill-editor@^3.0.6: - version "3.0.6" - resolved "https://registry.npmjs.org/vue-quill-editor/-/vue-quill-editor-3.0.6.tgz" - integrity sha512-g20oSZNWg8Hbu41Kinjd55e235qVWPLfg4NvsLW6d+DhgBTFbEuMpcWlUdrD6qT3+Noim6DRu18VLM9lVShXOQ== - dependencies: - object-assign "^4.1.1" - quill "^1.3.4" - -vue-ref@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/vue-ref/-/vue-ref-2.0.0.tgz" - integrity sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ== - -vue-router@^3.5.3: - version "3.6.5" - resolved "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz" - integrity sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ== - -vue-style-loader@^4.1.0, vue-style-loader@^4.1.3: - version "4.1.3" - resolved "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz" - integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== - dependencies: - hash-sum "^1.0.2" - loader-utils "^1.0.2" - -vue-svg-component-builder@2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/vue-svg-component-builder/-/vue-svg-component-builder-2.0.3.tgz" - integrity sha512-We9ZLSYPQx9y3v5+HNWyjkGFaxZMlWPTqYBU08y4YT46f453BQ4JxIoS8rV0a8PIxnKap7m/YIzrdIfoHxrpaA== - -vue-svg-component-runtime@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/vue-svg-component-runtime/-/vue-svg-component-runtime-1.0.1.tgz" - integrity sha512-TkmZ1qwFeFJSRH6b6KVqDU2f8DCSdoNoo/veKqog7FsyF0UETTI66ALKX1rrLXy/KT6LSaJB5IfZkuuSfaQsEA== - -vue-svg-icon-loader@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/vue-svg-icon-loader/-/vue-svg-icon-loader-2.1.1.tgz" - integrity sha512-JOL4fyh9rnbcqMLTF5NVG8YVupnLIMHMY+3CLMaEb9xDUmfk6Cp3RqyI/8gBea7d51i4lyNdzZ3tQ/EJLQxQDA== - dependencies: - "@types/loader-utils" "1.1.3" - "@types/node" "8.9" - loader-utils "1.1.0" - vue-svg-component-builder "2.0.3" - -vue-svg-loader@0.16.0: - version "0.16.0" - resolved "https://registry.npmjs.org/vue-svg-loader/-/vue-svg-loader-0.16.0.tgz" - integrity sha512-2RtFXlTCYWm8YAEO2qAOZ2SuIF2NvLutB5muc3KDYoZq5ZeCHf8ggzSan3ksbbca7CJ/Aw57ZnDF4B7W/AkGtw== - dependencies: - loader-utils "^1.2.3" - svg-to-vue "^0.7.0" - -vue-template-compiler@^2.6.14: - version "2.7.16" - resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz" - integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ== - dependencies: - de-indent "^1.0.2" - he "^1.2.0" - -vue-template-es2015-compiler@^1.9.0: - version "1.9.1" - resolved "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz" - integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== - -vue@^2.5.17, vue@^2.5.3, vue@^2.6.14: - version "2.7.16" - resolved "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz" - integrity sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw== - dependencies: - "@vue/compiler-sfc" "2.7.16" - csstype "^3.1.0" - -vuex@^3.6.2: - version "3.6.2" - resolved "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz" - integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walker@^1.0.7: - version "1.0.8" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" - integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== - dependencies: - makeerror "1.0.12" - -wangeditor@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/wangeditor/-/wangeditor-3.1.1.tgz" - integrity sha512-co18zRS96xVKhLyhTIqgqWs5khSbNPlZeoT8/B2dxnVKQMntRGu1D8ks+nbNOvZcIjyrdhhtde6LjqzVECL6DA== - -warning@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz" - integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== - dependencies: - loose-envify "^1.0.0" - -watchpack@^2.4.0, watchpack@^2.4.1: - version "2.4.4" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz" - integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" - integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-bundle-analyzer@^4.4.0: - version "4.10.2" - resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz" - integrity sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - commander "^7.2.0" - debounce "^1.2.1" - escape-string-regexp "^4.0.0" - gzip-size "^6.0.0" - html-escaper "^2.0.2" - opener "^1.5.2" - picocolors "^1.0.0" - sirv "^2.0.3" - ws "^7.3.1" - -webpack-chain@^6.5.1: - version "6.5.1" - resolved "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz" - integrity sha512-7doO/SRtLu8q5WM0s7vPKPWX580qhi0/yBHkOxNkv50f6qB76Zy9o2wRTrrPULqYTvQlVHuvbA8v+G5ayuUDsA== - dependencies: - deepmerge "^1.5.2" - javascript-stringify "^2.0.1" - -webpack-dev-middleware@^5.3.4: - version "5.3.4" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz" - integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.7.3: - version "4.15.2" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz" - integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.4" - ws "^8.13.0" - -webpack-merge@^5.7.3: - version "5.10.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz" - integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== - dependencies: - clone-deep "^4.0.1" - flat "^5.0.2" - wildcard "^2.0.0" - -webpack-sources@^3.3.3: - version "3.3.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz" - integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== - -webpack-theme-color-replacer@^1.3.26: - version "1.5.5" - resolved "https://registry.npmjs.org/webpack-theme-color-replacer/-/webpack-theme-color-replacer-1.5.5.tgz" - integrity sha512-5EapffOpDhnUj9btCN+q9KnGQXPf8PGrDkgA8OE7P7fFvUT0ZIhcj/cwvp3XUjjOnNes3vmfKyyq2195F8s5mw== - -webpack-virtual-modules@^0.4.2: - version "0.4.6" - resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz" - integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== - -webpack@^5: - version "5.101.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz" - integrity sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.8" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" - acorn-import-phases "^1.0.3" - browserslist "^4.24.0" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.2" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.3.3" - -webpack@^5.54.0: - version "5.101.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz" - integrity sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ== - dependencies: - "@types/eslint-scope" "^3.7.7" - "@types/estree" "^1.0.8" - "@types/json-schema" "^7.0.15" - "@webassemblyjs/ast" "^1.14.1" - "@webassemblyjs/wasm-edit" "^1.14.1" - "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" - acorn-import-phases "^1.0.3" - browserslist "^4.24.0" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.2" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.3.3" - -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: - version "0.7.4" - resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-fetch@^3.6.2, whatwg-fetch@>=0.10.0: - version "3.6.20" - resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz" - integrity sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg== - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.7.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" - integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz" - integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== - dependencies: - is-bigint "^1.1.0" - is-boolean-object "^1.2.1" - is-number-object "^1.1.1" - is-string "^1.1.1" - is-symbol "^1.1.1" - -which-builtin-type@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz" - integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== - dependencies: - call-bound "^1.0.2" - function.prototype.name "^1.1.6" - has-tostringtag "^1.0.2" - is-async-function "^2.0.0" - is-date-object "^1.1.0" - is-finalizationregistry "^1.1.0" - is-generator-function "^1.0.10" - is-regex "^1.2.1" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.1.0" - which-collection "^1.0.2" - which-typed-array "^1.1.16" - -which-collection@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz" - integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== - dependencies: - is-map "^2.0.3" - is-set "^2.0.3" - is-weakmap "^2.0.2" - is-weakset "^2.0.3" - -which-typed-array@^1.1.16, which-typed-array@^1.1.19: - version "1.1.19" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz" - integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== - dependencies: - available-typed-arrays "^1.0.7" - call-bind "^1.0.8" - call-bound "^1.0.4" - for-each "^0.3.5" - get-proto "^1.0.1" - gopd "^1.2.0" - has-tostringtag "^1.0.2" - -which@^1.2.14: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -window-size@0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" - integrity sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg== - -wolfy87-eventemitter@~5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/wolfy87-eventemitter/-/wolfy87-eventemitter-5.1.0.tgz" - integrity sha512-VakY4+17DbamV2VW4nZERrSuilclCRcYtfchPWe6jlma8k0AeLJxBR+C5OSFFtICArDFdXk0yw67HUGrTCdrEg== - -word-wrap@^1.0.3, word-wrap@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" - integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== - -wordwrap@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" - integrity sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q== - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz" - integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -ws@^7.3.1, ws@^7.4.6: - version "7.5.10" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -ws@^8.13.0: - version "8.18.3" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^16.0.0, yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@~3.10.0: - version "3.10.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" - integrity sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A== - dependencies: - camelcase "^1.0.2" - cliui "^2.1.0" - decamelize "^1.0.0" - window-size "0.1.0" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yorkie@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yorkie/-/yorkie-2.0.0.tgz" - integrity sha512-jcKpkthap6x63MB4TxwCyuIGkV0oYP/YRyuQU5UO0Yz/E/ZAu+653/uov+phdmO54n6BcvFRyyt0RRrWdN2mpw== - dependencies: - execa "^0.8.0" - is-ci "^1.0.10" - normalize-path "^1.0.0" - strip-indent "^2.0.0" - -zrender@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz" - integrity sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg== - dependencies: - tslib "2.3.0"
    -
    - - {{ description }} - -
    -
    - - {{ owner }} ๅ‘ๅธƒๅœจ {{ href }} - {{ updateAt | moment }} -
    -